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.
96 lines
2.7 KiB
96 lines
2.7 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.
|
|
*/
|
|
|
|
/*! @file
|
|
* Check how many instructions use EAX when it contains 0, using xed APIs.
|
|
* The purpose of this test is to check INS_XedExactMapToPinReg and INS_XedExactMapFromPinReg
|
|
* APIs.
|
|
*/
|
|
|
|
#include <iostream>
|
|
#include <assert.h>
|
|
#include "pin.H"
|
|
|
|
extern "C" {
|
|
#include "xed-interface.h"
|
|
}
|
|
|
|
using std::string;
|
|
using std::endl;
|
|
using std::cout;
|
|
|
|
UINT32 eaxIsZeroCount = 0;
|
|
|
|
VOID CountIfZero(INT32 eaxVal)
|
|
{
|
|
if (!eaxVal) eaxIsZeroCount++;
|
|
}
|
|
|
|
VOID InstrumentOperand(
|
|
INS ins,
|
|
xed_decoded_inst_t const* const xedd,
|
|
xed_inst_t const* const xedi,
|
|
unsigned int operand_index)
|
|
{
|
|
const xed_operand_t* operand = xed_inst_operand(xedi, operand_index);
|
|
const xed_operand_enum_t operand_name = xed_operand_name(operand);
|
|
|
|
if (xed_operand_is_register(operand_name)) {
|
|
xed_reg_enum_t xedreg = xed_decoded_inst_get_reg(xedd, operand_name);
|
|
xed_reg_class_enum_t reg_class = xed_reg_class(xedreg);
|
|
if (reg_class == XED_REG_CLASS_GPR) {
|
|
xed_reg_enum_t fullXedreg = xed_get_largest_enclosing_register(xedreg);
|
|
xed_reg_enum_t fullXedregTarget;
|
|
#if defined(TARGET_IA32)
|
|
fullXedregTarget = static_cast<xed_reg_enum_t>(fullXedreg - XED_REG_GPR64_FIRST + XED_REG_GPR32_FIRST);
|
|
#else
|
|
fullXedregTarget = fullXedreg;
|
|
#endif
|
|
REG pinreg = INS_XedExactMapToPinReg(fullXedregTarget);
|
|
//check INS_XedExactMapFromPinReg
|
|
xed_reg_enum_t xed_reg2=INS_XedExactMapFromPinReg(pinreg);
|
|
ASSERTX(xed_reg2 == fullXedregTarget);
|
|
|
|
if (pinreg == REG_EAX)
|
|
INS_InsertCall(ins, IPOINT_BEFORE, (AFUNPTR)CountIfZero, IARG_REG_VALUE, REG_EAX, IARG_END);
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
VOID Ins(INS ins, VOID* v)
|
|
{
|
|
xed_decoded_inst_t const* const xedd = INS_XedDec(ins);
|
|
const xed_inst_t* xedi = xed_decoded_inst_inst(xedd);
|
|
const unsigned int operand_count = xed_inst_noperands(xedi);
|
|
for (unsigned int i=0 ; i < operand_count ; i++)
|
|
InstrumentOperand(ins, xedd, xedi, i);
|
|
}
|
|
|
|
VOID Fini(INT32 code, VOID *v)
|
|
{
|
|
cout << "eaxIsZeroCount = " << eaxIsZeroCount << endl;
|
|
}
|
|
|
|
int main(INT32 argc, CHAR **argv)
|
|
{
|
|
PIN_InitSymbols();
|
|
PIN_Init(argc, argv);
|
|
|
|
INS_AddInstrumentFunction(Ins, 0);
|
|
PIN_AddFiniFunction(Fini, 0);
|
|
|
|
// Never returns
|
|
PIN_StartProgram();
|
|
|
|
return 0;
|
|
}
|