VirtualBox

Changeset 65511 in vbox


Ignore:
Timestamp:
Jan 29, 2017 6:05:28 PM (8 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
113145
Message:

bs3-cpu-basic-2-pf: updates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/ValidationKit/bootsectors/bs3-cpu-basic-2-pf.c32

    r65408 r65511  
    8989    /** The common mode functions. */
    9090    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;
    9398    /** Pointer to the orignal test area mapping. */
    9499    uint8_t                    *pbOrgTest;
     
    102107    /** The number of PDEs for cTestPages. */
    103108    uint16_t                    cTestPdes;
    104     /** 16-bit data selector for pbTest. */
     109    /** 16-bit data selector for uTestAddr.u32. */
    105110    uint16_t                    uSel16TestData;
    106     /** 16-bit code selector for pbTest. */
     111    /** 16-bit code selector for uTestAddr.u32. */
    107112    uint16_t                    uSel16TestCode;
    108113    /** The size of the PDE backup. */
     
    110115    /** The size of the PTE backup. */
    111116    uint16_t                    cbPteBackup;
    112     /** Test paging information for pbTest. */
     117    /** Test paging information for uTestAddr.u. */
    113118    BS3PAGINGINFO4ADDR          PgInfo;
    114119
     
    416421        {
    417422            default:
    418                 pCtx->rip.u = (uintptr_t)&pThis->pbTest[off];
     423                pCtx->rip.u = pThis->uTestAddr.u + off;
    419424                break;
    420425            case BS3_MODE_CODE_16:
    421                 Bs3SelSetup16BitCode(&Bs3GdteSpare01, (uintptr_t)pThis->pbTest, pCtx->bCpl);
     426                Bs3SelSetup16BitCode(&Bs3GdteSpare01, pThis->uTestAddr.u32, pCtx->bCpl);
    422427                pCtx->rip.u = off;
    423428                pCtx->cs    = BS3_SEL_SPARE_01 | pCtx->bCpl;
     
    435440            bs3CpuBasic2Pf_CompareSimpleUd(pThis, pCtx, 3);
    436441        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);
    438443        else
    439444            bs3CpuBasic2Pf_CompareSimplePf(pThis, pCtx,
    440445                                             off + 3 == X86_PAGE_SIZE || off + 4 == X86_PAGE_SIZE
    441446                                           ? 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));
    443448    }
    444449}
     
    526531                pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off;
    527532            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;
    529534
    530535            Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx);
     
    542547            {
    543548                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;
    545550                else
    546                     pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest + off;
     551                    pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off;
    547552                bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd);
    548553                pThis->ExpectCtx.cr2 = pCtx->cr2;
     
    614619                pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off;
    615620            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;
    617622
    618623            Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx);
     
    631636            {
    632637                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;
    634639                else
    635                     pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest + off;
     640                    pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off;
    636641                bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd);
    637642                pThis->ExpectCtx.cr2 = pCtx->cr2;
     
    714719                pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off;
    715720            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;
    717722
    718723            Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx);
     
    733738                pThis->ExpectCtx.rax.u = uRaxIn;
    734739                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;
    736741                else
    737                     pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest + off;
     742                    pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off;
    738743                bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd);
    739744                pThis->ExpectCtx.cr2 = pCtx->cr2;
     
    838843                pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off;
    839844            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;
    841846
    842847            Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx);
     
    859864                pThis->ExpectCtx.rflags = pCtx->rflags;
    860865                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;
    862867                else
    863                     pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest + off;
     868                    pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off;
    864869                bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd);
    865870                pThis->ExpectCtx.cr2 = pCtx->cr2;
     
    939944                pThis->ExpectCtx.rbx.u = pCtx->rbx.u = off;
    940945            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;
    942947
    943948            Bs3TrapSetJmpAndRestore(pCtx, &pThis->TrapCtx);
     
    956961            {
    957962                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;
    959964                else
    960                     pThis->ExpectCtx.cr2.u = (uintptr_t)pThis->pbTest + off;
     965                    pThis->ExpectCtx.cr2.u = pThis->uTestAddr.u + off;
    961966                bs3CpuBasic2Pf_CompareCtx(pThis, &pThis->ExpectCtx, 0 /*cbPcAdjust*/, bXcpt, uPfErrCd);
    962967                pThis->ExpectCtx.cr2 = pCtx->cr2;
     
    11841189static uint8_t bs3CpuBasic2_RaiseXcpt0eWorker(PBS3CPUBASIC2PFSTATE register pThis, bool const fWp, bool const fNxe)
    11851190{
     1191    unsigned            iLevel;
    11861192    unsigned            iRing;
    11871193    unsigned            iStore;
    11881194    unsigned            iAccessor;
    11891195    unsigned            iOuter;
     1196    unsigned            cPml4Tests;
     1197    unsigned            cPdPtrTests;
    11901198    uint32_t const      fPfIdMask = fNxe ? UINT32_MAX : ~X86_TRAP_PF_ID;
    11911199    BS3REGCTX           aCtxts[4];
     
    12161224    {
    12171225        for (iRing = 0; iRing < 4; iRing++)
    1218             aCtxts[iRing].rbx.u = (uintptr_t)pThis->pbTest;
     1226            aCtxts[iRing].rbx.u = pThis->uTestAddr.u;
    12191227    }
    12201228    else
     
    12351243
    12361244    /*
    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.
    12381246     */
    12391247    for (iOuter = 0; iOuter < 2; iOuter++)
    12401248    {
    12411249        uint32_t const  fAccessor = (iOuter == 0 ? BS3CB2PFACC_F_DIRECT : 0) | BS3CB2PFACC_F_PAGE_LEVEL;
    1242         bool const      fWp       = RT_BOOL(ASMGetCR0() & X86_CR0_WP);
    12431250        unsigned        iPteWrk;
    12441251
     
    14451452
    14461453                                pPteWrk->pfnModify(pThis, iStore, pPteWrk, 0, 0);
    1447                                 ASMInvalidatePage((uintptr_t)pThis->pbTest + X86_PAGE_SIZE);
     1454                                ASMInvalidatePage(pThis->uTestAddr.u + X86_PAGE_SIZE);
    14481455                                g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF,
    14491456                                                                    fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask));
     
    14511458
    14521459                                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);
    14541461                                g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF,
    14551462                                                                    fPfBase | (g_aAccessors[iAccessor].fAccess & fPfIdMask));
     
    14721479
    14731480                                    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);
    14751482                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd);
    14761483                                    CHECK_AD_BITS(0);
    14771484
    14781485                                    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);
    14801487                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd);
    14811488                                    CHECK_AD_BITS(X86_PTE_A | X86_PTE_D);
    14821489
    14831490                                    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);
    14851492                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd);
    14861493                                    CHECK_AD_BITS(X86_PTE_D);
    14871494
    14881495                                    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);
    14901497                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_PF, fErrCd);
    14911498                                    CHECK_AD_BITS(X86_PTE_A);
     
    14971504
    14981505                                    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);
    15001507                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX);
    15011508                                    CHECK_AD_BITS(fExpectedAD);
    15021509
    15031510                                    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);
    15051512                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX);
    15061513                                    CHECK_AD_BITS(X86_PTE_A | X86_PTE_D);
    15071514
    15081515                                    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);
    15101517                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX);
    15111518                                    CHECK_AD_BITS(fExpectedAD | X86_PTE_D);
    15121519
    15131520                                    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);
    15151522                                    g_aAccessors[iAccessor].pfnAccessor(pThis, pCtx, fAccessor, X86_XCPT_UD, UINT8_MAX);
    15161523                                    CHECK_AD_BITS(fExpectedAD | X86_PTE_A);
     
    15261533    }
    15271534
     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
    15281720    return 0;
    15291721}
     
    16031795     * Alias this memory far away from where our code and data lives.
    16041796     */
    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);
    16071802    if (RT_SUCCESS(rc))
    16081803    {
    1609         rc = Bs3PagingQueryAddressInfo((uintptr_t)State.pbTest, &State.PgInfo);
     1804        rc = Bs3PagingQueryAddressInfo(State.uTestAddr.u, &State.PgInfo);
    16101805        if (RT_SUCCESS(rc))
    16111806        {
     1807if (bMode & BS3_MODE_CODE_64) ASMHalt();
    16121808            /* Set values that derives from the test memory size and paging info. */
    16131809            if (State.PgInfo.cEntries == 2)
     
    16431839                 * Setup a 16-bit selector for accessing the alias.
    16441840                 */
    1645                 Bs3SelSetup16BitData(&Bs3GdteSpare00, (uintptr_t)State.pbTest);
     1841                Bs3SelSetup16BitData(&Bs3GdteSpare00, State.uTestAddr.u32);
    16461842                State.uSel16TestData = BS3_SEL_SPARE_00 | 3;
    16471843
     
    16751871        else
    16761872            Bs3TestFailedF("Bs3PagingQueryAddressInfo failed: %d\n", rc);
    1677         Bs3PagingUnalias((uintptr_t)State.pbTest, State.cbTest);
     1873        Bs3PagingUnalias(State.uTestAddr.u, State.cbTest);
    16781874    }
    16791875    else
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