VOID CheckContextState(CONTEXT *ctxt) { printf ("context contains PROCESSOR_STATE_X87 %d\n", PIN_ContextContainsState(ctxt, PROCESSOR_STATE_X87)); fflush (stdout); if (!PIN_ContextContainsState(ctxt, PROCESSOR_STATE_X87)) { printf ("***Error context does NOT contain PROCESSOR_STATE_X87\n"); exit (-1); } printf ("context contains PROCESSOR_STATE_XMM %d\n", PIN_ContextContainsState(ctxt, PROCESSOR_STATE_XMM)); if (!PIN_ContextContainsState(ctxt, PROCESSOR_STATE_XMM)) { printf ("***Error context does NOT contain PROCESSOR_STATE_XMM\n"); exit (-1); } printf ("context contains PROCESSOR_STATE_YMM %d\n", PIN_ContextContainsState(ctxt, PROCESSOR_STATE_YMM)); if (!PIN_ContextContainsState(ctxt, PROCESSOR_STATE_YMM) && ProcessorSupportsAvx()) { printf ("***Error context does NOT contain PROCESSOR_STATE_YMM\n"); exit (-1); } if (PIN_ContextContainsState(ctxt, PROCESSOR_STATE_YMM) && !ProcessorSupportsAvx()) { printf ("***Error context contains PROCESSOR_STATE_YMM, but processor does NOT support Ymm\n"); exit (-1); } }
int main(int argc, char * argv[]) { // Initialize pin if (PIN_Init(argc, argv)) return Usage(); printf ("Pin supports PROCESSOR_STATE_X87 %d\n", PIN_SupportsProcessorState(PROCESSOR_STATE_X87)); if (!PIN_SupportsProcessorState(PROCESSOR_STATE_X87)) { printf ("***Error Pin does NOT support PROCESSOR_STATE_X87\n"); exit (-1); } printf ("Pin supports PROCESSOR_STATE_XMM %d\n", PIN_SupportsProcessorState(PROCESSOR_STATE_XMM)); if (!PIN_SupportsProcessorState(PROCESSOR_STATE_XMM)) { printf ("***Error Pin does NOT support PROCESSOR_STATE_XMM\n"); exit (-1); } printf ("Pin supports PROCESSOR_STATE_YMM %d\n", PIN_SupportsProcessorState(PROCESSOR_STATE_YMM)); if (!PIN_SupportsProcessorState(PROCESSOR_STATE_YMM) && ProcessorSupportsAvx()) { printf ("***Error Pin does NOT support PROCESSOR_STATE_YMM\n"); exit (-1); } if (PIN_SupportsProcessorState(PROCESSOR_STATE_YMM) && !ProcessorSupportsAvx()) { printf ("***Error Pin does support PROCESSOR_STATE_YMM, but processor does not\n"); exit (-1); } // Register Instruction to be called to instrument instructions INS_AddInstrumentFunction(Instruction, 0); // Start the program, never returns PIN_StartProgram(); return 0; }
int main(int argc, char *argv[]) { PIN_Init(argc,argv); if (KnobContextAtTrace) { TRACE_AddInstrumentFunction(Trace, 0); } if (KnobContextAtIns) { INS_AddInstrumentFunction(Instruction, 0); } PIN_AddFiniFunction(Fini, 0); supportsAvx = ProcessorSupportsAvx(); // Never returns PIN_StartProgram(); return 0; }
VOID Trace (TRACE trace, VOID *v) { for (BBL bbl = TRACE_BblHead(trace); BBL_Valid(bbl); bbl = BBL_Next(bbl)) { for (INS ins = BBL_InsHead(bbl); INS_Valid(ins); ins = INS_Next(ins)) { xed_iclass_enum_t iclass1 = static_cast<xed_iclass_enum_t>(INS_Opcode(ins)); if (iclass1 == XED_ICLASS_FLD1 && INS_Valid(INS_Next(ins))) { xed_iclass_enum_t iclass2 = static_cast<xed_iclass_enum_t>(INS_Opcode(INS_Next(ins))); if (iclass2 == XED_ICLASS_FLD1 && INS_Valid(INS_Next(INS_Next(ins)))) { xed_iclass_enum_t iclass3 = static_cast<xed_iclass_enum_t>(INS_Opcode(INS_Next(INS_Next(ins)))); if (iclass3 == XED_ICLASS_FLD1) { printf ("found fld1 sequence at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); if (testNum == 0) { REGSET regsFP; REGSET_Clear(regsFP); REGSET_Insert (regsFP, REG_X87); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, ®sFP, IARG_END); printf ("Inserted call1 to FldzToTop3 after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 1) { REGSET regsNone; REGSET_Clear(regsNone); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, ®sNone, IARG_END); printf ("Inserted call2 to FldzToTop3 after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 2) { INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_END); printf ("Inserted call3 to FldzToTop3 after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 3) { REGSET regsNone; REGSET_Clear(regsNone); REGSET_Insert (regsNone, REG_X87); REGSET_Insert (regsNone, REG_MXCSR); REGSET_Remove(regsNone, REG_X87); REGSET_Remove(regsNone, REG_MXCSR); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, ®sNone, IARG_END); printf ("Inserted call4 to FldzToTop3 after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 4) { REGSET regsXMM; REGSET_Clear(regsXMM); // need to declare X87 preserved also - because otherwise the fxsave/fxrstor will preserve the // xmm regs REGSET_Insert (regsXMM, REG_X87); REGSET_Insert (regsXMM, REG_XMM0); REGSET_Insert (regsXMM, REG_XMM1); REGSET_Insert (regsXMM, REG_XMM2); REGSET_Insert (regsXMM, REG_XMM3); REGSET_Insert (regsXMM, REG_XMM4); REGSET_Insert (regsXMM, REG_XMM5); REGSET_Insert (regsXMM, REG_XMM6); REGSET_Insert (regsXMM, REG_XMM7); if (ProcessorSupportsAvx()) { REGSET_Insert (regsXMM, REG_YMM0); REGSET_Insert (regsXMM, REG_YMM1); REGSET_Insert (regsXMM, REG_YMM2); REGSET_Insert (regsXMM, REG_YMM3); REGSET_Insert (regsXMM, REG_YMM4); REGSET_Insert (regsXMM, REG_YMM5); REGSET_Insert (regsXMM, REG_YMM6); REGSET_Insert (regsXMM, REG_YMM7); } #ifdef TARGET_IA32E REGSET_Insert (regsXMM, REG_XMM8); REGSET_Insert (regsXMM, REG_XMM9); REGSET_Insert (regsXMM, REG_XMM10); REGSET_Insert (regsXMM, REG_XMM11); REGSET_Insert (regsXMM, REG_XMM12); REGSET_Insert (regsXMM, REG_XMM13); REGSET_Insert (regsXMM, REG_XMM14); REGSET_Insert (regsXMM, REG_XMM15); if (ProcessorSupportsAvx()) { REGSET_Insert (regsXMM, REG_YMM8); REGSET_Insert (regsXMM, REG_YMM9); REGSET_Insert (regsXMM, REG_YMM10); REGSET_Insert (regsXMM, REG_YMM11); REGSET_Insert (regsXMM, REG_YMM12); REGSET_Insert (regsXMM, REG_YMM13); REGSET_Insert (regsXMM, REG_YMM14); REGSET_Insert (regsXMM, REG_YMM15); } #endif INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, ®sXMM, IARG_END); printf ("Inserted call1 to CallToSetXmmRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 5) { REGSET regsNone; REGSET_Clear(regsNone); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, ®sNone, IARG_END); printf ("Inserted call2 to CallToSetXmmRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 6) { INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_END); printf ("Inserted call3 to CallToSetXmmRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 7) { REGSET regsXMM; REGSET_Clear(regsXMM); REGSET_Insert (regsXMM, REG_X87); REGSET_Insert (regsXMM, REG_XMM0); REGSET_Insert (regsXMM, REG_XMM1); REGSET_Insert (regsXMM, REG_XMM2); REGSET_Insert (regsXMM, REG_XMM3); REGSET_Insert (regsXMM, REG_XMM4); REGSET_Insert (regsXMM, REG_XMM5); REGSET_Insert (regsXMM, REG_XMM6); REGSET_Insert (regsXMM, REG_XMM7); #ifdef TARGET_IA32E REGSET_Insert (regsXMM, REG_XMM8); REGSET_Insert (regsXMM, REG_XMM9); REGSET_Insert (regsXMM, REG_XMM10); REGSET_Insert (regsXMM, REG_XMM11); REGSET_Insert (regsXMM, REG_XMM12); REGSET_Insert (regsXMM, REG_XMM13); REGSET_Insert (regsXMM, REG_XMM14); REGSET_Insert (regsXMM, REG_XMM15); #endif REGSET_Remove (regsXMM, REG_X87); REGSET_Remove (regsXMM, REG_XMM0); REGSET_Remove (regsXMM, REG_XMM1); REGSET_Remove (regsXMM, REG_XMM2); REGSET_Remove (regsXMM, REG_XMM3); REGSET_Remove (regsXMM, REG_XMM4); REGSET_Remove (regsXMM, REG_XMM5); REGSET_Remove (regsXMM, REG_XMM6); REGSET_Remove (regsXMM, REG_XMM7); #ifdef TARGET_IA32E REGSET_Remove (regsXMM, REG_XMM8); REGSET_Remove (regsXMM, REG_XMM9); REGSET_Remove (regsXMM, REG_XMM10); REGSET_Remove (regsXMM, REG_XMM11); REGSET_Remove (regsXMM, REG_XMM12); REGSET_Remove (regsXMM, REG_XMM13); REGSET_Remove (regsXMM, REG_XMM14); REGSET_Remove (regsXMM, REG_XMM15); #endif INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, ®sXMM, IARG_END); printf ("Inserted call4 to CallToSetXmmRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 8) { REGSET regsX87; REGSET_Clear(regsX87); REGSET_Insert (regsX87, REG_X87); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, ®sX87, IARG_END); printf ("Inserted call5 to CallToSetXmmRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } #if 0 // this test is not run because overwriting the integer registers can cause Pin to fail else if(testNum == 9) { REGSET regsIntScratches; REGSET_Clear(regsIntScratches); REGSET_Insert (regsIntScratches, REG_GAX); REGSET_Insert (regsIntScratches, REG_GCX); REGSET_Insert (regsIntScratches, REG_GDX); #ifdef TARGET_IA32E REGSET_Insert (regsIntScratches, REG_R8); REGSET_Insert (regsIntScratches, REG_R9); REGSET_Insert (regsIntScratches, REG_R10); REGSET_Insert (regsIntScratches, REG_R11); #if defined( __GNUC__) REGSET_Insert (regsIntScratches, REG_GSI); REGSET_Insert (regsIntScratches, REG_GDI); #endif #endif INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_PRESERVE, ®sIntScratches, IARG_END); printf ("Inserted call1 to CallToSetIntRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } #endif else if(testNum == 9) { REGSET regsNone; REGSET_Clear(regsNone); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_PRESERVE, ®sNone, IARG_END); printf ("Inserted call2 to CallToSetIntRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 10) { INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_END); printf ("Inserted call3 to CallToSetIntRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 11) { REGSET regsNone; REGSET_Clear(regsNone); REGSET_Insert (regsNone, REG_GAX); REGSET_Insert (regsNone, REG_GCX); REGSET_Insert (regsNone, REG_GDX); #ifdef TARGET_IA32E REGSET_Insert (regsNone, REG_R8); REGSET_Insert (regsNone, REG_R9); REGSET_Insert (regsNone, REG_R10); REGSET_Insert (regsNone, REG_R11); #if defined( __GNUC__) REGSET_Insert (regsNone, REG_GSI); REGSET_Insert (regsNone, REG_GDI); #endif #endif REGSET_Remove (regsNone, REG_GAX); REGSET_Remove (regsNone, REG_GCX); REGSET_Remove (regsNone, REG_GDX); #ifdef TARGET_IA32E REGSET_Remove (regsNone, REG_R8); REGSET_Remove (regsNone, REG_R9); REGSET_Remove (regsNone, REG_R10); REGSET_Remove (regsNone, REG_R11); #if defined( __GNUC__) REGSET_Remove (regsNone, REG_GSI); REGSET_Remove (regsNone, REG_GDI); #endif #endif INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_PRESERVE, ®sNone, IARG_END); printf ("Inserted call4 to CallToSetIntRegsToZero after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 12) { REGSET regsFP; REGSET_Clear(regsFP); REGSET_Insert (regsFP, REG_X87); REGSET_Insert (regsFP, REG_MXCSR); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToUnMaskZeroDivideInMxcsr), IARG_PRESERVE, ®sFP, IARG_END); printf ("Inserted call1 to UnMaskZeroDivideInMxcsr after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 13) { INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToUnMaskZeroDivideInMxcsr), IARG_END); printf ("Inserted call2 to UnMaskZeroDivideInMxcsr after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 14) { REGSET regsFP; REGSET_Clear(regsFP); REGSET_Insert (regsFP, REG_X87); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToUnMaskZeroDivideInMxcsr), IARG_END); printf ("Inserted call3 to UnMaskZeroDivideInMxcsr after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; } else if(testNum == 15) { REGSET regsNone; REGSET_Clear(regsNone); INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, ®sNone, IARG_END); printf ("Inserted call5 to FldzToTop3 after instruction at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins))))); testNum++; printf ("testNum %d\n", testNum); } return; } } } } } }
REGVAL gpr32regval; #endif REGVAL gpr16regval; REGVAL gprlregval; REGVAL gprhregval; REGVAL stregval; #ifdef TARGET_MIC REGVAL zmmregval; REGVAL kregval; #else REGVAL xmmregval; REGVAL ymmregval; #endif // not TARGET_MIC // Boolean indicating whether the system supports avx instructions and registers. const bool hasAvxSupport = ProcessorSupportsAvx(); ///////////////////// // INTERNAL FUNCTIONS IMPLEMENTATION ///////////////////// static inline UINT Bits2Uint64(UINT bits) { assert(bits%8 == 0); UINT res = bits >> 6; if (bits%64) ++res; return res; } static inline void PrintRegval(REG reg, const REGVAL * regval, ostream& ost)