VOID ImageLoad(IMG img, VOID *v) { RTN rtn = RTN_FindByName(img, "TestIargPreserveInReplacement"); if (RTN_Valid(rtn)) { printf ("found TestIargPreserveInReplacement\n"); fflush (stdout); PROTO proto = PROTO_Allocate( PIN_PARG(void), CALLINGSTD_DEFAULT, "TestIargPreserveInReplacementProto", PIN_PARG_END() ); REGSET regsFP; REGSET_Clear(regsFP); REGSET_Insert (regsFP, REG_X87); RTN_ReplaceSignature( rtn, AFUNPTR(TestIargPreserveReplacement), IARG_PROTOTYPE, proto, IARG_CONTEXT, IARG_ORIG_FUNCPTR, IARG_PRESERVE, ®sFP, IARG_END); PROTO_Free( proto ); } rtn = RTN_FindByName(img, "TestIargPreserveInReplacement1"); if (RTN_Valid(rtn)) { printf ("found TestIargPreserveInReplacement1\n"); fflush (stdout); PROTO proto = PROTO_Allocate( PIN_PARG(void), CALLINGSTD_DEFAULT, "TestIargPreserveInReplacementProto", PIN_PARG_END() ); RTN_ReplaceSignature( rtn, AFUNPTR(TestIargPreserveReplacement1), IARG_PROTOTYPE, proto, IARG_CONTEXT, IARG_ORIG_FUNCPTR, IARG_END); PROTO_Free( proto ); } }
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; } } } } } }