Changeset 65511 in vbox
- Timestamp:
- Jan 29, 2017 6:05:28 PM (8 years ago)
- svn:sync-xref-src-repo-rev:
- 113145
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-pf.c32
r65408 r65511 89 89 /** The common mode functions. */ 90 90 PCBS3CPUBASIC2PFTTSTCMNMODE pCmnMode; 91 /** Pointer to the test area (alias). */ 92 uint8_t *pbTest; 91 /** Address of the test area (alias). */ 92 union 93 { 94 uint64_t u; 95 uint32_t u32; 96 uint16_t u16; 97 } uTestAddr; 93 98 /** Pointer to the orignal test area mapping. */ 94 99 uint8_t *pbOrgTest; … … 102 107 /** The number of PDEs for cTestPages. */ 103 108 uint16_t cTestPdes; 104 /** 16-bit data selector for pbTest. */109 /** 16-bit data selector for uTestAddr.u32. */ 105 110 uint16_t uSel16TestData; 106 /** 16-bit code selector for pbTest. */111 /** 16-bit code selector for uTestAddr.u32. */ 107 112 uint16_t uSel16TestCode; 108 113 /** The size of the PDE backup. */ … … 110 115 /** The size of the PTE backup. */ 111 116 uint16_t cbPteBackup; 112 /** Test paging information for pbTest. */117 /** Test paging information for uTestAddr.u. */ 113 118 BS3PAGINGINFO4ADDR PgInfo; 114 119 … … 416 421 { 417 422 default: 418 pCtx->rip.u = (uintptr_t)&pThis->pbTest[off];423 pCtx->rip.u = pThis->uTestAddr.u + off; 419 424 break; 420 425 case BS3_MODE_CODE_16: 421 Bs3SelSetup16BitCode(&Bs3GdteSpare01, (uintptr_t)pThis->pbTest, pCtx->bCpl);426 Bs3SelSetup16BitCode(&Bs3GdteSpare01, pThis->uTestAddr.u32, pCtx->bCpl); 422 427 pCtx->rip.u = off; 423 428 pCtx->cs = BS3_SEL_SPARE_01 | pCtx->bCpl; … … 435 440 bs3CpuBasic2Pf_CompareSimpleUd(pThis, pCtx, 3); 436 441 else if (!(fFlags & BS3CB2PFACC_F_PAGE_LEVEL) || off >= X86_PAGE_SIZE) 437 bs3CpuBasic2Pf_CompareSimplePf(pThis, pCtx, 0, uPfErrCd, (uintptr_t)pThis->pbTest+ off);442 bs3CpuBasic2Pf_CompareSimplePf(pThis, pCtx, 0, uPfErrCd, pThis->uTestAddr.u + off); 438 443 else 439 444 bs3CpuBasic2Pf_CompareSimplePf(pThis, pCtx, 440 445 off + 3 == X86_PAGE_SIZE || off + 4 == X86_PAGE_SIZE 441 446 ? RT_MIN(X86_PAGE_SIZE, off + 3) - off : 0, 442 uPfErrCd, (uintptr_t)pThis->pbTest+ RT_MIN(X86_PAGE_SIZE, off + 4));447 uPfErrCd, pThis->uTestAddr.u + RT_MIN(X86_PAGE_SIZE, off + 4)); 443 448 } 444 449 } … … 526 531 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off; 527 532 else 528 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = (uintptr_t)pThis->pbTest+ off;533 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = pThis->uTestAddr.u + off; 529 534 530 535 Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx); … … 542 547 { 543 548 if (off < X86_PAGE_SIZE) 544 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE;549 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + X86_PAGE_SIZE; 545 550 else 546 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ off;551 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off; 547 552 bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd); 548 553 pThis->ExpectCtx.cr2 = pCtx->cr2; … … 614 619 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off; 615 620 else 616 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = (uintptr_t)pThis->pbTest+ off;621 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = pThis->uTestAddr.u + off; 617 622 618 623 Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx); … … 631 636 { 632 637 if (off < X86_PAGE_SIZE) 633 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE;638 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + X86_PAGE_SIZE; 634 639 else 635 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ off;640 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off; 636 641 bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd); 637 642 pThis->ExpectCtx.cr2 = pCtx->cr2; … … 714 719 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off; 715 720 else 716 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = (uintptr_t)pThis->pbTest+ off;721 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = pThis->uTestAddr.u + off; 717 722 718 723 Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx); … … 733 738 pThis->ExpectCtx.rax.u = uRaxIn; 734 739 if (off < X86_PAGE_SIZE) 735 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE;740 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + X86_PAGE_SIZE; 736 741 else 737 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ off;742 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off; 738 743 bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd); 739 744 pThis->ExpectCtx.cr2 = pCtx->cr2; … … 838 843 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off; 839 844 else 840 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = (uintptr_t)pThis->pbTest+ off;845 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = pThis->uTestAddr.u + off; 841 846 842 847 Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx); … … 859 864 pThis->ExpectCtx.rflags = pCtx->rflags; 860 865 if (off < X86_PAGE_SIZE) 861 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE;866 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + X86_PAGE_SIZE; 862 867 else 863 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ off;868 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off; 864 869 bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd); 865 870 pThis->ExpectCtx.cr2 = pCtx->cr2; … … 939 944 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off; 940 945 else 941 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = (uintptr_t)pThis->pbTest+ off;946 pThis->ExpectCtx.rbx.u = pCtx->rbx.u = pThis->uTestAddr.u + off; 942 947 943 948 Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx); … … 956 961 { 957 962 if (off < X86_PAGE_SIZE) 958 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE;963 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + X86_PAGE_SIZE; 959 964 else 960 pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest+ off;965 pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off; 961 966 bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd); 962 967 pThis->ExpectCtx.cr2 = pCtx->cr2; … … 1184 1189 static uint8_t bs3CpuBasic2_RaiseXcpt0eWorker(PBS3CPUBASIC2PFSTATE register pThis, bool const fWp, bool const fNxe) 1185 1190 { 1191 unsigned iLevel; 1186 1192 unsigned iRing; 1187 1193 unsigned iStore; 1188 1194 unsigned iAccessor; 1189 1195 unsigned iOuter; 1196 unsigned cPml4Tests; 1197 unsigned cPdPtrTests; 1190 1198 uint32_t const fPfIdMask = fNxe ? UINT32_MAX : ~X86_TRAP_PF_ID; 1191 1199 BS3REGCTX aCtxts[4]; … … 1216 1224 { 1217 1225 for (iRing = 0; iRing < 4; iRing++) 1218 aCtxts[iRing].rbx.u = (uintptr_t)pThis->pbTest;1226 aCtxts[iRing].rbx.u = pThis->uTestAddr.u; 1219 1227 } 1220 1228 else … … 1235 1243 1236 1244 /* 1237 * Check the U bit on PTE level.We only mess with the 2nd page.1245 * Some PTE checks. We only mess with the 2nd page. 1238 1246 */ 1239 1247 for (iOuter = 0; iOuter < 2; iOuter++) 1240 1248 { 1241 1249 uint32_t const fAccessor = (iOuter == 0 ? BS3CB2PFACC_F_DIRECT : 0) | BS3CB2PFACC_F_PAGE_LEVEL; 1242 bool const fWp = RT_BOOL(ASMGetCR0() & X86_CR0_WP);1243 1250 unsigned iPteWrk; 1244 1251 … … 1445 1452 1446 1453 pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, 0); 1447 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1454 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1448 1455 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, 1449 1456 fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask)); … … 1451 1458 1452 1459 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A | X86_PTE_D, 0); 1453 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1460 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1454 1461 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, 1455 1462 fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask)); … … 1472 1479 1473 1480 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A | X86_PTE_D, 0); 1474 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1481 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1475 1482 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1476 1483 CHECK_AD_BITS(0); 1477 1484 1478 1485 pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, X86_PTE_A | X86_PTE_D); 1479 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1486 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1480 1487 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1481 1488 CHECK_AD_BITS(X86_PTE_A | X86_PTE_D); 1482 1489 1483 1490 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A, X86_PTE_D); 1484 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1491 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1485 1492 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1486 1493 CHECK_AD_BITS(X86_PTE_D); 1487 1494 1488 1495 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_D, X86_PTE_A); 1489 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1496 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1490 1497 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1491 1498 CHECK_AD_BITS(X86_PTE_A); … … 1497 1504 1498 1505 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A | X86_PTE_D, 0); 1499 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1506 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1500 1507 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1501 1508 CHECK_AD_BITS(fExpectedAD); 1502 1509 1503 1510 pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, X86_PTE_A | X86_PTE_D); 1504 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1511 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1505 1512 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1506 1513 CHECK_AD_BITS(X86_PTE_A | X86_PTE_D); 1507 1514 1508 1515 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A, X86_PTE_D); 1509 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1516 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1510 1517 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1511 1518 CHECK_AD_BITS(fExpectedAD | X86_PTE_D); 1512 1519 1513 1520 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_D, X86_PTE_A); 1514 ASMInvalidatePage( (uintptr_t)pThis->pbTest+ X86_PAGE_SIZE);1521 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1515 1522 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1516 1523 CHECK_AD_BITS(fExpectedAD | X86_PTE_A); … … 1526 1533 } 1527 1534 1535 1536 /* 1537 * Do all 4 paging levels. We start out with full access to the page and 1538 * restrict it in various ways. 1539 * 1540 * (On the final level we only mess with the 2nd page for now.) 1541 */ 1542 cPdPtrTests = 1; 1543 cPml4Tests = 1; 1544 if (pThis->uTestAddr.u >= UINT64_C(0x8000000000)) 1545 { 1546 cPml4Tests = 2; 1547 cPdPtrTests = 2; 1548 } 1549 else if (pThis->PgInfo.cEntries == 3) 1550 cPdPtrTests = 2; 1551 1552 #if 0 1553 /* Loop 1: Accessor flags. */ 1554 for (iOuter = 0; iOuter < 2; iOuter++) 1555 { 1556 uint32_t const fAccessor = (iOuter == 0 ? BS3CB2PFACC_F_DIRECT : 0) | BS3CB2PFACC_F_PAGE_LEVEL; 1557 1558 /* Loop 2: Paging store method. */ 1559 for (iStore = 0; iStore < RT_ELEMENTS(g_aStoreMethods); iStore++) 1560 { 1561 unsigned iPml4Test; 1562 int8_t cReserved = 0; 1563 int8_t cNotPresent = 0; 1564 int8_t cNotWrite = 0; 1565 int8_t cNotUser = 0; 1566 int8_t cExecute = 0; 1567 1568 /* Loop 3: Page map level 4 */ 1569 for (iPml4Test = 0; iPml4Test < cPml4Tests; iPml4Test++) 1570 { 1571 unsigned iPdPtrTest; 1572 1573 /* Loop 4: Page directory pointer table. */ 1574 for (iPdPtrTest = 0; iPdPtrTest < cPdPtrTests; iPdPtrTest++) 1575 { 1576 unsigned iPdTest; 1577 1578 /* Loop 5: Page directory. */ 1579 for (iPdTest = 0; iPdTest < 2; iPdTest++) 1580 { 1581 unsigned iPtTest; 1582 1583 /* Loop 6: Page table. */ 1584 for (iPtTest = 0; iPtTest < 2; iPtTest++) 1585 { 1586 /* Loop 7: Accessor ring. */ 1587 for (iRing = 0; iRing < 4; iRing++) 1588 { 1589 PBS3REGCTX const pCtx = &aCtxts[iRing]; 1590 1591 if ( EffWrk.fReserved 1592 || !EffWrk.fPresent 1593 || (!EffWrk.fUser && iRing == 3)) 1594 { 1595 uint32_t const fPfBase = ( EffWrk.fReserved ? X86_TRAP_PF_P | X86_TRAP_PF_RSVD 1596 : EffWrk.fPresent ? X86_TRAP_PF_P : 0) 1597 | (iRing == 3 ? X86_TRAP_PF_US : 0); 1598 for (iAccessor = 0; iAccessor < RT_ELEMENTS(g_aAccessors); iAccessor++) 1599 { 1600 pThis->pszAccessor = g_aAccessors[iAccessor].pszName; 1601 1602 pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, 0); 1603 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1604 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, 1605 fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask)); 1606 CHECK_AD_BITS(0); 1607 1608 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A | X86_PTE_D, 0); 1609 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1610 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, 1611 fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask)); 1612 CHECK_AD_BITS(0); 1613 } 1614 } 1615 else 1616 { 1617 uint32_t const fPfBase = X86_TRAP_PF_P | (iRing == 3 ? X86_TRAP_PF_US : 0); 1618 for (iAccessor = 0; iAccessor < RT_ELEMENTS(g_aAccessors); iAccessor++) 1619 { 1620 pThis->pszAccessor = g_aAccessors[iAccessor].pszName; 1621 if ( ( (g_aAccessors[iAccessor].fAccess & X86_TRAP_PF_ID) 1622 && EffWrk.fNoExecute) 1623 || ( (g_aAccessors[iAccessor].fAccess & X86_TRAP_PF_RW) 1624 && !EffWrk.fWriteable 1625 && (fWp || iRing == 3)) ) 1626 { 1627 uint32_t const fErrCd = fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask); 1628 1629 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A | X86_PTE_D, 0); 1630 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1631 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1632 CHECK_AD_BITS(0); 1633 1634 pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, X86_PTE_A | X86_PTE_D); 1635 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1636 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1637 CHECK_AD_BITS(X86_PTE_A | X86_PTE_D); 1638 1639 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A, X86_PTE_D); 1640 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1641 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1642 CHECK_AD_BITS(X86_PTE_D); 1643 1644 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_D, X86_PTE_A); 1645 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1646 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd); 1647 CHECK_AD_BITS(X86_PTE_A); 1648 } 1649 else 1650 { 1651 uint32_t const fExpectedAD = (g_aAccessors[iAccessor].fAccess & X86_TRAP_PF_RW) 1652 ? X86_PTE_A | X86_PTE_D : X86_PTE_A; 1653 1654 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A | X86_PTE_D, 0); 1655 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1656 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1657 CHECK_AD_BITS(fExpectedAD); 1658 1659 pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, X86_PTE_A | X86_PTE_D); 1660 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1661 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1662 CHECK_AD_BITS(X86_PTE_A | X86_PTE_D); 1663 1664 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_A, X86_PTE_D); 1665 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1666 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1667 CHECK_AD_BITS(fExpectedAD | X86_PTE_D); 1668 1669 pPteWrk->pfnModify(pThis, iStore, pPteWrk, X86_PTE_D, X86_PTE_A); 1670 ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE); 1671 g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX); 1672 CHECK_AD_BITS(fExpectedAD | X86_PTE_A); 1673 } 1674 } 1675 } 1676 } 1677 1678 } 1679 } 1680 } 1681 } 1682 1683 } 1684 } 1685 #endif 1686 1687 /* 1688 * Check reserved bits on each paging level. 1689 */ 1690 1691 /* Loop 1: Accessor flags (only direct for now). */ 1692 for (iOuter = 0; iOuter < 1; iOuter++) 1693 { 1694 uint32_t const fAccessor = BS3CB2PFACC_F_DIRECT; 1695 1696 /* Loop 2: Paging store method. */ 1697 for (iStore = 0; iStore < RT_ELEMENTS(g_aStoreMethods); iStore++) 1698 { 1699 /* Loop 3: Accessor ring. */ 1700 for (iRing = 0; iRing < 4; iRing++) 1701 { 1702 /* Loop 4: Which level we mess up. */ 1703 for (iLevel = 0; iLevel < pThis->PgInfo.cEntries; iLevel++) 1704 { 1705 #if 0 1706 const BS3CPUBASIC2PFMODPT *pPteWrk = &g_aPteWorkers[iPteWrk]; 1707 if (pThis->PgInfo.) 1708 { 1709 } 1710 #endif 1711 1712 1713 } 1714 } 1715 } 1716 } 1717 1718 1719 1528 1720 return 0; 1529 1721 } … … 1603 1795 * Alias this memory far away from where our code and data lives. 1604 1796 */ 1605 State.pbTest = (uint8_t *)UINT32_C(0x80000000); 1606 rc = Bs3PagingAlias((uintptr_t)State.pbTest, (uintptr_t)State.pbOrgTest, State.cbTest, X86_PTE_P | X86_PTE_RW | X86_PTE_US); 1797 if (bMode & BS3_MODE_CODE_64) 1798 State.uTestAddr.u = UINT64_C(0x0000648680000000); 1799 else 1800 State.uTestAddr.u = UINT32_C(0x80000000); 1801 rc = Bs3PagingAlias(State.uTestAddr.u, (uintptr_t)State.pbOrgTest, State.cbTest, X86_PTE_P | X86_PTE_RW | X86_PTE_US); 1607 1802 if (RT_SUCCESS(rc)) 1608 1803 { 1609 rc = Bs3PagingQueryAddressInfo( (uintptr_t)State.pbTest, &State.PgInfo);1804 rc = Bs3PagingQueryAddressInfo(State.uTestAddr.u, &State.PgInfo); 1610 1805 if (RT_SUCCESS(rc)) 1611 1806 { 1807 if (bMode & BS3_MODE_CODE_64) ASMHalt(); 1612 1808 /* Set values that derives from the test memory size and paging info. */ 1613 1809 if (State.PgInfo.cEntries == 2) … … 1643 1839 * Setup a 16-bit selector for accessing the alias. 1644 1840 */ 1645 Bs3SelSetup16BitData(&Bs3GdteSpare00, (uintptr_t)State.pbTest);1841 Bs3SelSetup16BitData(&Bs3GdteSpare00, State.uTestAddr.u32); 1646 1842 State.uSel16TestData = BS3_SEL_SPARE_00 | 3; 1647 1843 … … 1675 1871 else 1676 1872 Bs3TestFailedF("Bs3PagingQueryAddressInfo failed: %d\n", rc); 1677 Bs3PagingUnalias( (uintptr_t)State.pbTest, State.cbTest);1873 Bs3PagingUnalias(State.uTestAddr.u, State.cbTest); 1678 1874 } 1679 1875 else
Note:
See TracChangeset
for help on using the changeset viewer.