VirtualBox

Changeset 92472 in vbox


Ignore:
Timestamp:
Nov 17, 2021 9:59:58 AM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 EPT violation information.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMAll/PGMAllGstSlatEpt.cpp.h

    r92426 r92472  
    1717
    1818#if PGM_GST_TYPE == PGM_TYPE_EPT
    19 DECLINLINE(int) PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(PVMCPUCC pVCpu, PPGMPTWALK pWalk, int iLevel)
     19DECLINLINE(int) PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(PVMCPUCC pVCpu, PPGMPTWALK pWalk, uint64_t uEntry, uint8_t uLevel)
     20{
     21    pWalk->fNotPresent = true;
     22    pWalk->uLevel      = uLevel;
     23    static PGMSLATFAIL const s_aEptViolation[] = { PGMSLATFAIL_EPT_VIOLATION, PGMSLATFAIL_EPT_VIOLATION_CONVERTIBLE };
     24    uint8_t const fEptVeSupported  = pVCpu->CTX_SUFF(pVM)->cpum.ro.GuestFeatures.fVmxEptXcptVe;
     25    uint8_t const idxViolationType = fEptVeSupported & !RT_BF_GET(uEntry, VMX_BF_EPT_PT_SUPPRESS_VE);
     26    pWalk->enmSlatFail = s_aEptViolation[idxViolationType];
     27    return VERR_PAGE_TABLE_NOT_PRESENT;
     28}
     29
     30
     31DECLINLINE(int) PGM_GST_SLAT_NAME_EPT(WalkReturnBadPhysAddr)(PVMCPUCC pVCpu, PPGMPTWALK pWalk, uint8_t uLevel, int rc)
     32{
     33    AssertMsg(rc == VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS, ("%Rrc\n", rc)); NOREF(rc); NOREF(pVCpu);
     34    pWalk->fBadPhysAddr = true;
     35    pWalk->uLevel       = uLevel;
     36    return VERR_PAGE_TABLE_NOT_PRESENT;
     37}
     38
     39
     40DECLINLINE(int) PGM_GST_SLAT_NAME_EPT(WalkReturnRsvdError)(PVMCPUCC pVCpu, PPGMPTWALK pWalk, uint8_t uLevel)
    2041{
    2142    NOREF(pVCpu);
    22     pWalk->fNotPresent     = true;
    23     pWalk->uLevel          = (uint8_t)iLevel;
    24     return VERR_PAGE_TABLE_NOT_PRESENT;
    25 }
    26 
    27 
    28 DECLINLINE(int) PGM_GST_SLAT_NAME_EPT(WalkReturnBadPhysAddr)(PVMCPUCC pVCpu, PPGMPTWALK pWalk, int iLevel, int rc)
    29 {
    30     AssertMsg(rc == VERR_PGM_INVALID_GC_PHYSICAL_ADDRESS, ("%Rrc\n", rc)); NOREF(rc); NOREF(pVCpu);
    31     pWalk->fBadPhysAddr    = true;
    32     pWalk->uLevel          = (uint8_t)iLevel;
    33     return VERR_PAGE_TABLE_NOT_PRESENT;
    34 }
    35 
    36 
    37 DECLINLINE(int) PGM_GST_SLAT_NAME_EPT(WalkReturnRsvdError)(PVMCPUCC pVCpu, PPGMPTWALK pWalk, int iLevel)
    38 {
    39     NOREF(pVCpu);
    40     pWalk->fRsvdError      = true;
    41     pWalk->uLevel          = (uint8_t)iLevel;
     43    pWalk->fRsvdError = true;
     44    pWalk->uLevel     = uLevel;
    4245    return VERR_PAGE_TABLE_NOT_PRESENT;
    4346}
     
    9497
    9598        if (GST_IS_PGENTRY_PRESENT(pVCpu, Pml4e)) { /* probable */ }
    96         else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, 4);
     99        else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, Pml4e.u, 4);
    97100
    98101        if (RT_LIKELY(GST_IS_PML4E_VALID(pVCpu, Pml4e))) { /* likely */ }
     
    122125
    123126        if (GST_IS_PGENTRY_PRESENT(pVCpu, Pdpte)) { /* probable */ }
    124         else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, 3);
     127        else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, Pdpte.u, 3);
    125128
    126129        /* The order of the following 2 "if" statements matter. */
     
    171174
    172175        if (GST_IS_PGENTRY_PRESENT(pVCpu, Pde)) { /* probable */ }
    173         else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, 2);
     176        else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, Pde.u, 2);
    174177
    175178        if ((Pde.u & X86_PDE_PS) && GST_IS_PSE_ACTIVE(pVCpu))
     
    226229
    227230        if (GST_IS_PGENTRY_PRESENT(pVCpu, Pte)) { /* probable */ }
    228         else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, 1);
     231        else return PGM_GST_SLAT_NAME_EPT(WalkReturnNotPresent)(pVCpu, pWalk, Pte.u, 1);
    229232
    230233        if (RT_LIKELY(GST_IS_PTE_VALID(pVCpu, Pte))) { /* likely */ }
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