Hi,

Thanks for the testcase. I took a look at your patch and the testcase.

I don't think injecting #DB directly the way you're suggesting is the right thing to do. The right fix, as far as I can see, would be to setup the pending debug exceptions VMCS field, that way VMX injects the #DB taking into account the priority of exceptions.

The fix would be to simply remove the "if (fBlockSti || fBlockMovSS)" in hmR0VmxInjectPendingEvent() but I've not yet tested if it works. Once I test that it works, I'll do the needful. I need to verify that I'm not screwing up something else in the block-by-STI and block-by-MovSS scenarios.

Thanks again for the patch!

Regards,
Ram.


On 11/12/2013 01:44 PM, Konrad Kuźmiński wrote:
Hi,

It looks like gmail silently failed to attach the file and didn't even notify me about this. I reattached my program in this message. It was compiled with MASM using attached script and tested under Windows XP SP3 host and guest.

Here's the bat file I used for compilation (I cannot attach such files):
@REM Make sure this path is correct before attempting to build
@set MASM_PATH=C:\masm32
@set PATH=%PATH%;%MASM_PATH%\bin

ml -c -coff -I%MASM_PATH%\include 10947_test.asm
link /ENTRY:start /SUBSYSTEM:CONSOLE /LIBPATH:%MASM_PATH%\lib 10947_test.obj

Regards,
Konrad


2013/11/12 Ramshankar <[email protected] <mailto:[email protected]>>

    Hi,

    You said in the attachment, you have included a testcase, I can't
    find any attachment in your original email. Could you please
    re-attach it?

    Regards,
    Ram.


    On 11/09/2013 05:01 AM, Ramshankar wrote:

        Hi,

        Thank you for the patch. I'll take a look at it next week.

        Regards,
        Ram.

        On 08/11/13 22:13, Konrad Kuźmiński wrote:

            Hi,

            I've made a fix for this bug
            https://www.virtualbox.org/ticket/10947.
            Mentioned ticket isn't very descriptive so I will try to
            explain this
            issue a little bit more in detail. First of all this
            problem occurs only
            when VT-x is enabled. Basically some instructions don't
            generate
            expected single step exception after they are executed
            with the trap
            flag being set. The behaviour is observed that such
            instructions are
            executed under the control of the guest system but single
            step exception
            is generated after the next instruction. This is a well
            known bug
            amongst malware researchers and malware authors who can
            easily take
            advantage of this fact in order to detect virtualized
            environment.

            It turns out that the problem lies in the way VirtualBox
            handles some VM
            exits initiated by the execution of certain instructions.
            Several
            instructions can never be executed in VMX non-root
            operation and those
            need to be emulated and skipped within VM exit handlers by
            adjusting
            RIP. Unfortunately the code lacks necessary check for the
            trap flag
            being set, so it doesn't inject expected exception into
            the guest.

            Here's the fix:
            *** src\VBox\VMM\VMMR0\HMVMXR0_original.cpp    2013-11-01
            18:58:26.000000000 +0100
            --- src\VBox\VMM\VMMR0\HMVMXR0_fixed.cpp      2013-11-08
            20:24:30.578125000 +0100
            ***************
            *** 8166,8181 ****
            --- 8166,8190 ----
                DECLINLINE(int) hmR0VmxAdvanceGuestRip(PVMCPU pVCpu,
            PCPUMCTX
            pMixedCtx, PVMXTRANSIENT pVmxTransient)
                {
                    int rc = hmR0VmxReadExitInstrLenVmcs(pVCpu,
            pVmxTransient);
                    rc    |= hmR0VmxSaveGuestRip(pVCpu, pMixedCtx);
                    AssertRCReturn(rc, rc);

                    pMixedCtx->rip += pVmxTransient->cbInstr;
                    VMCPU_HMCF_SET(pVCpu, HM_CHANGED_GUEST_RIP);
            +
            +     X86EFLAGS Eflags;
            +     rc = VMXReadVmcs32(VMX_VMCS_GUEST_RFLAGS, &Eflags.u32);
            +     AssertRCReturn(rc, rc);
            +     if (Eflags.Bits.u1TF)
            +     {
            +         hmR0VmxSetPendingXcptDB(pVCpu, pMixedCtx);
            +     }
            +
                    return rc;
                }

            This fix ensures correct handling of mentioned condition
            in all 13
            affected VM exit handlers: VMX_EXIT_CPUID, VMX_EXIT_RDTSC,
            VMX_EXIT_RDTSCP, VMX_EXIT_RDPMC, VMX_EXIT_MOV_CRX,
            VMX_EXIT_MOV_DRX,
            VMX_EXIT_MWAIT, VMX_EXIT_MONITOR, VMX_EXIT_RDMSR,
            VMX_EXIT_WRMSR,
            VMX_EXIT_INVD, VMX_EXIT_INVLPG, VMX_EXIT_WBINVD.

            In the attachment I provided a simple program which can be
            used to test
            this condition on 2 representative instructions: CPUID and
            RDTSC. I
            picked those because they don't require CPL = 0.

            I release this patch and test program under MIT license.

            Best regards,
            Konrad


            _______________________________________________
            vbox-dev mailing list
            [email protected] <mailto:[email protected]>
            https://www.virtualbox.org/mailman/listinfo/vbox-dev


        _______________________________________________
        vbox-dev mailing list
        [email protected] <mailto:[email protected]>
        https://www.virtualbox.org/mailman/listinfo/vbox-dev




_______________________________________________
vbox-dev mailing list
[email protected]
https://www.virtualbox.org/mailman/listinfo/vbox-dev

Reply via email to