VirtualBox

Changeset 92728 in vbox


Ignore:
Timestamp:
Dec 3, 2021 5:57:41 AM (3 years ago)
Author:
vboxsync
Message:

VMM: Nested VMX: bugref:10092 EPT violation/misconfig bits.

File:
1 edited

Legend:

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

    r92706 r92728  
    17681768            if (RT_FAILURE(rc))
    17691769            {
     1770#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     1771                /** @todo Nested VMX: Need to handle EPT violation/misconfig here?  */
     1772                Assert(!(Walk.fFailed & PGM_WALKFAIL_EPT));
     1773#endif
    17701774                Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrFirst, rc));
    17711775                iemRaisePageFaultJmp(pVCpu, GCPtrFirst, IEM_ACCESS_INSTRUCTION, rc);
     
    19871991    {
    19881992        Log(("iemOpcodeFetchMoreBytes: %RGv - rc=%Rrc\n", GCPtrNext, rc));
     1993#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     1994        if (Walk.fFailed & PGM_WALKFAIL_EPT)
     1995            IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PHYS_ADDR, 0 /* cbInstr */);
     1996#endif
    19891997        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, rc);
    19901998    }
     
    19922000    {
    19932001        Log(("iemOpcodeFetchMoreBytes: %RGv - supervisor page\n", GCPtrNext));
     2002#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     2003        if (Walk.fFailed & PGM_WALKFAIL_EPT)
     2004            IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
     2005#endif
    19942006        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    19952007    }
     
    19972009    {
    19982010        Log(("iemOpcodeFetchMoreBytes: %RGv - NX\n", GCPtrNext));
     2011#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     2012        if (Walk.fFailed & PGM_WALKFAIL_EPT)
     2013            IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, IEM_ACCESS_INSTRUCTION, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
     2014#endif
    19992015        return iemRaisePageFault(pVCpu, GCPtrNext, IEM_ACCESS_INSTRUCTION, VERR_ACCESS_DENIED);
    20002016    }
     
    81688184        /** @todo Check unassigned memory in unpaged mode. */
    81698185        /** @todo Reserved bits in page tables. Requires new PGM interface. */
     8186#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     8187        if (Walk.fFailed & PGM_WALKFAIL_EPT)
     8188            IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, fAccess, IEM_SLAT_FAIL_LINEAR_TO_PHYS_ADDR, 0 /* cbInstr */);
     8189#endif
    81708190        *pGCPhysMem = NIL_RTGCPHYS;
    81718191        return iemRaisePageFault(pVCpu, GCPtrMem, fAccess, rc);
     
    81858205            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - read-only page -> #PF\n", GCPtrMem));
    81868206            *pGCPhysMem = NIL_RTGCPHYS;
     8207#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     8208            if (Walk.fFailed & PGM_WALKFAIL_EPT)
     8209                IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, fAccess, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
     8210#endif
    81878211            return iemRaisePageFault(pVCpu, GCPtrMem, fAccess & ~IEM_ACCESS_TYPE_READ, VERR_ACCESS_DENIED);
    81888212        }
     
    81958219            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - user access to kernel page -> #PF\n", GCPtrMem));
    81968220            *pGCPhysMem = NIL_RTGCPHYS;
     8221#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     8222            if (Walk.fFailed & PGM_WALKFAIL_EPT)
     8223                IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, fAccess, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
     8224#endif
    81978225            return iemRaisePageFault(pVCpu, GCPtrMem, fAccess, VERR_ACCESS_DENIED);
    81988226        }
     
    82058233            Log(("iemMemPageTranslateAndCheckAccess: GCPtrMem=%RGv - NX -> #PF\n", GCPtrMem));
    82068234            *pGCPhysMem = NIL_RTGCPHYS;
     8235#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
     8236            if (Walk.fFailed & PGM_WALKFAIL_EPT)
     8237                IEM_VMX_VMEXIT_EPT_RET(pVCpu, &Walk, fAccess, IEM_SLAT_FAIL_LINEAR_TO_PAGE_TABLE, 0 /* cbInstr */);
     8238#endif
    82078239            return iemRaisePageFault(pVCpu, GCPtrMem, fAccess & ~(IEM_ACCESS_TYPE_READ | IEM_ACCESS_TYPE_WRITE),
    82088240                                     VERR_ACCESS_DENIED);
     
    82208252        int rc2 = PGMGstModifyPage(pVCpu, GCPtrMem, 1, fAccessedDirty, ~(uint64_t)fAccessedDirty);
    82218253        AssertRC(rc2);
     8254        /** @todo Nested VMX: Accessed/dirty bit updates might fail and cause EPT
     8255         *        violations/EPT misconfigs. */
    82228256    }
    82238257
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