VirtualBox

Changeset 104933 in vbox


Ignore:
Timestamp:
Jun 15, 2024 12:44:02 AM (3 months ago)
Author:
vboxsync
Message:

VMM/PGM,IEM: Refactored+copied PGMGstGetPage into PGMGstQueryPage that takes care of table walking, setting A & D bits and validating the access. Use new function in IEM. [fixes] bugref:10687

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/vmm/pgm.h

    r104932 r104933  
    348348 * level 8.  This is 0 on success. */
    349349#define PGM_WALKFAIL_LEVEL_MASK                     UINT32_C(0x0000f100)
    350 /** Level shift (see PGM_WALKINFO_LEVEL_MASK).   */
     350/** Level shift (see PGM_WALKFAIL_LEVEL_MASK).   */
    351351#define PGM_WALKFAIL_LEVEL_SHIFT                    11
    352352
  • trunk/src/VBox/VMM/VMMAll/IEMAll.cpp

    r104932 r104933  
    554554    }
    555555#else
    556     Assert((WalkFast.fEffective & X86_PTE_US) || IEM_GET_CPL(pVCpu) != 3));
     556    Assert((WalkFast.fEffective & X86_PTE_US) || IEM_GET_CPL(pVCpu) != 3);
    557557    Assert(!(WalkFast.fEffective & X86_PTE_PAE_NX) || !(pVCpu->cpum.GstCtx.msrEFER & MSR_K6_EFER_NXE));
    558558#endif
    559     RTGCPHYS const GCPhys = Walk.GCPhys;
    560     /** @todo Check reserved bits and such stuff. PGM is better at doing
    561      *        that, so do it when implementing the guest virtual address
    562      *        TLB... */
     559    RTGCPHYS const GCPhys = WalkFast.GCPhys;
    563560
    564561    /*
     
    12501247    }
    12511248
    1252     PGMPTWALK Walk;
    1253     int rc = PGMGstGetPage(pVCpu, GCPtrNext, &Walk);
    1254     if (RT_FAILURE(rc))
     1249    PGMPTWALKFAST WalkFast;
     1250    int rc = PGMGstQueryPageFast(pVCpu, GCPtrNext,
     1251                                 IEM_GET_CPL(pVCpu) == 3 ? PGMQPAGE_F_EXECUTE | PGMQPAGE_F_USER_MODE : PGMQPAGE_F_EXECUTE,
     1252                                 &WalkFast);
     1253    if (RT_SUCCESS(rc))
     1254        Assert((WalkFast.fInfo & PGM_WALKINFO_SUCCEEDED) && WalkFast.fFailed == PGM_WALKFAIL_SUCCESS);
     1255    else
    12551256    {
    12561257        Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrNext, rc));
    12571258#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    1258         if (Walk.fFailed & PGM_WALKFAIL_EPT)
    1259             IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PHYS_ADDR, 0 /* cbInstr */);
     1259        if (WalkFast.fFailed & PGM_WALKFAIL_EPT)
     1260            IEM_VMX_VMEXIT_EPT_RET(pVCpu, &WalkFast, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PHYS_ADDR, 0 /* cbInstr */);
    12601261#endif
    12611262        return iemRaisePageFault(pVCpu, GCPtrNext, 1, IEM_ACCESS_INSTRUCTION, rc);
    12621263    }
    1263     if (!(Walk.fEffective & X86_PTE_US) && IEM_GET_CPL(pVCpu) == 3)
    1264     {
    1265         Log(("iemOpcodeFetchMoreBytes: %RGv - supervisor page\n", GCPtrNext));
    1266 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    1267         if (Walk.fFailed & PGM_WALKFAIL_EPT)
    1268             IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
    1269 #endif
    1270         return iemRaisePageFault(pVCpu, GCPtrNext, 1, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    1271     }
    1272     if ((Walk.fEffective & X86_PTE_PAE_NX) && (pVCpu->cpum.GstCtx.msrEFER & MSR_K6_EFER_NXE))
    1273     {
    1274         Log(("iemOpcodeFetchMoreBytes: %RGv - NX\n", GCPtrNext));
    1275 #ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    1276         if (Walk.fFailed & PGM_WALKFAIL_EPT)
    1277             IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
    1278 #endif
    1279         return iemRaisePageFault(pVCpu, GCPtrNext, 1, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    1280     }
    1281     RTGCPHYS const GCPhys = Walk.GCPhys | (GCPtrNext & GUEST_PAGE_OFFSET_MASK);
    1282     Log5(("GCPtrNext=%RGv GCPhys=%RGp cbOpcodes=%#x\n",  GCPtrNext,  GCPhys,  cbOpcode));
    1283     /** @todo Check reserved bits and such stuff. PGM is better at doing
    1284      *        that, so do it when implementing the guest virtual address
    1285      *        TLB... */
     1264    Assert((WalkFast.fEffective & X86_PTE_US) || IEM_GET_CPL(pVCpu) != 3);
     1265    Assert(!(WalkFast.fEffective & X86_PTE_PAE_NX) || !(pVCpu->cpum.GstCtx.msrEFER & MSR_K6_EFER_NXE));
     1266
     1267    RTGCPHYS const GCPhys = WalkFast.GCPhys;
     1268    Log5(("GCPtrNext=%RGv GCPhys=%RGp cbOpcodes=%#x\n",  GCPtrNext,  GCPhys, cbOpcode));
    12861269
    12871270    /*
     
    57105693#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    57115694    if (WalkFast.fFailed & PGM_WALKFAIL_EPT)
    5712         IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, fAccess, IEM_SLAT_FAIL_LINEAR_TO_PHYS_ADDR, 0 /* cbInstr */);
     5695        IEM_VMX_VMEXIT_EPT_RET(pVCpu, &WalkFast, fAccess, IEM_SLAT_FAIL_LINEAR_TO_PHYS_ADDR, 0 /* cbInstr */);
    57135696#endif
    57145697    *pGCPhysMem = NIL_RTGCPHYS;
  • trunk/src/VBox/VMM/VMMAll/PGMAllGst.h

    r104932 r104933  
    455455#if defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT) || defined(VBOX_WITH_NESTED_HWVIRT_SVM_XXX) || defined(DOXYGEN_RUNNING)
    456456/** Converts regular style walk info to fast style. */
    457 DECL_FORCE_INLINE(void) PGM_GST_NAME(ConvertPtWalkToFast)(PGMPTWALK const *pSrc, PPGMPTWALKFAST *pDst)
     457DECL_FORCE_INLINE(void) PGM_GST_NAME(ConvertPtWalkToFast)(PGMPTWALK const *pSrc, PPGMPTWALKFAST pDst)
    458458{
    459459    pDst->GCPtr              = pSrc->GCPtr;
     
    462462    pDst->fInfo              = (pSrc->fSucceeded         ? PGM_WALKINFO_SUCCEEDED            : 0)
    463463                             | (pSrc->fIsSlat            ? PGM_WALKINFO_IS_SLAT              : 0)
    464                              | (pSrc->fIsLinearAddrValid ? PGM_WALKINFO_IS_LINEAR_ADDR_VALID : 0)
    465                              | ((uint32_t)pSrc->uLevel << PGM_WALKINFO_LEVEL_SHIFT);
    466     pDst->fFailed            = pSrc->fFailed;
     464                             | (pSrc->fIsLinearAddrValid ? PGM_WALKINFO_IS_LINEAR_ADDR_VALID : 0);
     465    pDst->fFailed            = pSrc->fFailed | ((uint32_t)pSrc->uLevel << PGM_WALKFAIL_LEVEL_SHIFT);
    467466    pDst->fEffective         = pSrc->fEffective;
    468467}
     
    553552            else \
    554553            { \
    555                 PGM_NAME(ConvertPtWalkToFast)(&WalkSlat, pWalk); \
     554                PGM_GST_NAME(ConvertPtWalkToFast)(&WalkSlat, pWalk); \
    556555                return rcX; \
    557556            } \
     
    907906            pWalk->GCPhys       = WalkSlat.GCPhys;
    908907            pWalk->GCPhysNested = 0;
    909             pWalk->u64Union     = 0;
    910             pWalk->fSucceeded   = true;
     908            pWalk->fInfo        = PGM_WALKINFO_SUCCEEDED;
     909            pWalk->fFailed      = PGM_WALKFAIL_SUCCESS;
    911910            pWalk->fEffective   = X86_PTE_P | X86_PTE_RW | X86_PTE_US | X86_PTE_A | X86_PTE_D;
    912911        }
    913912        else
    914             PGM_NAME(ConvertPtWalkToFast)(&WalkSlat, pWalk);
     913            PGM_GST_NAME(ConvertPtWalkToFast)(&WalkSlat, pWalk);
    915914        return rc;
    916915    }
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