VOID  CheckContextState(CONTEXT *ctxt) 
{
    printf ("context contains PROCESSOR_STATE_X87 %d\n", PIN_ContextContainsState(ctxt, PROCESSOR_STATE_X87));
    fflush (stdout);
    if (!PIN_ContextContainsState(ctxt, PROCESSOR_STATE_X87))
    {
        printf ("***Error context does NOT contain PROCESSOR_STATE_X87\n");
        exit (-1);
    }
    printf ("context contains PROCESSOR_STATE_XMM %d\n", PIN_ContextContainsState(ctxt, PROCESSOR_STATE_XMM));
    if (!PIN_ContextContainsState(ctxt, PROCESSOR_STATE_XMM))
    {
        printf ("***Error context does NOT contain PROCESSOR_STATE_XMM\n");
        exit (-1);
    }
    printf ("context contains PROCESSOR_STATE_YMM %d\n", PIN_ContextContainsState(ctxt, PROCESSOR_STATE_YMM));
    if (!PIN_ContextContainsState(ctxt, PROCESSOR_STATE_YMM) && ProcessorSupportsAvx())
    {
        printf ("***Error context does NOT contain PROCESSOR_STATE_YMM\n");
        exit (-1);
    }
    if (PIN_ContextContainsState(ctxt, PROCESSOR_STATE_YMM) && !ProcessorSupportsAvx())
    {
        printf ("***Error context contains PROCESSOR_STATE_YMM, but processor does NOT support Ymm\n");
        exit (-1);
    }
}
int main(int argc, char * argv[])
{
    // Initialize pin
    if (PIN_Init(argc, argv)) return Usage();

    printf ("Pin supports PROCESSOR_STATE_X87 %d\n", PIN_SupportsProcessorState(PROCESSOR_STATE_X87));
    if (!PIN_SupportsProcessorState(PROCESSOR_STATE_X87))
    {
        printf ("***Error Pin does NOT support PROCESSOR_STATE_X87\n");
        exit (-1);
    }
    printf ("Pin supports PROCESSOR_STATE_XMM %d\n", PIN_SupportsProcessorState(PROCESSOR_STATE_XMM));
    if (!PIN_SupportsProcessorState(PROCESSOR_STATE_XMM))
    {
        printf ("***Error Pin does NOT support PROCESSOR_STATE_XMM\n");
        exit (-1);
    }
    printf ("Pin supports PROCESSOR_STATE_YMM %d\n", PIN_SupportsProcessorState(PROCESSOR_STATE_YMM));
    if (!PIN_SupportsProcessorState(PROCESSOR_STATE_YMM) && ProcessorSupportsAvx())
    {
        printf ("***Error Pin does NOT support PROCESSOR_STATE_YMM\n");
        exit (-1);
    }
    if (PIN_SupportsProcessorState(PROCESSOR_STATE_YMM) && !ProcessorSupportsAvx())
    {
        printf ("***Error Pin does support PROCESSOR_STATE_YMM, but processor does not\n");
        exit (-1);
    }
    // Register Instruction to be called to instrument instructions
    INS_AddInstrumentFunction(Instruction, 0);
    
    // Start the program, never returns
    PIN_StartProgram();
    
    return 0;
}
Ejemplo n.º 3
0
int main(int argc, char *argv[])
{
    PIN_Init(argc,argv);

    if (KnobContextAtTrace)
    {
        TRACE_AddInstrumentFunction(Trace, 0);
    }
    if (KnobContextAtIns)
    {
        INS_AddInstrumentFunction(Instruction, 0);
    }
    PIN_AddFiniFunction(Fini, 0);

    supportsAvx = ProcessorSupportsAvx();

    // Never returns
    PIN_StartProgram();
    
    return 0;
}
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))
        {
            xed_iclass_enum_t iclass1 = static_cast<xed_iclass_enum_t>(INS_Opcode(ins));
            if (iclass1 == XED_ICLASS_FLD1 && INS_Valid(INS_Next(ins)))
            {
                xed_iclass_enum_t iclass2 = static_cast<xed_iclass_enum_t>(INS_Opcode(INS_Next(ins)));
                if (iclass2 == XED_ICLASS_FLD1 && INS_Valid(INS_Next(INS_Next(ins))))
                {
                    xed_iclass_enum_t iclass3 = static_cast<xed_iclass_enum_t>(INS_Opcode(INS_Next(INS_Next(ins))));
                    if (iclass3 == XED_ICLASS_FLD1)
                    {
                        printf ("found fld1 sequence at %lx\n", (unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                        if (testNum == 0)
                        {
                            REGSET regsFP;
                            REGSET_Clear(regsFP);
                            REGSET_Insert (regsFP, REG_X87);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, &regsFP, IARG_END);
                            printf ("Inserted call1 to FldzToTop3 after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 1)
                        {
                            REGSET regsNone;
                            REGSET_Clear(regsNone);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, &regsNone, IARG_END);
                            printf ("Inserted call2 to FldzToTop3 after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 2)
                        {
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_END);
                            printf ("Inserted call3 to FldzToTop3 after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 3)
                        {
                            REGSET regsNone;
                            REGSET_Clear(regsNone);
                            REGSET_Insert (regsNone, REG_X87);
                            REGSET_Insert (regsNone, REG_MXCSR);
                            REGSET_Remove(regsNone, REG_X87);
                            REGSET_Remove(regsNone, REG_MXCSR);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, &regsNone, IARG_END);
                            printf ("Inserted call4 to FldzToTop3 after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 4)
                        {
                            REGSET regsXMM;
                            REGSET_Clear(regsXMM);

                            // need to declare X87 preserved also - because otherwise the fxsave/fxrstor will preserve the
                            // xmm regs 
                            REGSET_Insert (regsXMM, REG_X87);
                            
                            REGSET_Insert (regsXMM, REG_XMM0);
                            REGSET_Insert (regsXMM, REG_XMM1);
                            REGSET_Insert (regsXMM, REG_XMM2);
                            REGSET_Insert (regsXMM, REG_XMM3);
                            REGSET_Insert (regsXMM, REG_XMM4);
                            REGSET_Insert (regsXMM, REG_XMM5);
                            REGSET_Insert (regsXMM, REG_XMM6);
                            REGSET_Insert (regsXMM, REG_XMM7);
                            if (ProcessorSupportsAvx())
                            {
                                REGSET_Insert (regsXMM, REG_YMM0);
                                REGSET_Insert (regsXMM, REG_YMM1);
                                REGSET_Insert (regsXMM, REG_YMM2);
                                REGSET_Insert (regsXMM, REG_YMM3);
                                REGSET_Insert (regsXMM, REG_YMM4);
                                REGSET_Insert (regsXMM, REG_YMM5);
                                REGSET_Insert (regsXMM, REG_YMM6);
                                REGSET_Insert (regsXMM, REG_YMM7);
                            }
#ifdef TARGET_IA32E
                            REGSET_Insert (regsXMM, REG_XMM8);
                            REGSET_Insert (regsXMM, REG_XMM9);
                            REGSET_Insert (regsXMM, REG_XMM10);
                            REGSET_Insert (regsXMM, REG_XMM11);
                            REGSET_Insert (regsXMM, REG_XMM12);
                            REGSET_Insert (regsXMM, REG_XMM13);
                            REGSET_Insert (regsXMM, REG_XMM14);
                            REGSET_Insert (regsXMM, REG_XMM15);
                            if (ProcessorSupportsAvx())
                            {
                                REGSET_Insert (regsXMM, REG_YMM8);
                                REGSET_Insert (regsXMM, REG_YMM9);
                                REGSET_Insert (regsXMM, REG_YMM10);
                                REGSET_Insert (regsXMM, REG_YMM11);
                                REGSET_Insert (regsXMM, REG_YMM12);
                                REGSET_Insert (regsXMM, REG_YMM13);
                                REGSET_Insert (regsXMM, REG_YMM14);
                                REGSET_Insert (regsXMM, REG_YMM15);
                            }
#endif
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, &regsXMM, IARG_END);
                            printf ("Inserted call1 to CallToSetXmmRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 5)
                        {
                            REGSET regsNone;
                            REGSET_Clear(regsNone);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, &regsNone, IARG_END);
                            printf ("Inserted call2 to CallToSetXmmRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 6)
                        {
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_END);
                            printf ("Inserted call3 to CallToSetXmmRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 7)
                        {
                            REGSET regsXMM;
                            REGSET_Clear(regsXMM);
                            REGSET_Insert (regsXMM, REG_X87);
                            REGSET_Insert (regsXMM, REG_XMM0);
                            REGSET_Insert (regsXMM, REG_XMM1);
                            REGSET_Insert (regsXMM, REG_XMM2);
                            REGSET_Insert (regsXMM, REG_XMM3);
                            REGSET_Insert (regsXMM, REG_XMM4);
                            REGSET_Insert (regsXMM, REG_XMM5);
                            REGSET_Insert (regsXMM, REG_XMM6);
                            REGSET_Insert (regsXMM, REG_XMM7);
#ifdef TARGET_IA32E
                            REGSET_Insert (regsXMM, REG_XMM8);
                            REGSET_Insert (regsXMM, REG_XMM9);
                            REGSET_Insert (regsXMM, REG_XMM10);
                            REGSET_Insert (regsXMM, REG_XMM11);
                            REGSET_Insert (regsXMM, REG_XMM12);
                            REGSET_Insert (regsXMM, REG_XMM13);
                            REGSET_Insert (regsXMM, REG_XMM14);
                            REGSET_Insert (regsXMM, REG_XMM15);
#endif
                            REGSET_Remove (regsXMM, REG_X87);
                            REGSET_Remove (regsXMM, REG_XMM0);
                            REGSET_Remove (regsXMM, REG_XMM1);
                            REGSET_Remove (regsXMM, REG_XMM2);
                            REGSET_Remove (regsXMM, REG_XMM3);
                            REGSET_Remove (regsXMM, REG_XMM4);
                            REGSET_Remove (regsXMM, REG_XMM5);
                            REGSET_Remove (regsXMM, REG_XMM6);
                            REGSET_Remove (regsXMM, REG_XMM7);
#ifdef TARGET_IA32E
                            REGSET_Remove (regsXMM, REG_XMM8);
                            REGSET_Remove (regsXMM, REG_XMM9);
                            REGSET_Remove (regsXMM, REG_XMM10);
                            REGSET_Remove (regsXMM, REG_XMM11);
                            REGSET_Remove (regsXMM, REG_XMM12);
                            REGSET_Remove (regsXMM, REG_XMM13);
                            REGSET_Remove (regsXMM, REG_XMM14);
                            REGSET_Remove (regsXMM, REG_XMM15);
#endif
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, &regsXMM, IARG_END);
                            printf ("Inserted call4 to CallToSetXmmRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 8)
                        {
                            REGSET regsX87;
                            REGSET_Clear(regsX87);
                            REGSET_Insert (regsX87, REG_X87);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetXmmRegsToZero), IARG_PRESERVE, &regsX87, IARG_END);
                            printf ("Inserted call5 to CallToSetXmmRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
#if 0
                        // this test is not run because overwriting the integer registers can cause Pin to fail
                        else if(testNum == 9)
                        {
                            REGSET regsIntScratches;
                            REGSET_Clear(regsIntScratches);
                            REGSET_Insert (regsIntScratches, REG_GAX);
                            REGSET_Insert (regsIntScratches, REG_GCX);
                            REGSET_Insert (regsIntScratches, REG_GDX);
#ifdef TARGET_IA32E
                            REGSET_Insert (regsIntScratches, REG_R8);
                            REGSET_Insert (regsIntScratches, REG_R9);
                            REGSET_Insert (regsIntScratches, REG_R10);
                            REGSET_Insert (regsIntScratches, REG_R11);
#if defined( __GNUC__)
                            REGSET_Insert (regsIntScratches, REG_GSI);
                            REGSET_Insert (regsIntScratches, REG_GDI);
#endif
#endif
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_PRESERVE, &regsIntScratches, IARG_END);
                            printf ("Inserted call1 to CallToSetIntRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
#endif
                        else if(testNum == 9)
                        {
                            REGSET regsNone;
                            REGSET_Clear(regsNone);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_PRESERVE, &regsNone, IARG_END);
                            printf ("Inserted call2 to CallToSetIntRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 10)
                        {
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_END);
                            printf ("Inserted call3 to CallToSetIntRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 11)
                        {
                            REGSET regsNone;
                            REGSET_Clear(regsNone);
                            REGSET_Insert (regsNone, REG_GAX);
                            REGSET_Insert (regsNone, REG_GCX);
                            REGSET_Insert (regsNone, REG_GDX);
#ifdef TARGET_IA32E
                            REGSET_Insert (regsNone, REG_R8);
                            REGSET_Insert (regsNone, REG_R9);
                            REGSET_Insert (regsNone, REG_R10);
                            REGSET_Insert (regsNone, REG_R11);
#if defined( __GNUC__)
                            REGSET_Insert (regsNone, REG_GSI);
                            REGSET_Insert (regsNone, REG_GDI);
#endif
#endif
                            REGSET_Remove (regsNone, REG_GAX);
                            REGSET_Remove (regsNone, REG_GCX);
                            REGSET_Remove (regsNone, REG_GDX);
#ifdef TARGET_IA32E
                            REGSET_Remove (regsNone, REG_R8);
                            REGSET_Remove (regsNone, REG_R9);
                            REGSET_Remove (regsNone, REG_R10);
                            REGSET_Remove (regsNone, REG_R11);
#if defined( __GNUC__)
                            REGSET_Remove (regsNone, REG_GSI);
                            REGSET_Remove (regsNone, REG_GDI);
#endif
#endif
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToSetIntRegsToZero), IARG_PRESERVE, &regsNone, IARG_END);
                            printf ("Inserted call4 to CallToSetIntRegsToZero after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 12)
                        {
                            REGSET regsFP;
                            REGSET_Clear(regsFP);
                            REGSET_Insert (regsFP, REG_X87);
                            REGSET_Insert (regsFP, REG_MXCSR);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToUnMaskZeroDivideInMxcsr), IARG_PRESERVE, &regsFP, IARG_END);
                            printf ("Inserted call1 to UnMaskZeroDivideInMxcsr after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 13)
                        {
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToUnMaskZeroDivideInMxcsr), IARG_END);
                            printf ("Inserted call2 to UnMaskZeroDivideInMxcsr after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 14)
                        {
                            REGSET regsFP;
                            REGSET_Clear(regsFP);
                            REGSET_Insert (regsFP, REG_X87);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToUnMaskZeroDivideInMxcsr), IARG_END);
                            printf ("Inserted call3 to UnMaskZeroDivideInMxcsr after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                        }
                        else if(testNum == 15)
                        {
                            REGSET regsNone;
                            REGSET_Clear(regsNone);
                            INS_InsertCall(INS_Next(INS_Next(ins)), IPOINT_AFTER, AFUNPTR(CallToFldzToTop3), IARG_PRESERVE, &regsNone, IARG_END);
                            printf ("Inserted call5 to FldzToTop3 after instruction at %lx\n",
                            		(unsigned long)(INS_Address(INS_Next(INS_Next(ins)))));
                            testNum++;
                            printf ("testNum %d\n", testNum);
                        }
                        return;
                    }
                }
            }
        }
    }
}
Ejemplo n.º 5
0
REGVAL gpr32regval;
#endif
REGVAL gpr16regval;
REGVAL gprlregval;
REGVAL gprhregval;
REGVAL stregval;
#ifdef TARGET_MIC
REGVAL zmmregval;
REGVAL kregval;
#else
REGVAL xmmregval;
REGVAL ymmregval;
#endif // not TARGET_MIC

// Boolean indicating whether the system supports avx instructions and registers.
const bool hasAvxSupport = ProcessorSupportsAvx();


/////////////////////
// INTERNAL FUNCTIONS IMPLEMENTATION
/////////////////////

static inline UINT Bits2Uint64(UINT bits)
{
    assert(bits%8 == 0);
    UINT res = bits >> 6;
    if (bits%64) ++res;
    return res;
}

static inline void PrintRegval(REG reg, const REGVAL * regval, ostream& ost)