VirtualBox

Changeset 40139 in vbox for trunk/src/VBox/VMM/testcase


Ignore:
Timestamp:
Feb 15, 2012 9:10:19 PM (13 years ago)
Author:
vboxsync
Message:

tstX86-1: FDIV m64r -> #PF tests.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/testcase/tstX86-1A.asm

    r40138 r40139  
    16451645        call    SaveFPUAndGRegsToStack
    16461646        %1
    1647         call    CompareFPUAndGRegsOnStack
     1647        call    CompareFPUAndGRegsOnStackIgnoreOpAndIp
    16481648        leave
    16491649
     
    16711671        arch_fxrstor [xSP + 1024]
    16721672        %2
    1673         call    CompareFPUAndGRegsOnStack
     1673        call    CompareFPUAndGRegsOnStackIgnoreOpAndIp
    16741674        ;arch_fxrstor [xSP + 1024]
    16751675        leave
     
    17911791        lea     xDI, [xSI + 1024]
    17921792
     1793        cld
     1794        repe cmpsb
     1795        je      .ok
     1796
     1797        ;int3
     1798        lea     xAX, [xSP + xS*3]
     1799        xchg    xAX, xSI
     1800        sub     xAX, xSI
     1801
     1802        push    xDX
     1803        mov     xDX, 1000000
     1804        mul     xDX
     1805        pop     xDX
     1806        jmp     .return
     1807.ok:
     1808        xor     eax, eax
     1809.return:
     1810        pop     xCX
     1811        pop     xDI
     1812        pop     xSI
     1813        lea     xSP, [xSP + (1024 - xS)]
     1814        or      eax, eax
     1815        ret
     1816
     1817;;
     1818; Same as CompareFPUAndGRegsOnStack, except that it ignores the FOP and FPUIP
     1819; registers.
     1820;
     1821; @uses     Stack, flags and eax/rax.
     1822; @returns  eax is zero on success, eax is 1000000 * offset on failure.
     1823;           ZF reflects the eax value to save a couple of instructions...
     1824;
     1825CompareFPUAndGRegsOnStackIgnoreOpAndIp:
     1826        lea     xSP, [xSP - (1024 - xS)]
     1827        call    SaveFPUAndGRegsToStack
     1828
     1829        push    xSI
     1830        push    xDI
     1831        push    xCX
     1832
     1833        mov     xCX, 640
     1834        lea     xSI, [xSP + xS*3]
     1835        lea     xDI, [xSI + 1024]
     1836
    17931837        mov     word [xSI + X86FXSTATE.FOP], 0          ; ignore
     1838        mov     word [xDI + X86FXSTATE.FOP], 0          ; ignore
    17941839        mov     dword [xSI + X86FXSTATE.FPUIP], 0       ; ignore
    1795         mov     dword [xDI + X86FXSTATE.FPUDP], 0       ; ignore
     1840        mov     dword [xDI + X86FXSTATE.FPUIP], 0       ; ignore
    17961841
    17971842        cld
     
    23592404
    23602405;;
     2406; Checks that the FPU and GReg state is completely unchanged after an instruction
     2407; resulting in a CPU trap.
     2408;
     2409; @param        1       The trap number.
     2410; @param        2+      The instruction which should trap.
     2411;
     2412%macro FpuCheckCpuTrapUnchangedState 2+
     2413        call    SaveFPUAndGRegsToStack
     2414        ShouldTrap %1, %2
     2415        call    CompareFPUAndGRegsOnStack
     2416        jz      %%ok
     2417        or      eax, __LINE__
     2418        jmp     .return
     2419%%ok:
     2420%endmacro
     2421
     2422
     2423;;
    23612424; Initialize the FPU and set CW to %1.
    23622425;
     
    23782441        SAVE_ALL_PROLOGUE
    23792442        sub     xSP, 2048
    2380 
    2381         ; Make xBX (preserved accross calls) point to the invalid page.
    2382         mov     xBX, [REF_EXTERN(g_pbEfExecPage)]
    2383         add     xBX, PAGE_SIZE
    23842443
    23852444        ;
     
    24612520
    24622521        ; ## Unmasked exceptions. ##
    2463 %if 1
    24642522        ; Stack underflow - TOP and ST0 unmodified.
    24652523        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     
    25232581        FxSaveCheckFSW xSP, X86_FSW_DE | X86_FSW_ES | X86_FSW_B, X86_FSW_C0 | X86_FSW_C2 | X86_FSW_C3
    25242582        FxSaveCheckSt0ValueConst xSP, REF(g_r80_One)
    2525 %endif
     2583
     2584        ;;; @todo exception priority checks.
     2585
    25262586
    25272587
    25282588        ; ## A couple of variations on the #PF theme. ##
     2589
     2590        FpuInitWithCW X86_FCW_PC_64 | X86_FCW_RC_NEAREST
     2591        mov     xBX, [REF_EXTERN(g_pbEfExecPage)]
     2592        FpuCheckCpuTrapUnchangedState X86_XCPT_PF, fdiv qword [xBX + PAGE_SIZE]
     2593
     2594        ; Check that a pending FPU exception takes precedence over a #PF.
     2595        fninit
     2596        fdiv    qword [REF(g_r64_One)]
     2597        fstcw   [xSP]
     2598        and      word [xSP], ~(X86_FCW_IM)
     2599        fldcw   [xSP]
     2600        mov     xBX, [REF_EXTERN(g_pbEfExecPage)]
     2601        ShouldTrap X86_XCPT_MF, fdiv qword [xBX + PAGE_SIZE]
    25292602
    25302603.success:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette