Skip to content
Snippets Groups Projects
Commit 96b51183 authored by Jason Hiser's avatar Jason Hiser :tractor:
Browse files

in progress

parent dfc7b30e
No related branches found
No related tags found
No related merge requests found
Pipeline #23266 failed
...@@ -54,20 +54,20 @@ bool split_arm_eh_frame_impl_t<ptrsize>::parse(const bool is_be) ...@@ -54,20 +54,20 @@ bool split_arm_eh_frame_impl_t<ptrsize>::parse(const bool is_be)
{ {
// fetch the first word of the lsda. // fetch the first word of the lsda.
throw_assert(extab_scoop->getStart() <= lsda_addr && lsda_addr <= extab_scoop->getEnd()); throw_assert(extab_scoop->getStart() <= lsda_addr && lsda_addr <= extab_scoop->getEnd());
cout << "Found out-of-line unwind info." << endl << hex; // cout << "Found out-of-line unwind info." << endl << hex;
unwind_pgm=parse_arm_eh_pgm(lsda_addr,extab_scoop.get(),fde, is_be); unwind_pgm=parse_arm_eh_pgm(lsda_addr,extab_scoop.get(),fde, is_be);
} }
if(contains_inline_unwind_entry ) if(contains_inline_unwind_entry )
{ {
cout << "Found inline_entry:" << endl << hex; // cout << "Found inline_entry:" << endl << hex;
unwind_pgm=parse_arm_eh_pgm(current_address+4,exidx_scoop.get(),fde, is_be); unwind_pgm=parse_arm_eh_pgm(current_address+4,exidx_scoop.get(),fde, is_be);
} }
cout << "\tFde ("<< fde.getStartAddress(); //cout << "\tFde ("<< fde.getStartAddress();
cout << "Unwind pgm = " << hex << endl; //cout << "Unwind pgm = " << hex << endl;
for(auto byte : unwind_pgm) //for(auto byte : unwind_pgm)
{ //{
cout << "\t" << +byte << endl; //cout << "\t" << +byte << endl;
} //}
fde.setProgram(arm_eh_program_t<ptrsize>{unwind_pgm}); fde.setProgram(arm_eh_program_t<ptrsize>{unwind_pgm});
local_fdes.push_back(fde); local_fdes.push_back(fde);
...@@ -117,7 +117,7 @@ vector<uint8_t> split_arm_eh_frame_impl_t<ptrsize>::parse_arm_eh_pgm(const uint6 ...@@ -117,7 +117,7 @@ vector<uint8_t> split_arm_eh_frame_impl_t<ptrsize>::parse_arm_eh_pgm(const uint6
const auto byte3 = (first_word >> 16)&0xff; const auto byte3 = (first_word >> 16)&0xff;
const auto byte4 = (first_word >> 24)&0xff; const auto byte4 = (first_word >> 24)&0xff;
const auto personality_index = byte4 & 0xf; const auto personality_index = byte4 & 0xf;
cout << "Found arm32-specific personality routine, pr" << hex << personality_index << endl; // cout << "Found arm32-specific personality routine, pr" << hex << personality_index << endl;
switch(personality_index) switch(personality_index)
{ {
case 0: case 0:
...@@ -155,7 +155,7 @@ vector<uint8_t> split_arm_eh_frame_impl_t<ptrsize>::parse_arm_eh_pgm(const uint6 ...@@ -155,7 +155,7 @@ vector<uint8_t> split_arm_eh_frame_impl_t<ptrsize>::parse_arm_eh_pgm(const uint6
const auto offset_to_personality_routine = handle_pcrel31(first_word); const auto offset_to_personality_routine = handle_pcrel31(first_word);
const auto personality_routine_addr=lsda_addr+offset_to_personality_routine; const auto personality_routine_addr=lsda_addr+offset_to_personality_routine;
fde.setPersonality(personality_routine_addr); fde.setPersonality(personality_routine_addr);
cout << "Found generic model with personality = " << hex << personality_routine_addr << endl; // cout << "Found generic model with personality = " << hex << personality_routine_addr << endl;
const auto second_word = *reinterpret_cast<const uint32_t*>(&contents[start_offset+4]); const auto second_word = *reinterpret_cast<const uint32_t*>(&contents[start_offset+4]);
const auto byte1 = (second_word >> 0 )&0xff; const auto byte1 = (second_word >> 0 )&0xff;
const auto byte2 = (second_word >> 8 )&0xff; const auto byte2 = (second_word >> 8 )&0xff;
...@@ -366,3 +366,18 @@ void arm_eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const ...@@ -366,3 +366,18 @@ void arm_eh_program_insn_t<ptrsize>::print(uint64_t &pc, int64_t caf) const
cout << endl; cout << endl;
} }
template <int ptrsize>
void arm_fde_contents_t<ptrsize>::print() const
{
cout << "start_addr = " << hex << fde_start_addr << endl;
cout << "end_addr = " << hex << fde_end_addr << endl;
cout << "lsda_addr = " << hex << fde_lsda_addr << endl;
cout << "can_unwind = " << boolalpha << can_unwind << endl;
// lsda_t<ptrsize> lsda;
// arm_eh_program_t<ptrsize> eh_pgm;
// arm_cie_contents_t<ptrsize> cie;
}
...@@ -524,23 +524,29 @@ class arm_cie_contents_t : public CIEContents_t, private eh_frame_util_t<ptrsize ...@@ -524,23 +524,29 @@ class arm_cie_contents_t : public CIEContents_t, private eh_frame_util_t<ptrsize
private: private:
uint64_t personality; uint64_t personality;
// there's not really a CIE on arm mode, so there's no pgm.
// but we declare one so people cna inspect that it's empty.
const eh_program_t<ptrsize> pgm;
public: public:
arm_cie_contents_t() {}; arm_cie_contents_t()
: personality(0)
{
}
const eh_program_t<ptrsize>& getProgram() const { throw std::runtime_error( " not implimented"); } const eh_program_t<ptrsize>& getProgram() const { return pgm; }
uint64_t getPosition() const { throw std::runtime_error( " not implimented"); } uint64_t getPosition() const { throw std::runtime_error( " not implemented"); }
uint64_t getLength() const { throw std::runtime_error( " not implimented"); } uint64_t getLength() const { throw std::runtime_error( " not implemented"); }
uint64_t getCAF() const { throw std::runtime_error( " not implimented"); } uint64_t getCAF() const { return 4; }
int64_t getDAF() const { throw std::runtime_error( " not implimented"); } int64_t getDAF() const { return 4; }
uint8_t getPersonalityEncoding() const { throw std::runtime_error( " not implimented"); } uint8_t getPersonalityEncoding() const { return 0; }
uint64_t getPersonality() const { return personality; } uint64_t getPersonality() const { return personality; }
uint64_t getPersonalityPointerPosition() const { throw std::runtime_error( " not implimented"); } uint64_t getPersonalityPointerPosition() const { throw std::runtime_error( " not implemented"); }
uint64_t getPersonalityPointerSize() const { throw std::runtime_error( " not implimented"); } uint64_t getPersonalityPointerSize() const { throw std::runtime_error( " not implemented"); }
uint64_t getReturnRegister() const { throw std::runtime_error( " not implimented"); } uint64_t getReturnRegister() const { return 0; }
string getAugmentation() const { throw std::runtime_error( " not implimented"); } string getAugmentation() const { throw std::runtime_error( " not implemented"); }
uint8_t getLSDAEncoding() const { throw std::runtime_error( " not implimented"); } uint8_t getLSDAEncoding() const { throw std::runtime_error( " not implemented"); }
uint8_t getFDEEncoding() const { throw std::runtime_error( " not implimented"); } uint8_t getFDEEncoding() const { throw std::runtime_error( " not implemented"); }
virtual void print(const uint64_t startAddr) const virtual void print(const uint64_t startAddr) const
{ {
...@@ -573,7 +579,7 @@ class arm_eh_program_insn_t : public EHProgramInstruction_t ...@@ -573,7 +579,7 @@ class arm_eh_program_insn_t : public EHProgramInstruction_t
virtual bool isRestoreState() const { return false; } virtual bool isRestoreState() const { return false; }
virtual bool isRememberState() const { return false; } virtual bool isRememberState() const { return false; }
virtual const EHProgramInstructionByteVector_t& getBytes() const { return program_bytes; } virtual const EHProgramInstructionByteVector_t& getBytes() const { return program_bytes; }
virtual bool advance(uint64_t &cur_addr, uint64_t CAF) const { throw std::runtime_error("not implemented"); } virtual bool advance(uint64_t &cur_addr, uint64_t CAF) const { return false; /* no advance operations for arm */ }
private: private:
...@@ -618,7 +624,7 @@ class arm_fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize> ...@@ -618,7 +624,7 @@ class arm_fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize>
fde_end_addr(end_addr) fde_end_addr(end_addr)
{} {}
virtual uint64_t getPosition() const { throw std::runtime_error( " not implimented"); } virtual uint64_t getPosition() const { throw std::runtime_error( " not implemented"); }
virtual uint64_t getLength() const { return fde_end_addr-fde_start_addr+1; } virtual uint64_t getLength() const { return fde_end_addr-fde_start_addr+1; }
virtual uint64_t getStartAddress() const { return fde_start_addr; } virtual uint64_t getStartAddress() const { return fde_start_addr; }
virtual uint64_t getEndAddress() const { return fde_end_addr; } virtual uint64_t getEndAddress() const { return fde_end_addr; }
...@@ -628,12 +634,12 @@ class arm_fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize> ...@@ -628,12 +634,12 @@ class arm_fde_contents_t : public FDEContents_t, eh_frame_util_t<ptrsize>
virtual const EHProgram_t& getProgram() const { return eh_pgm; } virtual const EHProgram_t& getProgram() const { return eh_pgm; }
virtual const LSDA_t* getLSDA() const { return &lsda; } virtual const LSDA_t* getLSDA() const { return &lsda; }
virtual uint64_t getLSDAAddress() const { return fde_lsda_addr; } virtual uint64_t getLSDAAddress() const { return fde_lsda_addr; }
virtual uint64_t getStartAddressPosition() const { throw std::runtime_error(" not implimented"); } virtual uint64_t getStartAddressPosition() const { throw std::runtime_error(" not implemented"); }
virtual uint64_t getEndAddressPosition() const { throw std::runtime_error(" not implimented"); } virtual uint64_t getEndAddressPosition() const { throw std::runtime_error(" not implemented"); }
virtual uint64_t getEndAddressSize() const { throw std::runtime_error(" not implimented"); } virtual uint64_t getEndAddressSize() const { throw std::runtime_error(" not implemented"); }
virtual uint64_t getLSDAAddressPosition() const { throw std::runtime_error(" not implimented"); } virtual uint64_t getLSDAAddressPosition() const { throw std::runtime_error(" not implemented"); }
virtual uint64_t getLSDAAddressSize() const { throw std::runtime_error(" not implimented"); } virtual uint64_t getLSDAAddressSize() const { throw std::runtime_error(" not implemented"); }
virtual void print() const { throw std::runtime_error(" not implimented"); } virtual void print() const ;
void setEndAddress(uint64_t end) { fde_end_addr = end; } void setEndAddress(uint64_t end) { fde_end_addr = end; }
bool getCanUnwind() const { return can_unwind; } bool getCanUnwind() const { return can_unwind; }
......
...@@ -38,7 +38,11 @@ void print_lps(const EHFrameParser_t* ehp) ...@@ -38,7 +38,11 @@ void print_lps(const EHFrameParser_t* ehp)
for(const auto fde : *fdes) for(const auto fde : *fdes)
{ {
cout<<"Found FDE at : " << fde->getStartAddress() << "-"<<fde->getEndAddress()<<endl; cout<<"Found FDE at : " << fde->getStartAddress() << "-"<<fde->getEndAddress()<<endl;
fde->print();
fde->getProgram().print(fde->getStartAddress(),1); fde->getProgram().print(fde->getStartAddress(),1);
const auto &cie=fde->getCIE();
const auto &personality=cie.getPersonality();
cout << "Personality: " << hex << personality << endl;
const auto lsda=fde->getLSDA(); const auto lsda=fde->getLSDA();
assert(lsda); assert(lsda);
lsda->print(); lsda->print();
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment