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.

121 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 test verifies "Isret" and "IsIret" return the appropriate return values
that defined in the documentation.
*/
#include <cstdio>
#include <iostream>
#include "pin.H"
BOOL testIsRetForRet = false;
BOOL testIsRetForIret = false;
BOOL testIsIretForIret = false;
BOOL testNotIsIretForRet = false;
inline BOOL isIretOpcode(INS ins)
{
return (INS_Opcode(ins) == XED_ICLASS_IRET || INS_Opcode(ins) == XED_ICLASS_IRETD || \
INS_Opcode(ins) == XED_ICLASS_IRETQ);
}
inline BOOL isRetOpcode(INS ins)
{
return (INS_Opcode(ins) == XED_ICLASS_RET_NEAR || INS_Opcode(ins) == XED_ICLASS_RET_FAR);
}
VOID Instruction(INS ins, VOID *v)
{
//ret not iret instruction
if(isRetOpcode(ins))
{
if (!INS_IsRet(ins))
{
printf ("***Error Isret returns false for ret instruction. \n");
PIN_ExitProcess(3);
}
testIsRetForRet = true;
if (INS_IsIRet(ins))
{
printf ("***Error IsIret returns true for ret (not iret) instruction. \n");
PIN_ExitProcess(4);
}
testNotIsIretForRet = true;
}
//iret instruction
else if(isIretOpcode(ins))
{
if (!INS_IsRet(ins))
{
printf ("***Error Isret returns false for ret(itret) instruction. \n");
PIN_ExitProcess(5);
}
testIsRetForIret = true;
if (!INS_IsIRet(ins))
{
printf ("***Error IsIret returns false for iret instruction. \n");
PIN_ExitProcess(6);
}
testIsIretForIret = true;
}
else //not ret or iret
{
if (INS_IsRet(ins))
{
printf ("***Error Isret returns true for not ret instruction. \n");
PIN_ExitProcess(1);
}
if (INS_IsIRet(ins))
{
printf ("***Error IsIret returns true for not iret(not even ret) instruction. \n");
PIN_ExitProcess(2);
}
}
}
VOID Fini(INT32 code, VOID *v)
{
if (!testIsRetForRet)
{
printf ("***Error did not check: Isret returns true for ret instruction. \n");
PIN_ExitProcess(1);
}
if (!testIsRetForIret)
{
printf ("***Error did not check: Isret returns true for iret instruction. \n");
PIN_ExitProcess(2);
}
if (!testIsIretForIret)
{
printf ("***Error did not check: IsIret returns true for iret instruction. \n");
PIN_ExitProcess(3);
}
if (!testNotIsIretForRet)
{
printf ("***Error did not check: IsIret returns false for ret instruction. \n");
PIN_ExitProcess(4);
}
}
int main(INT32 argc, CHAR **argv)
{
PIN_Init(argc, argv);
INS_AddInstrumentFunction(Instruction, 0);
PIN_AddFiniFunction(Fini, 0);
// Never returns
PIN_StartProgram();
return 7;
}