static VOID InstrumentTrace(TRACE trace, VOID *v) { CheckSPAlign(); static int testNum = 0; switch (testNum++) { case 0: // Test an out-of-line analysis call. // TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceOutOfLine), IARG_END); break; case 1: // Test an out-of-line "if/then" call. // TRACE_InsertIfCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceIf), IARG_END); TRACE_InsertThenCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceOutOfLine), IARG_END); break; case 2: // Test an inlined analysis call. // TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(CheckSPAlign), IARG_END); break; case 3: // Test an "if/then" call where the "then" is inlined. // TRACE_InsertIfCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceIf), IARG_END); TRACE_InsertThenCall(trace, IPOINT_BEFORE, AFUNPTR(CheckSPAlign), IARG_END); break; case 4: // Test an out-of-line analysis call with context argument // TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceOutOfLine), IARG_CONTEXT, IARG_END); break; case 5: // Test an out-of-line "if/then" call with context argument // TRACE_InsertIfCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceIf), IARG_END); TRACE_InsertThenCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceOutOfLine), IARG_CONTEXT, IARG_END); break; default: testNum = 0; break; } }
// Pin calls this function every time a new trace is encountered VOID InstrumentTrace(TRACE trace, VOID *v) { VOID * traceAddr; VOID * traceCopyAddr; USIZE traceSize; traceAddr = (VOID *)TRACE_Address(trace); #if 0 if (traceAddr < (void*)0xbf000000) return; fprintf(stderr,"Instrumenting trace at %p\n",traceAddr); #endif traceSize = TRACE_Size(trace); traceCopyAddr = malloc(traceSize); if (traceCopyAddr != 0) { memcpy(traceCopyAddr, traceAddr, traceSize); // Insert a call to DoSmcCheck before every trace TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR)DoSmcCheck, IARG_PTR, traceAddr, IARG_PTR, traceCopyAddr, IARG_UINT32 , traceSize, IARG_CONTEXT, IARG_END); } }
static VOID InstrumentTrace(TRACE trace, VOID *v) { CheckSPAlign(); static int testNum = 0; switch (testNum++) { case 0: // Test an out-of-line analysis call. // TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceOutOfLine), IARG_END); break; case 1: // Test an out-of-line "if/then" call. // TRACE_InsertIfCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceIf), IARG_END); TRACE_InsertThenCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceOutOfLine), IARG_END); break; #if 0 // These tests are disabled because Pin cannot yet inline analysis routines that // use xmm registers. case 2: // Test an inlined analysis call. // TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(CheckSPAlign), IARG_END); break; case 3: // Test an "if/then" call where the "then" is inlined. // TRACE_InsertIfCall(trace, IPOINT_BEFORE, AFUNPTR(AtTraceIf), IARG_END); TRACE_InsertThenCall(trace, IPOINT_BEFORE, AFUNPTR(CheckSPAlign), IARG_END); break; #endif default: testNum = 0; break; } }
VOID Trace(TRACE trace, VOID *v) { // If current trace is the actual memcpy address insert memcpy instrumentation func if (TRACE_Address(trace) == actual_memcpy_add) { TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR)MemcpyBefore, IARG_ADDRINT, "memcpy (ifunc)", IARG_FUNCARG_ENTRYPOINT_VALUE, 0, IARG_FUNCARG_ENTRYPOINT_VALUE, 1, IARG_FUNCARG_ENTRYPOINT_VALUE, 2, IARG_END); } }
// If a base register is used in the trace but not written // in the trace, then write the shadow register at the top // of the trace VOID WriteLiveShadows(TRACE trace, BOOL * live) { for (INT32 i = 0; i < REGCOUNT; i++) { if (live[i]) { REG reg = IndexToReg(i); // If this instruction writes a register that is used as a base register in // a memory operation later in the trace, then translate the address and // write it to a shadow register TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(ProcessAddress), IARG_REG_VALUE, reg, IARG_INST_PTR, IARG_RETURN_REGS, ShadowReg(reg), IARG_END); } } }
static VOID Trace(TRACE trace, VOID *v) { RTN rtn = TRACE_Rtn(trace); if (!RTN_Valid(rtn) || RTN_Name(rtn) != watch_rtn) { return; } if (TRACE_Address(trace) == RTN_Address(rtn)) { TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace instrumentation", IARG_CALL_ORDER, CALL_ORDER_FIRST+3, IARG_END); printf("Trace Instrumenting %s\n", watch_rtn); } }
static VOID Trace(TRACE trace, VOID *v) { RTN rtn = TRACE_Rtn(trace); if (!RTN_Valid(rtn) || RTN_Name(rtn) != watch_rtn) { return; } if (TRACE_Address(trace) == RTN_Address(rtn)) { TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace instrumentation", IARG_CALL_ORDER, CALL_ORDER_FIRST+2, IARG_END); BBL_InsertCall(TRACE_BblHead(trace), IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace_BBL instrumentation", IARG_CALL_ORDER, CALL_ORDER_FIRST+2, IARG_END); INS_InsertCall(BBL_InsHead(TRACE_BblHead(trace)), IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace_INS instrumentation", IARG_CALL_ORDER, CALL_ORDER_FIRST+2, IARG_END); printf("Trace Instrumenting %s\n", watch_rtn, reinterpret_cast<void *>(RTN_Address(rtn))); } }
/*! * Test SafeCopy in the trace instrumentation callback */ VOID Trace(TRACE trace, VOID *v) { static BOOL first = TRUE; if (first) { first = FALSE; out << "Test SafeCopy in the trace instrumentation callback." << endl << flush; SafeCopyTest(); TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR)SafeCopyTestInTrace, IARG_END); } // Verify that pin-inserted probes are not visible through PIN_SafeCopy if (probeAddr != 0) { out << "Test SafeCopy in a region overwritten by probe." << endl << flush; CHAR buffer[8]; size_t copySize = PIN_SafeCopy(buffer, probeAddr, sizeof(buffer)); ASSERT((copySize == sizeof(buffer)), "SafeCopy failed in a region overwritten by probe.\n"); ASSERT((memcmp(buffer, probeAddr, copySize) != 0), "Pin inserted probes are visible through SafeCopy.\n"); probeAddr = 0; } }
static VOID Trace(TRACE trace, VOID *v) { RTN rtn = TRACE_Rtn(trace); if (!RTN_Valid(rtn) || RTN_Name(rtn) != watch_rtn) { return; } if (TRACE_Address(trace) == RTN_Address(rtn)) { INS ins = BBL_InsHead(TRACE_BblHead(trace)); INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace instrumentation3", IARG_END); BBL_InsertCall(TRACE_BblHead(trace), IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace instrumentation2", IARG_END); TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(Emit), IARG_PTR, "Trace instrumentation1", IARG_END); printf("Trace Instrumenting %s\n", watch_rtn); } }
VOID Trace(TRACE trace, VOID *v) { if (KnobCompareContexts) { TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR) ReceiveContext, IARG_CONST_CONTEXT, IARG_END); TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR) VerifyContext, IARG_CONTEXT, IARG_END); if (KnobCompareReverseContexts) { TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR) ReceiveContext, IARG_CONTEXT, IARG_END); TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR) VerifyContext, IARG_CONST_CONTEXT, IARG_END); } } else if (KnobOnStackContextOnly) { TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR) ReceiveContext, IARG_CONTEXT, IARG_END); } else if (KnobGetSpillAreaContextOnly) { TRACE_InsertCall(trace, IPOINT_BEFORE, (AFUNPTR) ReceiveContext, IARG_CONST_CONTEXT, IARG_END); } }
VOID Trace(TRACE trace, VOID *v) { TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(TraceBegin), IARG_INST_PTR, IARG_THREAD_ID, IARG_END); }
VOID Tr(TRACE trace, VOID *) { TRACE_InsertCall(trace, IPOINT_BEFORE, AFUNPTR(mal), IARG_THREAD_ID, IARG_END); }
VOID Trace(TRACE tr, VOID *v) { TRACE_InsertCall(tr, IPOINT_BEFORE, AFUNPTR(ShowContext), IARG_INST_PTR, IARG_CONTEXT, IARG_REG_VALUE, REG_GAX, IARG_END); }