VirtualBox

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


Ignore:
Timestamp:
Feb 13, 2012 12:58:44 AM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
76224
Message:

More FPU instruction stubs and attempts at figuring out what the reserved opcodes does.

File:
1 edited

Legend:

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

    r40083 r40086  
    13541354
    13551355
     1356;;
     1357; Tests an reserved FPU encoding, checking that it does not affect the FPU or
     1358; CPU state in any way.
     1359;
     1360; @uses stack
     1361%macro FpuNopEncoding 1+
     1362        fnclex
     1363        call    SetFSW_C0_thru_C3
     1364
     1365        push    xBP
     1366        mov     xBP, xSP
     1367        sub     xSP, 1024
     1368        and     xSP, ~0fh
     1369        call    SaveFPUAndGRegsToStack
     1370        %1
     1371        call    CompareFPUAndGRegsOnStack
     1372        leave
     1373
     1374        jz      %%ok
     1375        add     eax, __LINE__
     1376        jmp     .return
     1377%%ok:
     1378%endmacro
     1379
     1380;;
     1381; Used for marking encodings which has a meaning other than FNOP and
     1382; needs investigating.
     1383%macro FpuUnknownEncoding 1+
     1384        %1
     1385%endmacro
     1386
     1387
     1388;;
     1389; Saves the FPU and general registers to the stack area right next to the
     1390; return address.
     1391;
     1392; The required area size is 512 + 80h = 640.
     1393;
     1394; @uses Nothing, except stack.
     1395;
     1396SaveFPUAndGRegsToStack:
     1397        ; Must clear the FXSAVE area.
     1398        pushf
     1399        push    xCX
     1400        push    xAX
     1401        push    xDI
     1402
     1403        lea     xDI, [xSP + xS * 5]
     1404        mov     xCX, 512 / 4
     1405        mov     eax, 0cccccccch
     1406        cld
     1407        rep stosd
     1408
     1409        pop     xDI
     1410        pop     xAX
     1411        pop     xCX
     1412        popf
     1413
     1414        ; Save the FPU state.
     1415        fxsave  [xSP + xS]
     1416
     1417        ; Save GRegs (80h bytes).
     1418%ifdef RT_ARCH_AMD64
     1419        mov     [xSP + 512 + xS + 000h], xAX
     1420        mov     [xSP + 512 + xS + 008h], xBX
     1421        mov     [xSP + 512 + xS + 010h], xCX
     1422        mov     [xSP + 512 + xS + 018h], xDX
     1423        mov     [xSP + 512 + xS + 020h], xDI
     1424        mov     [xSP + 512 + xS + 028h], xSI
     1425        mov     [xSP + 512 + xS + 030h], xBP
     1426        mov     [xSP + 512 + xS + 038h], r8
     1427        mov     [xSP + 512 + xS + 040h], r9
     1428        mov     [xSP + 512 + xS + 048h], r10
     1429        mov     [xSP + 512 + xS + 050h], r11
     1430        mov     [xSP + 512 + xS + 058h], r12
     1431        mov     [xSP + 512 + xS + 060h], r13
     1432        mov     [xSP + 512 + xS + 068h], r14
     1433        mov     [xSP + 512 + xS + 070h], r15
     1434        pushf
     1435        pop     rax
     1436        mov     [xSP + 512 + xS + 078h], rax
     1437        mov     rax, [xSP + 512 + xS + 000h]
     1438%else
     1439        mov     [xSP + 512 + xS + 000h], eax
     1440        mov     [xSP + 512 + xS + 004h], eax
     1441        mov     [xSP + 512 + xS + 008h], ebx
     1442        mov     [xSP + 512 + xS + 00ch], ebx
     1443        mov     [xSP + 512 + xS + 010h], ecx
     1444        mov     [xSP + 512 + xS + 014h], ecx
     1445        mov     [xSP + 512 + xS + 018h], edx
     1446        mov     [xSP + 512 + xS + 01ch], edx
     1447        mov     [xSP + 512 + xS + 020h], edi
     1448        mov     [xSP + 512 + xS + 024h], edi
     1449        mov     [xSP + 512 + xS + 028h], esi
     1450        mov     [xSP + 512 + xS + 02ch], esi
     1451        mov     [xSP + 512 + xS + 030h], ebp
     1452        mov     [xSP + 512 + xS + 034h], ebp
     1453        mov     [xSP + 512 + xS + 038h], eax
     1454        mov     [xSP + 512 + xS + 03ch], eax
     1455        mov     [xSP + 512 + xS + 040h], eax
     1456        mov     [xSP + 512 + xS + 044h], eax
     1457        mov     [xSP + 512 + xS + 048h], eax
     1458        mov     [xSP + 512 + xS + 04ch], eax
     1459        mov     [xSP + 512 + xS + 050h], eax
     1460        mov     [xSP + 512 + xS + 054h], eax
     1461        mov     [xSP + 512 + xS + 058h], eax
     1462        mov     [xSP + 512 + xS + 05ch], eax
     1463        mov     [xSP + 512 + xS + 060h], eax
     1464        mov     [xSP + 512 + xS + 064h], eax
     1465        mov     [xSP + 512 + xS + 068h], eax
     1466        mov     [xSP + 512 + xS + 06ch], eax
     1467        mov     [xSP + 512 + xS + 070h], eax
     1468        mov     [xSP + 512 + xS + 074h], eax
     1469        pushf
     1470        pop     eax
     1471        mov     [xSP + 512 + xS + 078h], eax
     1472        mov     [xSP + 512 + xS + 07ch], eax
     1473        mov     eax, [xSP + 512 + xS + 000h]
     1474%endif
     1475        ret
     1476
     1477;;
     1478; Compares the current FPU and general registers to that found in the stack
     1479; area prior to the return address.
     1480;
     1481; @uses     Stack, flags and eax/rax.
     1482; @returns  eax is zero on success, eax is 1000000 * offset on failure.
     1483;           ZF reflects the eax value to save a couple of instructions...
     1484;
     1485CompareFPUAndGRegsOnStack:
     1486        lea     xSP, [xSP - (1024 - xS)]
     1487        call    SaveFPUAndGRegsToStack
     1488
     1489        push    xSI
     1490        push    xDI
     1491        push    xCX
     1492
     1493        mov     xCX, 640
     1494        lea     xSI, [xSP + xS*3]
     1495        lea     xDI, [xSI + 1024]
     1496
     1497        mov     dword [xSI + 0x8], 0    ; ignore FPUIP
     1498        mov     dword [xDI + 0x8], 0    ; ignore FPUIP
     1499
     1500        cld
     1501        repe cmpsb
     1502        je      .ok
     1503
     1504        ;int3
     1505        lea     xAX, [xSP + xS*3]
     1506        xchg    xAX, xSI
     1507        sub     xAX, xSI
     1508
     1509        push    xDX
     1510        mov     xDX, 1000000
     1511        mul     xDX
     1512        pop     xDX
     1513        jmp     .return
     1514.ok:
     1515        xor     eax, eax
     1516.return:
     1517        pop     xCX
     1518        pop     xDI
     1519        pop     xSI
     1520        lea     xSP, [xSP + (1024 - xS)]
     1521        or      eax, eax
     1522        ret
     1523
     1524
     1525SetFSW_C0_thru_C3:
     1526        sub     xSP, 20h
     1527        fstenv  [xSP]
     1528        or      word [xSP + 4], X86_FSW_C0 | X86_FSW_C1 | X86_FSW_C2 | X86_FSW_C3
     1529        fldenv  [xSP]
     1530        add     xSP, 20h
     1531        ret
     1532
    13561533
    13571534;;
     
    13651542        fld qword REF(.r64V1)
    13661543        fld tword REF(.r80V1)
     1544        fld qword REF(.r64V1)
     1545        fld dword REF(.r32V1)
     1546        fld qword REF(.r64V1)
     1547
     1548        ; Test the nop check.
     1549        FpuNopEncoding fnop
     1550
     1551;FpuNopEncoding db 0dch, 0d8h
     1552;int3
     1553;db 0dch, 0d0h
     1554;        fld dword REF(.r32V1)
     1555;        fld dword REF(.r32D0)
     1556;int3
     1557;db 0dch, 0d9h ; fnop?
     1558;int3
     1559
    13671560
    13681561        ; the 0xd9 block
     
    13831576        ShouldTrap X86_XCPT_UD, db 0d9h, 0d6h
    13841577        ShouldTrap X86_XCPT_UD, db 0d9h, 0d7h
    1385         db 0d9h, 0d8h ; fnop?
    1386         db 0d9h, 0d9h ; fnop?
    1387         db 0d9h, 0dah ; fnop?
    1388         db 0d9h, 0dbh ; fnop?
    1389         db 0d9h, 0dch ; fnop?
    1390         db 0d9h, 0ddh ; fnop?
    1391         db 0d9h, 0deh ; fnop?
    1392         db 0d9h, 0dfh ; fnop?
     1578        ;FpuUnknownEncoding db 0d9h, 0d8h ; fstp st(0),st(0)?
     1579        ;FpuUnknownEncoding db 0d9h, 0d9h ; fstp st(1),st(0)?
     1580        ;FpuUnknownEncoding db 0d9h, 0dah ; fstp st(2),st(0)?
     1581        ;FpuUnknownEncoding db 0d9h, 0dbh ; fstp st(3),st(0)?
     1582        ;FpuUnknownEncoding db 0d9h, 0dch ; fstp st(4),st(0)?
     1583        ;FpuUnknownEncoding db 0d9h, 0ddh ; fstp st(5),st(0)?
     1584        ;FpuUnknownEncoding db 0d9h, 0deh ; fstp st(6),st(0)?
     1585        ;FpuUnknownEncoding db 0d9h, 0dfh ; fstp st(7),st(0)?
    13931586        ShouldTrap X86_XCPT_UD, db 0d9h, 0e2h
    13941587        ShouldTrap X86_XCPT_UD, db 0d9h, 0e3h
     
    14331626
    14341627        ; the 0xdb block
    1435         db 0dbh, 0e0h ; fneni
    1436         db 0dbh, 0e1h ; fndisi
    1437         db 0dbh, 0e4h ; fnsetpm
     1628        FpuNopEncoding db 0dbh, 0e0h ; fneni
     1629        FpuNopEncoding db 0dbh, 0e1h ; fndisi
     1630        FpuNopEncoding db 0dbh, 0e4h ; fnsetpm
    14381631        ShouldTrap X86_XCPT_UD, db 0dbh, 0e5h
    14391632        ShouldTrap X86_XCPT_UD, db 0dbh, 0e6h
     
    14531646
    14541647        ; the 0xdc block
    1455         db 0dbh, 0d0h ; fnop?
    1456         db 0dbh, 0d1h ; fnop?
    1457         db 0dbh, 0d2h ; fnop?
    1458         db 0dbh, 0d3h ; fnop?
    1459         db 0dbh, 0d4h ; fnop?
    1460         db 0dbh, 0d5h ; fnop?
    1461         db 0dbh, 0d6h ; fnop?
    1462         db 0dbh, 0d7h ; fnop?
    1463         db 0dbh, 0d8h ; fnop?
    1464         db 0dbh, 0d9h ; fnop?
    1465         db 0dbh, 0dah ; fnop?
    1466         db 0dbh, 0dbh ; fnop?
    1467         db 0dbh, 0dch ; fnop?
    1468         db 0dbh, 0ddh ; fnop?
    1469         db 0dbh, 0deh ; fnop?
    1470         db 0dbh, 0dfh ; fnop?
     1648        ;FpuNopEncoding db 0dch, 0d0h ; fcom?
     1649        ;FpuNopEncoding db 0dch, 0d1h ; fcom?
     1650        ;FpuNopEncoding db 0dch, 0d2h ; fcom?
     1651        ;FpuNopEncoding db 0dch, 0d3h ; fcom?
     1652        ;FpuNopEncoding db 0dch, 0d4h ; fcom?
     1653        ;FpuNopEncoding db 0dch, 0d5h ; fcom?
     1654        ;FpuNopEncoding db 0dch, 0d6h ; fcom?
     1655        ;FpuNopEncoding db 0dch, 0d7h ; fcom?
     1656        ;FpuNopEncoding db 0dch, 0d8h ; fcomp?
     1657        ;FpuNopEncoding db 0dch, 0d9h ; fcomp?
     1658        ;FpuNopEncoding db 0dch, 0dah ; fcomp?
     1659        ;FpuNopEncoding db 0dch, 0dbh ; fcomp?
     1660        ;FpuNopEncoding db 0dch, 0dch ; fcomp?
     1661        ;FpuNopEncoding db 0dch, 0ddh ; fcomp?
     1662        ;FpuNopEncoding db 0dch, 0deh ; fcomp?
     1663        ;FpuNopEncoding db 0dch, 0dfh ; fcomp?
    14711664
    14721665        ; the 0xdd block
    1473         db 0ddh, 0c0h ; fnop?
    1474         db 0ddh, 0c1h ; fnop?
    1475         db 0ddh, 0c2h ; fnop?
    1476         db 0ddh, 0c3h ; fnop?
    1477         db 0ddh, 0c4h ; fnop?
    1478         db 0ddh, 0c5h ; fnop?
    1479         db 0ddh, 0c6h ; fnop?
    1480         db 0ddh, 0c7h ; fnop?
     1666        FpuNopEncoding db 0ddh, 0c8h ; fnop?
     1667        FpuUnknownEncoding db 0ddh, 0c9h ; fnop?
     1668        FpuUnknownEncoding db 0ddh, 0cah ; fnop?
     1669        FpuUnknownEncoding db 0ddh, 0cbh ; fnop?
     1670        FpuUnknownEncoding db 0ddh, 0cch ; fnop?
     1671        FpuUnknownEncoding db 0ddh, 0cdh ; fnop?
     1672        FpuUnknownEncoding db 0ddh, 0ceh ; fnop?
     1673        FpuUnknownEncoding db 0ddh, 0cfh ; fnop?
    14811674        ShouldTrap X86_XCPT_UD, db 0ddh, 0f0h
    14821675        ShouldTrap X86_XCPT_UD, db 0ddh, 0f1h
     
    14981691        ShouldTrap X86_XCPT_UD, db 0ddh, 02fh
    14991692
     1693        ; the 0xde block
     1694        FpuUnknownEncoding db 0deh, 0d0h ; fnop?
     1695        FpuUnknownEncoding db 0deh, 0d1h ; fnop?
     1696        FpuUnknownEncoding db 0deh, 0d2h ; fnop?
     1697        FpuUnknownEncoding db 0deh, 0d3h ; fnop?
     1698        FpuUnknownEncoding db 0deh, 0d4h ; fnop?
     1699        FpuUnknownEncoding db 0deh, 0d5h ; fnop?
     1700        FpuUnknownEncoding db 0deh, 0d6h ; fnop?
     1701        FpuUnknownEncoding db 0deh, 0d7h ; fnop?
     1702        ShouldTrap X86_XCPT_UD, db 0deh, 0d8h
     1703        ShouldTrap X86_XCPT_UD, db 0deh, 0dah
     1704        ShouldTrap X86_XCPT_UD, db 0deh, 0dbh
     1705        ShouldTrap X86_XCPT_UD, db 0deh, 0dch
     1706        ShouldTrap X86_XCPT_UD, db 0deh, 0ddh
     1707        ShouldTrap X86_XCPT_UD, db 0deh, 0deh
     1708        ShouldTrap X86_XCPT_UD, db 0deh, 0dfh
     1709
     1710        ; the 0xdf block
     1711        FpuUnknownEncoding db 0dfh, 0c8h ; fnop?
     1712        FpuUnknownEncoding db 0dfh, 0c9h ; fnop?
     1713        FpuUnknownEncoding db 0dfh, 0cah ; fnop?
     1714        FpuUnknownEncoding db 0dfh, 0cbh ; fnop?
     1715        FpuUnknownEncoding db 0dfh, 0cch ; fnop?
     1716        FpuUnknownEncoding db 0dfh, 0cdh ; fnop?
     1717        FpuUnknownEncoding db 0dfh, 0ceh ; fnop?
     1718        FpuUnknownEncoding db 0dfh, 0cfh ; fnop?
     1719        FpuUnknownEncoding db 0dfh, 0d0h ; fnop?
     1720        FpuUnknownEncoding db 0dfh, 0d1h ; fnop?
     1721        FpuUnknownEncoding db 0dfh, 0d2h ; fnop?
     1722        FpuUnknownEncoding db 0dfh, 0d3h ; fnop?
     1723        FpuUnknownEncoding db 0dfh, 0d4h ; fnop?
     1724        FpuUnknownEncoding db 0dfh, 0d5h ; fnop?
     1725        FpuUnknownEncoding db 0dfh, 0d6h ; fnop?
     1726        FpuUnknownEncoding db 0dfh, 0d7h ; fnop?
     1727        FpuUnknownEncoding db 0dfh, 0d8h ; fnop?
     1728        FpuUnknownEncoding db 0dfh, 0d9h ; fnop?
     1729        FpuUnknownEncoding db 0dfh, 0dah ; fnop?
     1730        FpuUnknownEncoding db 0dfh, 0dbh ; fnop?
     1731        FpuUnknownEncoding db 0dfh, 0dch ; fnop?
     1732        FpuUnknownEncoding db 0dfh, 0ddh ; fnop?
     1733        FpuUnknownEncoding db 0dfh, 0deh ; fnop?
     1734        FpuUnknownEncoding db 0dfh, 0dfh ; fnop?
     1735        ShouldTrap X86_XCPT_UD, db 0dfh, 0e1h
     1736        ShouldTrap X86_XCPT_UD, db 0dfh, 0e2h
     1737        ShouldTrap X86_XCPT_UD, db 0dfh, 0e3h
     1738        ShouldTrap X86_XCPT_UD, db 0dfh, 0e4h
     1739        ShouldTrap X86_XCPT_UD, db 0dfh, 0e5h
     1740        ShouldTrap X86_XCPT_UD, db 0dfh, 0e6h
     1741        ShouldTrap X86_XCPT_UD, db 0dfh, 0e7h
     1742        ShouldTrap X86_XCPT_UD, db 0dfh, 0f8h
     1743        ShouldTrap X86_XCPT_UD, db 0dfh, 0f9h
     1744        ShouldTrap X86_XCPT_UD, db 0dfh, 0fah
     1745        ShouldTrap X86_XCPT_UD, db 0dfh, 0fbh
     1746        ShouldTrap X86_XCPT_UD, db 0dfh, 0fch
     1747        ShouldTrap X86_XCPT_UD, db 0dfh, 0fdh
     1748        ShouldTrap X86_XCPT_UD, db 0dfh, 0feh
     1749        ShouldTrap X86_XCPT_UD, db 0dfh, 0ffh
     1750
    15001751
    15011752.success:
     
    15081759.r64V1: dq 6.4
    15091760.r80V1: dt 8.0
     1761
     1762; Denormal numbers.
     1763.r32D0: dd 0200000h
    15101764
    15111765ENDPROC     x861_Test5
Note: See TracChangeset for help on using the changeset viewer.

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