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.
106 lines
3.2 KiB
106 lines
3.2 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 tests the functionality of PIN_AddSmcDetectedFunction
|
|
//
|
|
#include <cstdio>
|
|
#include "pin.H"
|
|
|
|
|
|
/* ================================================================== */
|
|
/* Global Variables */
|
|
/* ================================================================== */
|
|
ADDRINT startOfFuncInBuf = 0;
|
|
ADDRINT expectedSmcDetectedtraceStartAddress = 0;
|
|
ADDRINT expectedSmcDetectedtraceEndAddress = 0;
|
|
BOOL foundExpectedSmc = FALSE;
|
|
int numSmcDetected = 0;
|
|
FILE *fp;
|
|
/* ===================================================================== */
|
|
/* Commandline Switches */
|
|
/* ===================================================================== */
|
|
|
|
/* ================================================================== */
|
|
|
|
|
|
VOID SmcDetected (ADDRINT traceStartAddress, ADDRINT traceEndAddress, VOID *v)
|
|
{
|
|
printf ("Tool: SmcDetected in range %p - %p\n", (void *)(traceStartAddress), (void *)(traceEndAddress));
|
|
if (expectedSmcDetectedtraceStartAddress == traceStartAddress &&
|
|
expectedSmcDetectedtraceEndAddress == traceEndAddress)
|
|
{
|
|
foundExpectedSmc = TRUE;
|
|
}
|
|
ASSERTX (traceStartAddress != 0);
|
|
ASSERTX (traceEndAddress != 0);
|
|
numSmcDetected++;
|
|
}
|
|
|
|
|
|
VOID Trace(TRACE trace, VOID *v)
|
|
{
|
|
if (startOfFuncInBuf == 0)
|
|
{
|
|
if (fp)
|
|
{
|
|
fscanf (fp, "%p", (void **)(&startOfFuncInBuf));
|
|
if (startOfFuncInBuf)
|
|
{
|
|
fclose(fp);
|
|
fp = NULL;
|
|
printf ("Tool: startOfFuncInBuf %p TRACE_Address(trace) %p\n",
|
|
(void *)startOfFuncInBuf, (void *)TRACE_Address(trace));
|
|
}
|
|
}
|
|
}
|
|
if (TRACE_Address(trace) == startOfFuncInBuf
|
|
&& expectedSmcDetectedtraceStartAddress == 0)
|
|
{
|
|
printf ("Tool: TRACE_Address(trace) %p TRACE_EndAddress(trace) %p\n",
|
|
(void *)TRACE_Address(trace), (void *)(TRACE_Address(trace) + TRACE_Size(trace)));
|
|
expectedSmcDetectedtraceStartAddress = TRACE_Address(trace);
|
|
expectedSmcDetectedtraceEndAddress = TRACE_Address(trace) + TRACE_Size(trace);
|
|
}
|
|
}
|
|
|
|
|
|
/* ================================================================== */
|
|
/*
|
|
This routine is called once at the end.
|
|
*/
|
|
VOID Fini(INT32 c, VOID *v)
|
|
{
|
|
ASSERTX (foundExpectedSmc);
|
|
}
|
|
|
|
/* ================================================================== */
|
|
/*
|
|
Initialize and begin program execution under the control of Pin
|
|
*/
|
|
int main(INT32 argc, CHAR **argv)
|
|
{
|
|
if (PIN_Init(argc, argv) ) return 1;
|
|
|
|
TRACE_AddInstrumentFunction(Trace, 0);
|
|
|
|
// Register a routine that gets called when the program ends
|
|
PIN_AddFiniFunction(Fini, 0);
|
|
|
|
TRACE_AddSmcDetectedFunction (SmcDetected, 0);
|
|
|
|
fp = fopen ("smcapp1.out", "w+");
|
|
|
|
PIN_StartProgram(); // Never returns
|
|
|
|
return 0;
|
|
}
|