Changeset 40086 in vbox for trunk/src/VBox/VMM/testcase
- Timestamp:
- Feb 13, 2012 12:58:44 AM (13 years ago)
- svn:sync-xref-src-repo-rev:
- 76224
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/VMM/testcase/tstX86-1A.asm
r40083 r40086 1354 1354 1355 1355 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 ; 1396 SaveFPUAndGRegsToStack: 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 ; 1485 CompareFPUAndGRegsOnStack: 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 1525 SetFSW_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 1356 1533 1357 1534 ;; … … 1365 1542 fld qword REF(.r64V1) 1366 1543 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 1367 1560 1368 1561 ; the 0xd9 block … … 1383 1576 ShouldTrap X86_XCPT_UD, db 0d9h, 0d6h 1384 1577 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)? 1393 1586 ShouldTrap X86_XCPT_UD, db 0d9h, 0e2h 1394 1587 ShouldTrap X86_XCPT_UD, db 0d9h, 0e3h … … 1433 1626 1434 1627 ; the 0xdb block 1435 db 0dbh, 0e0h ; fneni1436 db 0dbh, 0e1h ; fndisi1437 db 0dbh, 0e4h ; fnsetpm1628 FpuNopEncoding db 0dbh, 0e0h ; fneni 1629 FpuNopEncoding db 0dbh, 0e1h ; fndisi 1630 FpuNopEncoding db 0dbh, 0e4h ; fnsetpm 1438 1631 ShouldTrap X86_XCPT_UD, db 0dbh, 0e5h 1439 1632 ShouldTrap X86_XCPT_UD, db 0dbh, 0e6h … … 1453 1646 1454 1647 ; 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? 1471 1664 1472 1665 ; 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? 1481 1674 ShouldTrap X86_XCPT_UD, db 0ddh, 0f0h 1482 1675 ShouldTrap X86_XCPT_UD, db 0ddh, 0f1h … … 1498 1691 ShouldTrap X86_XCPT_UD, db 0ddh, 02fh 1499 1692 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 1500 1751 1501 1752 .success: … … 1508 1759 .r64V1: dq 6.4 1509 1760 .r80V1: dt 8.0 1761 1762 ; Denormal numbers. 1763 .r32D0: dd 0200000h 1510 1764 1511 1765 ENDPROC x861_Test5
Note:
See TracChangeset
for help on using the changeset viewer.