VirtualBox

Changeset 96747 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Sep 15, 2022 4:58:38 PM (2 years ago)
Author:
vboxsync
Message:

VMM/Nested VMX: bugref:10092 Conditional compile fixes for VBOX_WITH_NESTED_HWVIRT_VMX_EPT. Comments, naming and conservative state saving for nested EPT violation/misconfig for now.

File:
1 edited

Legend:

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

    r96407 r96747  
    261261static FNVMXEXITHANDLER            vmxHCExitXsetbv;
    262262static FNVMXEXITHANDLER            vmxHCExitInvpcid;
     263#ifndef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    263264static FNVMXEXITHANDLERNSRC        vmxHCExitSetPendingXcptUD;
     265#endif
    264266static FNVMXEXITHANDLERNSRC        vmxHCExitErrInvalidGuestState;
    265267static FNVMXEXITHANDLERNSRC        vmxHCExitErrUnexpected;
     
    675677    /* 48  VMX_EXIT_EPT_VIOLATION           */  { vmxHCExitEptViolation },
    676678    /* 49  VMX_EXIT_EPT_MISCONFIG           */  { vmxHCExitEptMisconfig },
    677 #if defined(VBOX_WITH_NESTED_HWVIRT_VMX) && defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT)
     679#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    678680    /* 50  VMX_EXIT_INVEPT                  */  { vmxHCExitInvept },
    679681#else
     
    23642366        /*
    23652367         * With nested-guests, we may have extended the guest/host mask here (since we
    2366          * merged in the outer guest's mask, see vmxHCMergeVmcsNested). This means, the
     2368         * merged in the outer guest's mask, see hmR0VmxMergeVmcsNested). This means, the
    23672369         * mask can include more bits (to read from the nested-guest CR4 read-shadow) than
    23682370         * the nested hypervisor originally supplied. Thus, we should, in essence, copy
     
    53625364            return vmxHCExitSetPendingXcptUD(pVCpu, pVmxTransient);
    53635365#endif
    5364 #if defined(VBOX_WITH_NESTED_HWVIRT_VMX) && defined(VBOX_WITH_NESTED_HWVIRT_VMX_EPT)
     5366#ifdef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    53655367        case VMX_EXIT_INVEPT:                  VMEXIT_CALL_RET(0, vmxHCExitInvept(pVCpu, pVmxTransient));
    53665368#else
     
    54335435        /*
    54345436         * Instructions that cause VM-exits unconditionally or the condition is
    5435          * always is taken solely from the nested hypervisor (meaning if the VM-exit
     5437         * always taken solely from the nested hypervisor (meaning if the VM-exit
    54365438         * happens, it's guaranteed to be a nested-guest VM-exit).
    54375439         *
     
    54525454        /*
    54535455         * Instructions that cause VM-exits unconditionally or the condition is
    5454          * always is taken solely from the nested hypervisor (meaning if the VM-exit
     5456         * always taken solely from the nested hypervisor (meaning if the VM-exit
    54555457         * happens, it's guaranteed to be a nested-guest VM-exit).
    54565458         *
     
    75257527
    75267528
     7529#ifndef VBOX_WITH_NESTED_HWVIRT_VMX_EPT
    75277530/**
    75287531 * VM-exit handler for instructions that result in a \#UD exception delivered to
     
    75357538    return VINF_SUCCESS;
    75367539}
     7540#endif
    75377541
    75387542
     
    1027510279    if (CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_EPT))
    1027610280    {
    10277         int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
     10281        int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, HMVMX_CPUMCTX_EXTRN_ALL);
    1027810282        AssertRCReturn(rc, rc);
    1027910283
    1028010284        vmxHCReadExitQualVmcs(pVCpu, pVmxTransient);
    10281         vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    1028210285        vmxHCReadGuestPhysicalAddrVmcs(pVCpu, pVmxTransient);
    1028310286
    10284         RTGCPHYS const GCPhysNested = pVmxTransient->uGuestPhysicalAddr;
    10285         uint64_t const uExitQual    = pVmxTransient->uExitQual;
    10286 
    10287         RTGCPTR GCPtrNested;
     10287        RTGCPHYS const GCPhysNestedFault = pVmxTransient->uGuestPhysicalAddr;
     10288        uint64_t const uExitQual         = pVmxTransient->uExitQual;
     10289
     10290        RTGCPTR GCPtrNestedFault;
    1028810291        bool const fIsLinearAddrValid = RT_BOOL(uExitQual & VMX_EXIT_QUAL_EPT_LINEAR_ADDR_VALID);
    1028910292        if (fIsLinearAddrValid)
    1029010293        {
    1029110294            vmxHCReadGuestLinearAddrVmcs(pVCpu, pVmxTransient);
    10292             GCPtrNested = pVmxTransient->uGuestLinearAddr;
     10295            GCPtrNestedFault = pVmxTransient->uGuestLinearAddr;
    1029310296        }
    1029410297        else
    10295             GCPtrNested = 0;
     10298            GCPtrNestedFault = 0;
    1029610299
    1029710300        RTGCUINT const uErr = ((uExitQual & VMX_EXIT_QUAL_EPT_ACCESS_INSTR_FETCH) ? X86_TRAP_PF_ID : 0)
     
    1030310306        PGMPTWALK Walk;
    1030410307        PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    10305         VBOXSTRICTRC rcStrict = PGMR0NestedTrap0eHandlerNestedPaging(pVCpu, PGMMODE_EPT, uErr, CPUMCTX2CORE(pCtx), GCPhysNested,
    10306                                                                      fIsLinearAddrValid, GCPtrNested, &Walk);
     10308        VBOXSTRICTRC rcStrict = PGMR0NestedTrap0eHandlerNestedPaging(pVCpu, PGMMODE_EPT, uErr, CPUMCTX2CORE(pCtx),
     10309                                                                     GCPhysNestedFault, fIsLinearAddrValid, GCPtrNestedFault,
     10310                                                                     &Walk);
    1030710311        if (RT_SUCCESS(rcStrict))
    10308         {
    10309             if (rcStrict == VINF_SUCCESS)
    10310                 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_GUEST_RIP | HM_CHANGED_GUEST_RFLAGS);
    10311             else if (rcStrict == VINF_IEM_RAISED_XCPT)
    10312             {
    10313                 ASMAtomicUoOrU64(&VCPU_2_VMXSTATE(pVCpu).fCtxChanged, HM_CHANGED_RAISED_XCPT_MASK);
    10314                 rcStrict = VINF_SUCCESS;
    10315             }
    1031610312            return rcStrict;
    10317         }
    10318 
     10313
     10314        vmxHCReadExitInstrLenVmcs(pVCpu, pVmxTransient);
    1031910315        vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    1032010316        vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
     
    1035710353    if (CPUMIsGuestVmxProcCtls2Set(&pVCpu->cpum.GstCtx, VMX_PROC_CTLS2_EPT))
    1035810354    {
    10359         int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, IEM_CPUMCTX_EXTRN_MUST_MASK);
     10355        int rc = vmxHCImportGuestState(pVCpu, pVmcsInfo, CPUMCTX_EXTRN_ALL);
    1036010356        AssertRCReturn(rc, rc);
    1036110357
     
    1036410360        PGMPTWALK Walk;
    1036510361        PCPUMCTX pCtx = &pVCpu->cpum.GstCtx;
    10366         RTGCPHYS const GCPhysNested = pVmxTransient->uGuestPhysicalAddr;
     10362        RTGCPHYS const GCPhysNestedFault = pVmxTransient->uGuestPhysicalAddr;
    1036710363        VBOXSTRICTRC rcStrict = PGMR0NestedTrap0eHandlerNestedPaging(pVCpu, PGMMODE_EPT, X86_TRAP_PF_RSVD, CPUMCTX2CORE(pCtx),
    10368                                                                      GCPhysNested, false /* fIsLinearAddrValid */,
    10369                                                                      0 /* GCPtrNested*/, &Walk);
     10364                                                                     GCPhysNestedFault, false /* fIsLinearAddrValid */,
     10365                                                                     0 /* GCPtrNestedFault */, &Walk);
    1037010366        if (RT_SUCCESS(rcStrict))
    10371             return VINF_EM_RAW_EMULATE_INSTR;
    10372 
     10367        {
     10368            AssertMsgFailed(("Shouldn't happen with the way we have programmed the EPT shadow tables\n"));
     10369            return rcStrict;
     10370        }
     10371
     10372        AssertMsg(Walk.fFailed & PGM_WALKFAIL_EPT_MISCONFIG, ("GCPhysNestedFault=%#RGp\n", GCPhysNestedFault));
    1037310373        vmxHCReadIdtVectoringInfoVmcs(pVCpu, pVmxTransient);
    1037410374        vmxHCReadIdtVectoringErrorCodeVmcs(pVCpu, pVmxTransient);
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