Skip to content
Snippets Groups Projects
Commit e08f1db0 authored by an7s's avatar an7s
Browse files

Parse additional IBT provenance sources

Former-commit-id: 2f81ab744f5ba9d7d153ea68326e5b0d5a581abe
parent f3a39e40
No related branches found
No related tags found
No related merge requests found
......@@ -36,7 +36,7 @@ wahoo::Instruction::Instruction()
m_isVisited = false;
m_data = NULL;
m_ib_complete=false;
m_ib_provenance = IB_PROVENANCE_UNKNOWN;
m_ibt_provenance = IBT_PROVENANCE_UNKNOWN;
}
wahoo::Instruction::Instruction(app_iaddr_t p_address, int p_size, Function* p_func)
......@@ -52,7 +52,7 @@ wahoo::Instruction::Instruction(app_iaddr_t p_address, int p_size, Function* p_f
m_stackRef = false;
m_data = NULL;
m_ib_complete=false;
m_ib_provenance = IB_PROVENANCE_UNKNOWN;
m_ibt_provenance = IBT_PROVENANCE_UNKNOWN;
}
wahoo::Instruction::~Instruction()
......@@ -88,32 +88,44 @@ void wahoo::Instruction::markVarStackRef()
m_varStackRef = true;
}
void wahoo::Instruction::setIbProvenance(char *p_provenance)
void wahoo::Instruction::setIBTProvenance(char *p_provenance)
{
std::string provenance(p_provenance);
if (provenance == "RETURNTARGET")
{
m_ib_provenance = IB_PROVENANCE_RETURN;
m_ibt_provenance = IBT_PROVENANCE_RETURN;
}
else if (provenance == "SWITCHTABLE")
{
m_ib_provenance = IB_PROVENANCE_SWITCH_TABLE;
m_ibt_provenance = IBT_PROVENANCE_SWITCH_TABLE;
}
else if (provenance == "INDIRCALL")
{
m_ib_provenance = IB_PROVENANCE_INDIRECT_CALL;
m_ibt_provenance = IBT_PROVENANCE_INDIRECT_CALL;
}
else if (provenance == "COMPUTEDGOTOHEURISTIC")
{
m_ib_provenance = IB_PROVENANCE_COMPUTED_GOTO;
m_ibt_provenance = IBT_PROVENANCE_COMPUTED_GOTO;
}
else if (provenance == "CODEADDRESSTAKEN")
{
m_ibt_provenance = IBT_PROVENANCE_CODE_ADDRESS_TAKEN;
}
else if (provenance == "UNREACHABLEBLOCK")
{
m_ibt_provenance = IBT_PROVENANCE_UNREACHABLE_BLOCK;
}
else if (provenance == "DATASEGMENT")
{
m_ibt_provenance = IBT_PROVENANCE_DATA_SEGMENT;
}
else if (provenance == "UNKNOWN")
{
m_ib_provenance = IB_PROVENANCE_UNKNOWN;
m_ibt_provenance = IBT_PROVENANCE_UNKNOWN;
}
else
{
m_ib_provenance = IB_PROVENANCE_UNKNOWN;
m_ibt_provenance = IBT_PROVENANCE_UNKNOWN;
}
}
......@@ -13,7 +13,7 @@ namespace wahoo {
class Function;
enum IBProvenance { IB_PROVENANCE_UNKNOWN, IB_PROVENANCE_RETURN, IB_PROVENANCE_SWITCH_TABLE, IB_PROVENANCE_INDIRECT_CALL, IB_PROVENANCE_COMPUTED_GOTO };
enum IBTProvenance { IBT_PROVENANCE_UNKNOWN, IBT_PROVENANCE_RETURN, IBT_PROVENANCE_SWITCH_TABLE, IBT_PROVENANCE_INDIRECT_CALL, IBT_PROVENANCE_COMPUTED_GOTO, IBT_PROVENANCE_CODE_ADDRESS_TAKEN, IBT_PROVENANCE_UNREACHABLE_BLOCK, IBT_PROVENANCE_DATA_SEGMENT };
class Instruction {
public:
......@@ -54,9 +54,9 @@ class Instruction {
const std::set<Instruction*>& getIBTs() { return ibts; }
void markIbComplete(bool complete=true) { m_ib_complete=complete; }
bool isIbComplete() { return m_ib_complete; }
void setIbProvenance(char *);
void setIbProvenance(const IBProvenance p_provenance) { m_ib_provenance = p_provenance; }
IBProvenance getIbProvenance() const { return m_ib_provenance; }
void setIBTProvenance(char *);
void setIBTProvenance(const IBTProvenance p_provenance) { m_ibt_provenance = p_provenance; }
IBTProvenance getIBTProvenance() const { return m_ibt_provenance; }
private:
app_iaddr_t m_address;
......@@ -75,7 +75,7 @@ class Instruction {
std::set<Instruction*> ibts;
bool m_ib_complete;
IBProvenance m_ib_provenance;
IBTProvenance m_ibt_provenance;
};
}
......
......@@ -677,6 +677,7 @@ void Rewriter::readXrefsFile(char p_filename[])
4432bd 1 INSTR XREF IBT FROMIB 42689c RETURNTARGET
447d4f 1 INSTR XREF IBT FROMIB 42689c RETURNTARGET
42689c 1 INSTR XREF FROMIB COMPLETE 3 RETURNTARGET
*/
if(string("IBT")==string(ibt))
......@@ -692,15 +693,13 @@ void Rewriter::readXrefsFile(char p_filename[])
if(instr)
{
// cout<<"Setting IBT for addr "<<std::hex<<addr<<std::dec<<endl;
char provenance[200];
instr->setIBTAddress(addr);
if(strcmp(fromib,"FROMIB")==0)
{
char provenance[200];
// get the from point into memory.
app_iaddr_t from_addr = 0;
fscanf(fin, "%p %s", (void**)&from_addr, provenance);
if(feof(fin)) // deal with blank lines at the EOF
break;
// find that instruction
wahoo::Instruction *from_instr = addr_to_insn_map[from_addr];
......@@ -708,8 +707,24 @@ void Rewriter::readXrefsFile(char p_filename[])
// record in the IR listing.
from_instr->addIBT(instr);
from_instr->setIbProvenance(provenance);
// set provenance info
instr->setIBTProvenance(provenance);
}
else if(strcmp(fromib,"FROMUNKNOWN")==0)
{
// 8049234 3 INSTR XREF IBT FROMUNKNOWN UNREACHABLEBLOCK
// COMPUTEDGOTOHEURISTIC | CODEADDRESSTAKEN | UNREACHABLEBLOCK
fscanf(fin, "%s", provenance);
instr->setIBTProvenance(provenance);
}
else if(strcmp(fromib,"FROMDATA")==0)
{
instr->setIBTProvenance("DATASEGMENT");
}
if(feof(fin)) // deal with blank lines at the EOF
break;
}
}
// check for instr xref fromib
......
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