You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
102 lines
2.6 KiB
102 lines
2.6 KiB
/*
|
|
* Copyright 2002-2019 Intel Corporation.
|
|
*
|
|
* This software is provided to you as Sample Source Code as defined in the accompanying
|
|
* End User License Agreement for the Intel(R) Software Development Products ("Agreement")
|
|
* section 1.L.
|
|
*
|
|
* This software and the related documents are provided as is, with no express or implied
|
|
* warranties, other than those that are expressly stated in the License.
|
|
*/
|
|
|
|
//
|
|
// This tool counts the number of SMC traces whose code has been modified
|
|
// by the running application
|
|
//
|
|
|
|
#include <stdio.h>
|
|
#include <iostream>
|
|
#include <memory.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
#include "pin.H"
|
|
using std::endl;
|
|
|
|
// The running count of SMC traces
|
|
UINT64 smcCount = 0;
|
|
|
|
|
|
// This function is called before every trace is executed
|
|
VOID DoSmcCheck(VOID * traceAddr,
|
|
VOID * traceCopyAddr,
|
|
USIZE traceSize,
|
|
CONTEXT * ctxP)
|
|
{
|
|
if (memcmp(traceAddr, traceCopyAddr, traceSize) != 0)
|
|
{
|
|
smcCount++;
|
|
free(traceCopyAddr);
|
|
PIN_RemoveInstrumentationInRange((ADDRINT)traceAddr, (ADDRINT)traceAddr);
|
|
PIN_ExecuteAt(ctxP);
|
|
}
|
|
}
|
|
|
|
// 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);
|
|
}
|
|
}
|
|
|
|
// This function is called when the application exits
|
|
// It prints the SMC trace counter
|
|
VOID Fini(INT32 code, VOID *v)
|
|
{
|
|
std::cerr << "SMC Count = " << smcCount << endl;
|
|
}
|
|
|
|
// argc, argv are the entire command line, including pin -t <toolname> -- ...
|
|
int main(int argc, char * argv[])
|
|
{
|
|
|
|
// Initialize pin
|
|
PIN_Init(argc, argv);
|
|
|
|
// Register InstrumentTrace function
|
|
TRACE_AddInstrumentFunction(InstrumentTrace, 0);
|
|
|
|
// Register application exit call back
|
|
PIN_AddFiniFunction(Fini, 0);
|
|
|
|
// Start the program, never returns
|
|
PIN_StartProgram();
|
|
|
|
return 0;
|
|
}
|
|
|
|
|