VOID VerifyFpContext(ADDRINT pcval, CONTEXT * context) { //printf ("fpContextFromXsave %x FPSTATE_SIZE %d FPSTATE_ALIGNMENT %d\n", fpContextFromXsave, FPSTATE_SIZE, FPSTATE_ALIGNMENT); //fflush (stdout); Do_Xsave (fpContextFromXsave); //printf ("fpContextFromFxsave %x\n", fpContextFromFxsave); //fflush (stdout); Do_Fxsave (fpContextFromFxsave); PIN_SaveContext(context, &contextFromPin); FPSTATE *fpContextFromPin = reinterpret_cast<FPSTATE *> (( reinterpret_cast<ADDRINT>(fpContextSpaceForFpConextFromPin) + (FPSTATE_ALIGNMENT - 1)) & (-1*FPSTATE_ALIGNMENT)); //printf ("fpContextFromPin %x\n", fpContextFromPin); //fflush (stdout); PIN_GetContextFPState(&contextFromPin, fpContextFromPin); BOOL hadError = FALSE; if (!CompareFpContext (fpContextFromPin, fpContextFromXsave, TRUE)) { fprintf (log_inl, "***ERROR in xsave fp context\n"); printf ("***ERROR in xsave fp context see file %s\n", KnobOutputFile.Value().c_str()); fflush (stdout); string s = disassemble ((pcval),(pcval)+15); fprintf (log_inl," %s\n", s.c_str()); exit (-1); } if (!CompareFpContext (fpContextFromPin, fpContextFromFxsave, FALSE)) { fprintf (log_inl, "***ERROR in fxsave fp context\n"); printf ("***ERROR in fxsave fp context see file %s\n", KnobOutputFile.Value().c_str()); fflush (stdout); string s = disassemble ((pcval),(pcval)+15); fprintf (log_inl," %s\n", s.c_str()); exit (-1); } //printf ("verify success\n"); //fflush (stdout); }
VOID VerifyContext (CONTEXT *contextAtVerify) { BOOL successInt = CompareIntContext(contextAtVerify, &contextAtReceive); BOOL successFp = CompareFpContext(contextAtVerify, &contextAtReceive); if (!successInt || !successFp) { exit(-1); } }
VOID VerifyFpContext(ADDRINT pcval, CONTEXT * context) { //printf ("fpContextFromXsave %x FPSTATE_SIZE %d FPSTATE_ALIGNMENT %d\n", fpContextFromXsave, FPSTATE_SIZE, FPSTATE_ALIGNMENT); //fflush (stdout); Do_Xsave (fpContextFromXsave); //printf ("fpContextFromFxsave %x\n", fpContextFromFxsave); //fflush (stdout); Do_Fxsave (fpContextFromFxsave); PIN_SaveContext(context, &contextFromPin); FPSTATE *fpContextFromPin = reinterpret_cast<FPSTATE *> (( reinterpret_cast<ADDRINT>(fpContextSpaceForFpConextFromPin) + (FPSTATE_ALIGNMENT - 1)) & (-1*FPSTATE_ALIGNMENT)); unsigned char * ptr = (reinterpret_cast< unsigned char *>(fpContextFromPin))+ sizeof (FXSAVE); // set values after fxsave part of fp context - to verify that the deprecated call to PIN_GetContextFPState does NOT change these memset (ptr, 0xa5, sizeof(FPSTATE) - sizeof (FXSAVE)); PIN_GetContextFPState(&contextFromPin, reinterpret_cast<void *>(fpContextFromPin)); for (int i=0; i<sizeof(FPSTATE) - sizeof (FXSAVE); i++,ptr++) { if (*ptr != 0xa5) { printf ("**** ERROR: value set after FXSAVE part in deprecated PIN_GetContextFPState *ptr = %x (i %d)\n", *ptr, i); exit (-1); } } PIN_GetContextFPState(&contextFromPin, fpContextFromPin); ptr = (reinterpret_cast< unsigned char *>(fpContextFromPin))+ sizeof (FXSAVE); FPSTATE *fpContextFromPin1 = reinterpret_cast<FPSTATE *> (( reinterpret_cast<ADDRINT>(fpContextSpaceForFpConextFromPin1) + (FPSTATE_ALIGNMENT - 1)) & (-1*FPSTATE_ALIGNMENT)); PIN_GetContextFPState(&contextFromPin, fpContextFromPin1); // set values after fxsave part of fp context - to verify that the deprecated call to PIN_SetContextFPState does NOT change these unsigned char * ptr1 = (reinterpret_cast< unsigned char *>(fpContextFromPin1)) + sizeof (FXSAVE); memset (ptr1, 0xa5, sizeof(FPSTATE) - sizeof (FXSAVE)); PIN_SetContextFPState(&contextFromPin, reinterpret_cast<const void *>(fpContextFromPin1)); PIN_GetContextFPState(&contextFromPin, fpContextFromPin1); if (memcmp (ptr1, ptr, sizeof(FPSTATE) - sizeof (FXSAVE)) != 0) { printf ("**** ERROR: value set after FXSAVE part in deprecated PIN_SetContextFPState\n"); exit (-1); } if (!CompareFpContext (fpContextFromPin, fpContextFromFxsave, FALSE)) { fprintf (log_inl, "***ERROR in fxsave fp context\n"); printf ("***ERROR in fxsave fp context see file %s\n", KnobOutputFile.Value().c_str()); fflush (stdout); string s = disassemble ((pcval),(pcval)+15); fprintf (log_inl," %s\n", s.c_str()); exit (-1); } }
BOOL CompareContext (CONTEXT *context1, CONTEXT *context2) { BOOL compareIntOk = CompareIntContext (context1, context2); BOOL compareFpOk = CompareFpContext (context1, context2); return (compareIntOk && compareFpOk); }