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.

135 lines
4.0 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 "pin.H"
#include <fstream>
using std::ofstream;
using std::endl;
VOID PrintArgs(INT32 arg1, INT32 arg2, INT32 arg3, INT32 arg4, INT32 arg5, INT32 arg6, INT32 arg7, INT32 arg8)
{
ofstream out("args.output");
out << arg1 << endl;
out << arg2 << endl;
out << arg3 << endl;
out << arg4 << endl;
out << arg5 << endl;
out << arg6 << endl;
out << arg7 << endl;
out << arg8 << endl;
}
VOID CheckIp(ADDRINT ip1,
ADDRINT ip2,
ADDRINT ip3,
ADDRINT ip4,
ADDRINT ip5,
ADDRINT ip6,
ADDRINT ip7,
ADDRINT ip8,
ADDRINT ip9,
ADDRINT ip10
)
{
if (ip1 != ip2)
fprintf(stderr,"ip1 %p ip2 %p\n", (void*)ip1, (void*)ip2);
ASSERTX(ip1 == ip2);
ASSERTX(ip1 == ip3);
ASSERTX(ip1 == ip4);
ASSERTX(ip1 == ip5);
ASSERTX(ip1 == ip6);
ASSERTX(ip1 == ip7);
ASSERTX(ip1 == ip8);
ASSERTX(ip1 == ip9);
ASSERTX(ip1 == ip10);
}
VOID PIN_FAST_ANALYSIS_CALL CheckIpFast(ADDRINT ip1,
ADDRINT ip2,
ADDRINT ip3,
ADDRINT ip4,
ADDRINT ip5,
ADDRINT ip6,
ADDRINT ip7,
ADDRINT ip8,
ADDRINT ip9,
ADDRINT ip10
)
{
CheckIp(ip1, ip2, ip3, ip4, ip5, ip6, ip7, ip8, ip9, ip10);
}
VOID Instruction(INS ins, VOID *v)
{
static INT32 count = 0;
if (count % 64 == 0)
{
INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(CheckIp),
IARG_INST_PTR,
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_END);
INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(CheckIpFast),
IARG_FAST_ANALYSIS_CALL,
IARG_INST_PTR,
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_ADDRINT, INS_Address(ins),
IARG_END);
}
if (count == 0)
{
INS_InsertCall(ins, IPOINT_BEFORE, AFUNPTR(PrintArgs),
IARG_UINT32, 1,
IARG_UINT32, 2,
IARG_UINT32, 3,
IARG_UINT32, 4,
IARG_UINT32, 5,
IARG_UINT32, 6,
IARG_UINT32, 7,
IARG_UINT32, 8,
IARG_END);
}
count++;
}
int main(int argc, char * argv[])
{
PIN_Init(argc, argv);
INS_AddInstrumentFunction(Instruction, 0);
// Never returns
PIN_StartProgram();
return 0;
}