// Pin calls this function every time a new instruction is encountered VOID Instruction(INS ins, VOID *v) { BOOL doInstrument =FALSE; xed_iclass_enum_t iclass = (xed_iclass_enum_t) INS_Opcode(ins); if (INS_Opcode(ins)==XED_ICLASS_FXSAVE || INS_Opcode(ins)==XED_ICLASS_FXSAVE64 || INS_Opcode(ins)==XED_ICLASS_XSAVE || INS_Opcode(ins)==XED_ICLASS_XSAVE64) { doInstrument = TRUE; } else { for (REG reg=REG_XMM_BASE; reg <= REG_YMM_LAST; reg=static_cast<REG>((static_cast<INT32>(reg)+1))) { if (INS_RegRContain(ins, reg)) { doInstrument = TRUE; break; } else if (INS_RegWContain(ins, reg)) { doInstrument = TRUE; break; } } } if (doInstrument) { INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)SetYmmScratchesFun, IARG_ADDRINT, ymmInitVals, IARG_ADDRINT, xmmSaveVal, IARG_END); } }
VOID Instruction(INS ins, VOID *v) { for (REG reg=REG_XMM_BASE; reg <= REG_XMM_LAST; reg=static_cast<REG>((static_cast<INT32>(reg)+1))) { if (INS_RegRContain(ins, reg)) { INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(TestXmm), IARG_INST_PTR, IARG_REG_REFERENCE, reg, IARG_REG_REFERENCE, REG_XMM1, IARG_ADDRINT, READ, IARG_ADDRINT, (reg-REG_XMM_BASE), IARG_END); fprintf(outfile,"Instrumented read on ins %p %s\n", (void *)(INS_Address(ins)), INS_Disassemble(ins).c_str()); fflush (outfile); } if (INS_RegWContain(ins, reg)) { INS_InsertCall(ins, IPOINT_AFTER, AFUNPTR(TestXmm), IARG_INST_PTR, IARG_REG_REFERENCE, reg, IARG_REG_REFERENCE, REG_XMM1, IARG_ADDRINT, WRITE, IARG_ADDRINT, (reg-REG_XMM_BASE), IARG_END); fprintf(outfile,"Instrumented write on ins %p %s\n", (void *)(INS_Address(ins)), INS_Disassemble(ins).c_str()); fflush (outfile); } } }
static BOOL WritesSegment(INS ins, REG *seg) { if (INS_RegWContain(ins, REG_SEG_FS)) { *seg = REG_SEG_FS; return TRUE; } if (INS_RegWContain(ins, REG_SEG_GS)) { *seg = REG_SEG_GS; return TRUE; } if (INS_RegWContain(ins, REG_SEG_ES)) { *seg = REG_SEG_ES; return TRUE; } if (INS_RegWContain(ins, REG_SEG_CS)) { *seg = REG_SEG_CS; return TRUE; } if (INS_RegWContain(ins, REG_SEG_DS)) { *seg = REG_SEG_DS; return TRUE; } if (INS_RegWContain(ins, REG_SEG_SS)) { *seg = REG_SEG_SS; return TRUE; } return FALSE; }