VirtualBox

Changeset 74337 in vbox


Ignore:
Timestamp:
Sep 18, 2018 9:51:21 AM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
125147
Message:

VMM/IEM: Nested VMX: bugref:9180 vmlaunch/vmresume bits.

Location:
trunk
Files:
2 edited

Legend:

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

    r74303 r74337  
    544544                /** 0x2e8 - Guest physical address of the current VMCS pointer. */
    545545                RTGCPHYS                GCPhysVmcs;
    546                 /** 0x2f0 - Last emulated VMX instruction/VM-exit diagnostic. */
     546                /** 0x2f0 - Guest physical address of the shadow VMCS pointer. */
     547                RTGCPHYS                GCPhysShadowVmcs;
     548                /** 0x2f8 - Last emulated VMX instruction/VM-exit diagnostic. */
    547549                VMXVDIAG                enmDiag;
    548                 /** 0x2f4 - Whether the guest is in VMX root mode. */
     550                /** 0x2fc - Whether the guest is in VMX root mode. */
    549551                bool                    fInVmxRootMode;
    550                 /** 0x2f5 - Whether the guest is in VMX non-root mode. */
     552                /** 0x2fd - Whether the guest is in VMX non-root mode. */
    551553                bool                    fInVmxNonRootMode;
    552                 /** 0x2f6 - Whether the injected events are subjected to event intercepts.  */
     554                /** 0x2fe - Whether the injected events are subjected to event intercepts.  */
    553555                bool                    fInterceptEvents;
    554                 bool                    afPadding[1];
    555                 /** 0x2f8 - Cache of the nested-guest current VMCS - R0 ptr. */
     556                bool                    fPadding0;
     557                /** 0x300 - Cache of the nested-guest current VMCS - R0 ptr. */
    556558                R0PTRTYPE(PVMXVVMCS)    pVmcsR0;
    557559#if HC_ARCH_BITS == 32
    558560                uint32_t                uVmcsR0Padding;
    559561#endif
    560                 /** 0x300 - Cache of the nested-guest curent VMCS - R3 ptr. */
     562                /** 0x308 - Cache of the nested-guest curent VMCS - R3 ptr. */
    561563                R3PTRTYPE(PVMXVVMCS)    pVmcsR3;
    562564#if HC_ARCH_BITS == 32
    563565                uint32_t                uVmcsR3Padding;
    564566#endif
    565                 /** 0X308 - Cache of the nested-guest shadow VMCS - R0 ptr. */
     567                /** 0X310 - Cache of the nested-guest shadow VMCS - R0 ptr. */
    566568                R0PTRTYPE(PVMXVVMCS)    pShadowVmcsR0;
    567569#if HC_ARCH_BITS == 32
    568570                uint32_t                uShadowVmcsR0Padding;
    569571#endif
    570                 /** 0x310 - Cache of the nested-guest shadow VMCS - R3 ptr. */
     572                /** 0x318 - Cache of the nested-guest shadow VMCS - R3 ptr. */
    571573                R3PTRTYPE(PVMXVVMCS)    pShadowVmcsR3;
    572574#if HC_ARCH_BITS == 32
    573575                uint32_t                uShadowVmcsR3Padding;
    574576#endif
    575                 /** 0x318 - Cache of the nested-guest Virtual-APIC page - R0 ptr. */
     577                /** 0x320 - Cache of the nested-guest Virtual-APIC page - R0 ptr. */
    576578                R0PTRTYPE(void *)       pvVirtApicPageR0;
    577579#if HC_ARCH_BITS == 32
    578580                uint32_t                uVirtApicPageR0Padding;
    579581#endif
    580                 /** 0x320 - Cache of the nested-guest Virtual-APIC page - R3 ptr. */
     582                /** 0x328 - Cache of the nested-guest Virtual-APIC page - R3 ptr. */
    581583                R3PTRTYPE(void *)       pvVirtApicPageR3;
    582584#if HC_ARCH_BITS == 32
    583585                uint32_t                uVirtApicPageR3Padding;
    584586#endif
    585                 /** 0x328 - Cache of the nested-guest VMREAD-bitmap - R0 ptr. */
     587                /** 0x330 - Cache of the nested-guest VMREAD-bitmap - R0 ptr. */
    586588                R0PTRTYPE(void *)       pvVmreadBitmapR0;
    587589#if HC_ARCH_BITS == 32
    588590                uint32_t                uVmreadBitmapR0Padding;
    589591#endif
    590                 /** 0x330 - Cache of the nested-guest VMREAD-bitmap - R3 ptr. */
     592                /** 0x338 - Cache of the nested-guest VMREAD-bitmap - R3 ptr. */
    591593                R3PTRTYPE(void *)       pvVmreadBitmapR3;
    592594#if HC_ARCH_BITS == 32
    593595                uint32_t                uVmreadBitmapR3Padding;
    594596#endif
    595                 /** 0x338 - Cache of the nested-guest VMWRITE-bitmap - R0 ptr. */
     597                /** 0x340 - Cache of the nested-guest VMWRITE-bitmap - R0 ptr. */
    596598                R0PTRTYPE(void *)       pvVmwriteBitmapR0;
    597599#if HC_ARCH_BITS == 32
    598600                uint32_t                uVmwriteBitmapR0Padding;
    599601#endif
    600                 /** 0x340 - Cache of the nested-guest VMWRITE-bitmap - R3 ptr. */
     602                /** 0x348 - Cache of the nested-guest VMWRITE-bitmap - R3 ptr. */
    601603                R3PTRTYPE(void *)       pvVmwriteBitmapR3;
    602604#if HC_ARCH_BITS == 32
    603605                uint32_t                uVmwriteBitmapR3Padding;
    604606#endif
    605                 /** 0x348 - The MSR auto-load/store area - R0 ptr. */
     607                /** 0x350 - The MSR auto-load/store area - R0 ptr. */
    606608                R0PTRTYPE(PVMXAUTOMSR)  pAutoMsrAreaR0;
    607609#if HC_ARCH_BITS == 32
    608610                uint32_t                uAutoMsrAreaR0;
    609611#endif
    610                 /** 0x350 - The MSR auto-load/store area - R3 ptr. */
     612                /** 0x358 - The MSR auto-load/store area - R3 ptr. */
    611613                R3PTRTYPE(PVMXAUTOMSR)  pAutoMsrAreaR3;
    612614#if HC_ARCH_BITS == 32
    613615                uint32_t                uAutoMsrAreaR3;
    614616#endif
    615                 /** 0x358 - Padding. */
    616                 uint8_t             abPadding[0x3f0 - 0x358];
     617                /** 0x360 - Padding. */
     618                uint8_t             abPadding[0x3f0 - 0x360];
    617619            } vmx;
    618620        } CPUM_UNION_NM(s);
     
    690692AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR3,           0x3e0);
    691693AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.HCPhysVmcb,             0x3e8);
    692 AssertCompileMemberOffset(CPUMCTX, hwvirt.uInhibitRip,         0x3f0);
    693 AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x3f8);
    694 AssertCompileMemberOffset(CPUMCTX, hwvirt.fGif,                0x3fc);
    695694AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0,       8);
    696695AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 8);
     
    698697AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmxon,            0x2e0);
    699698AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmcs,             0x2e8);
    700 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmDiag,                0x2f0);
    701 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxRootMode,         0x2f4);
    702 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxNonRootMode,      0x2f5);
    703 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0,                0x2f8);
    704 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR3,                0x300);
    705 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0,          0x308);
    706 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR3,          0x310);
    707 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR0,       0x318);
    708 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR3,       0x320);
    709 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0,       0x328);
    710 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR3,       0x330);
    711 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0,      0x338);
    712 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR3,      0x340);
     699AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysShadowVmcs,       0x2f0);
     700AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmDiag,                0x2f8);
     701AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxRootMode,         0x2fc);
     702AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxNonRootMode,      0x2fd);
     703AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInterceptEvents,       0x2fe);
     704AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0,                0x300);
     705AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR3,                0x308);
     706AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0,          0x310);
     707AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR3,          0x318);
     708AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR0,       0x320);
     709AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR3,       0x328);
     710AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0,       0x330);
     711AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR3,       0x338);
     712AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0,      0x340);
     713AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR3,      0x348);
     714AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR0,         0x350);
     715AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR3,         0x358);
    713716AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0,           8);
    714717AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0,     8);
     
    716719AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0,  8);
    717720AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 8);
     721AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR0,    8);
     722AssertCompileMemberOffset(CPUMCTX, hwvirt.uInhibitRip,         0x3f0);
     723AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x3f8);
     724AssertCompileMemberOffset(CPUMCTX, hwvirt.fGif,                0x3fc);
    718725AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_NM(g.) aGRegs);
    719726AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw2.)  r0);
  • trunk/src/VBox/VMM/VMMAll/IEMAllCImplVmxInstr.cpp.h

    r74304 r74337  
    361361# endif /* !IEM_WITH_CODE_TLB */
    362362
     363/** Gets the guest-physical address of the shadows VMCS for the given VCPU. */
     364#define IEM_VMX_GET_SHADOW_VMCS(a_pVCpu)            ((a_pVCpu)->cpum.GstCtx.hwvirt.vmx.GCPhysShadowVmcs)
     365
    363366/** Whether a shadow VMCS is present for the given VCPU. */
    364367#define IEM_VMX_HAS_SHADOW_VMCS(a_pVCpu)            RT_BOOL(IEM_VMX_GET_SHADOW_VMCS(a_pVCpu) != NIL_RTGCPHYS)
    365368
    366 /** Gets the guest-physical address of the shadows VMCS for the given VCPU. */
    367 #define IEM_VMX_GET_SHADOW_VMCS(a_pVCpu)            ((a_pVCpu)->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pVmcs)->u64VmcsLinkPtr.u)
    368 
    369369/** Gets the VMXON region pointer. */
    370370#define IEM_VMX_GET_VMXON_PTR(a_pVCpu)              ((a_pVCpu)->cpum.GstCtx.hwvirt.vmx.GCPhysVmxon)
    371371
     372/** Gets the guest-physical address of the current VMCS for the given VCPU. */
     373#define IEM_VMX_GET_CURRENT_VMCS(a_pVCpu)           ((a_pVCpu)->cpum.GstCtx.hwvirt.vmx.GCPhysVmcs)
     374
    372375/** Whether a current VMCS is present for the given VCPU. */
    373376#define IEM_VMX_HAS_CURRENT_VMCS(a_pVCpu)           RT_BOOL(IEM_VMX_GET_CURRENT_VMCS(a_pVCpu) != NIL_RTGCPHYS)
    374 
    375 /** Gets the guest-physical address of the current VMCS for the given VCPU. */
    376 #define IEM_VMX_GET_CURRENT_VMCS(a_pVCpu)           ((a_pVCpu)->cpum.GstCtx.hwvirt.vmx.GCPhysVmcs)
    377377
    378378/** Assigns the guest-physical address of the current VMCS for the given VCPU. */
     
    30813081    if (pVmcs->u64VmcsLinkPtr.u != UINT64_C(0xffffffffffffffff))
    30823082    {
     3083        RTGCPHYS const GCPhysShadowVmcs = pVmcs->u64VmcsLinkPtr.u;
    30833084        /* We don't support SMM yet (so VMCS link pointer cannot be the current VMCS). */
    3084         if (pVmcs->u64VmcsLinkPtr.u != IEM_VMX_GET_CURRENT_VMCS(pVCpu))
     3085        if (GCPhysShadowVmcs != IEM_VMX_GET_CURRENT_VMCS(pVCpu))
    30853086        { /* likely */ }
    30863087        else
     
    30913092
    30923093        /* Validate the address. */
    3093         if (   (pVmcs->u64VmcsLinkPtr.u & X86_PAGE_4K_OFFSET_MASK)
    3094             || (pVmcs->u64VmcsLinkPtr.u >> IEM_GET_GUEST_CPU_FEATURES(pVCpu)->cVmxMaxPhysAddrWidth)
    3095             || !PGMPhysIsGCPhysNormal(pVCpu->CTX_SUFF(pVM), pVmcs->u64VmcsLinkPtr.u))
     3094        if (   (GCPhysShadowVmcs & X86_PAGE_4K_OFFSET_MASK)
     3095            || (GCPhysShadowVmcs >> IEM_GET_GUEST_CPU_FEATURES(pVCpu)->cVmxMaxPhysAddrWidth)
     3096            || !PGMPhysIsGCPhysNormal(pVCpu->CTX_SUFF(pVM), GCPhysShadowVmcs))
    30963097        {
    30973098            pVmcs->u64ExitQual.u = VMX_ENTRY_FAIL_QUAL_VMCS_LINK_PTR;
     
    31023103        Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs));
    31033104        int rc = PGMPhysSimpleReadGCPhys(pVCpu->CTX_SUFF(pVM), pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs),
    3104                                          pVmcs->u64VmcsLinkPtr.u, VMX_V_VMCS_SIZE);
     3105                                         GCPhysShadowVmcs, VMX_V_VMCS_SIZE);
    31053106        if (RT_FAILURE(rc))
    31063107        {
     
    31273128            IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_VmcsLinkPtrShadow);
    31283129        }
     3130
     3131        /* Finally update our cache of the guest physical address of the shadow VMCS. */
     3132        pVCpu->cpum.GstCtx.hwvirt.vmx.GCPhysShadowVmcs = GCPhysShadowVmcs;
    31293133    }
    31303134
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette