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.

194 lines
5.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.
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include "pin.H"
#include "../Utils/regvalue_utils.h"
using std::hex;
using std::cerr;
using std::endl;
using std::ios;
/* ===================================================================== */
/* Names of malloc and free */
/* ===================================================================== */
#if defined(TARGET_MAC)
#define FN "_trap_me"
#else
#define FN "trap_me"
#endif
/* ===================================================================== */
/* Global Variables */
/* ===================================================================== */
std::ofstream out;
/* ===================================================================== */
/* Commandline Switches */
/* ===================================================================== */
KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool",
"o", "check_fpstate.out", "specify output file name");
/* ===================================================================== */
static CONTEXT saveCtxt;
static BOOL enable = FALSE;
/* ===================================================================== */
/* Analysis routines */
/* ===================================================================== */
VOID CompreContext(CONTEXT *c1, CONTEXT *c2)
{
struct {
REG reg;
const char *name;
} fields[] = {
{ REG_FPIP_OFF, "ipoff" },
{ REG_FPIP_SEL, "ipsel" },
{ REG_FPOPCODE, "opcod" },
{ REG_FPDP_OFF, "dpoff" },
{ REG_FPDP_SEL, "dpsel" }
};
for (unsigned int i = 0; i < sizeof(fields)/sizeof(fields[0]); i++)
{
REG reg = fields[i].reg;
UINT size = REG_Size(reg);
UINT8* v1 = new UINT8[size];
UINT8* v2 = new UINT8[size];
PIN_GetContextRegval(c1, reg, v1);
PIN_GetContextRegval(c2, reg, v2);
if (memcmp(v1, v2, size) == 0)
out << "Same ";
else
out << "Mismatch ";
out << fields[i].name << " " << Val2Str(v1, size) << " " << Val2Str(v2, size) << endl;
delete[] v1;
delete[] v2;
}
}
VOID Enable()
{
enable = TRUE;
}
VOID SaveContext(CONTEXT *ctxt)
{
if(!enable)
return;
PIN_SaveContext(ctxt, &saveCtxt);
}
VOID SyscallEntry(THREADID tid, CONTEXT *ctxt, SYSCALL_STANDARD std, VOID *v)
{
if (!enable)
return;
CompreContext(ctxt, &saveCtxt);
enable = FALSE;
}
/* ===================================================================== */
/* Instrumentation routines */
/* ===================================================================== */
VOID Image(IMG img, VOID *v)
{
// Instrument the trapme function to activate the analysis.
RTN rtn = RTN_FindByName(img, FN);
if (RTN_Valid(rtn))
{
RTN_Open(rtn);
RTN_InsertCall(rtn, IPOINT_BEFORE, (AFUNPTR)Enable, IARG_END);
RTN_Close(rtn);
}
}
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))
{
if (INS_IsSyscall(ins))
{
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)SaveContext,
IARG_CONTEXT, IARG_END);
}
}
}
}
/* ===================================================================== */
VOID Fini(INT32 code, VOID *v)
{
out.close();
}
/* ===================================================================== */
/* Print Help Message */
/* ===================================================================== */
INT32 Usage()
{
cerr << "This tool produces a trace of calls to malloc." << endl;
cerr << endl << KNOB_BASE::StringKnobSummary() << endl;
return -1;
}
/* ===================================================================== */
/* Main */
/* ===================================================================== */
int main(int argc, char *argv[])
{
// Initialize pin & symbol manager
PIN_InitSymbols();
if( PIN_Init(argc,argv) )
{
return Usage();
}
// Write to a file since cout and cerr maybe closed by the application
out.open(KnobOutputFile.Value().c_str());
out << hex;
out.setf(ios::showbase);
IMG_AddInstrumentFunction(Image, 0);
TRACE_AddInstrumentFunction(Trace, 0);
PIN_AddSyscallEntryFunction(SyscallEntry, 0);
PIN_AddFiniFunction(Fini, 0);
// Never returns
PIN_StartProgram();
return 0;
}
/* ===================================================================== */
/* eof */
/* ===================================================================== */