Пример #1
0
VOID ImageLoad(IMG img, VOID *v)
{
    RTN rtn = RTN_FindByName(img, "TestIargPreserveInReplacement");

    if (RTN_Valid(rtn))
    {
        printf ("found TestIargPreserveInReplacement\n");
        fflush (stdout);
        PROTO proto = PROTO_Allocate( PIN_PARG(void), CALLINGSTD_DEFAULT,
                                      "TestIargPreserveInReplacementProto", PIN_PARG_END() );
        REGSET regsFP;
        REGSET_Clear(regsFP);
        REGSET_Insert (regsFP, REG_X87);
        RTN_ReplaceSignature(
            rtn, AFUNPTR(TestIargPreserveReplacement),
            IARG_PROTOTYPE, proto,
            IARG_CONTEXT,
            IARG_ORIG_FUNCPTR,
            IARG_PRESERVE, &regsFP,
            IARG_END);
        PROTO_Free( proto );
    }


    rtn = RTN_FindByName(img, "TestIargPreserveInReplacement1");

    if (RTN_Valid(rtn))
    {
        printf ("found TestIargPreserveInReplacement1\n");
        fflush (stdout);
        PROTO proto = PROTO_Allocate( PIN_PARG(void), CALLINGSTD_DEFAULT,
                                      "TestIargPreserveInReplacementProto", PIN_PARG_END() );

        RTN_ReplaceSignature(
            rtn, AFUNPTR(TestIargPreserveReplacement1),
            IARG_PROTOTYPE, proto,
            IARG_CONTEXT,
            IARG_ORIG_FUNCPTR,
            IARG_END);
        PROTO_Free( proto );
    }

}
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;
                    }
                }
            }
        }
    }
}