Changeset 74337 in vbox
- Timestamp:
- Sep 18, 2018 9:51:21 AM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 125147
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpumctx.h
r74303 r74337 544 544 /** 0x2e8 - Guest physical address of the current VMCS pointer. */ 545 545 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. */ 547 549 VMXVDIAG enmDiag; 548 /** 0x2f 4- Whether the guest is in VMX root mode. */550 /** 0x2fc - Whether the guest is in VMX root mode. */ 549 551 bool fInVmxRootMode; 550 /** 0x2f 5- Whether the guest is in VMX non-root mode. */552 /** 0x2fd - Whether the guest is in VMX non-root mode. */ 551 553 bool fInVmxNonRootMode; 552 /** 0x2f 6- Whether the injected events are subjected to event intercepts. */554 /** 0x2fe - Whether the injected events are subjected to event intercepts. */ 553 555 bool fInterceptEvents; 554 bool afPadding[1];555 /** 0x 2f8- Cache of the nested-guest current VMCS - R0 ptr. */556 bool fPadding0; 557 /** 0x300 - Cache of the nested-guest current VMCS - R0 ptr. */ 556 558 R0PTRTYPE(PVMXVVMCS) pVmcsR0; 557 559 #if HC_ARCH_BITS == 32 558 560 uint32_t uVmcsR0Padding; 559 561 #endif 560 /** 0x30 0- Cache of the nested-guest curent VMCS - R3 ptr. */562 /** 0x308 - Cache of the nested-guest curent VMCS - R3 ptr. */ 561 563 R3PTRTYPE(PVMXVVMCS) pVmcsR3; 562 564 #if HC_ARCH_BITS == 32 563 565 uint32_t uVmcsR3Padding; 564 566 #endif 565 /** 0X3 08- Cache of the nested-guest shadow VMCS - R0 ptr. */567 /** 0X310 - Cache of the nested-guest shadow VMCS - R0 ptr. */ 566 568 R0PTRTYPE(PVMXVVMCS) pShadowVmcsR0; 567 569 #if HC_ARCH_BITS == 32 568 570 uint32_t uShadowVmcsR0Padding; 569 571 #endif 570 /** 0x31 0- Cache of the nested-guest shadow VMCS - R3 ptr. */572 /** 0x318 - Cache of the nested-guest shadow VMCS - R3 ptr. */ 571 573 R3PTRTYPE(PVMXVVMCS) pShadowVmcsR3; 572 574 #if HC_ARCH_BITS == 32 573 575 uint32_t uShadowVmcsR3Padding; 574 576 #endif 575 /** 0x3 18- Cache of the nested-guest Virtual-APIC page - R0 ptr. */577 /** 0x320 - Cache of the nested-guest Virtual-APIC page - R0 ptr. */ 576 578 R0PTRTYPE(void *) pvVirtApicPageR0; 577 579 #if HC_ARCH_BITS == 32 578 580 uint32_t uVirtApicPageR0Padding; 579 581 #endif 580 /** 0x32 0- Cache of the nested-guest Virtual-APIC page - R3 ptr. */582 /** 0x328 - Cache of the nested-guest Virtual-APIC page - R3 ptr. */ 581 583 R3PTRTYPE(void *) pvVirtApicPageR3; 582 584 #if HC_ARCH_BITS == 32 583 585 uint32_t uVirtApicPageR3Padding; 584 586 #endif 585 /** 0x3 28- Cache of the nested-guest VMREAD-bitmap - R0 ptr. */587 /** 0x330 - Cache of the nested-guest VMREAD-bitmap - R0 ptr. */ 586 588 R0PTRTYPE(void *) pvVmreadBitmapR0; 587 589 #if HC_ARCH_BITS == 32 588 590 uint32_t uVmreadBitmapR0Padding; 589 591 #endif 590 /** 0x33 0- Cache of the nested-guest VMREAD-bitmap - R3 ptr. */592 /** 0x338 - Cache of the nested-guest VMREAD-bitmap - R3 ptr. */ 591 593 R3PTRTYPE(void *) pvVmreadBitmapR3; 592 594 #if HC_ARCH_BITS == 32 593 595 uint32_t uVmreadBitmapR3Padding; 594 596 #endif 595 /** 0x3 38- Cache of the nested-guest VMWRITE-bitmap - R0 ptr. */597 /** 0x340 - Cache of the nested-guest VMWRITE-bitmap - R0 ptr. */ 596 598 R0PTRTYPE(void *) pvVmwriteBitmapR0; 597 599 #if HC_ARCH_BITS == 32 598 600 uint32_t uVmwriteBitmapR0Padding; 599 601 #endif 600 /** 0x34 0- Cache of the nested-guest VMWRITE-bitmap - R3 ptr. */602 /** 0x348 - Cache of the nested-guest VMWRITE-bitmap - R3 ptr. */ 601 603 R3PTRTYPE(void *) pvVmwriteBitmapR3; 602 604 #if HC_ARCH_BITS == 32 603 605 uint32_t uVmwriteBitmapR3Padding; 604 606 #endif 605 /** 0x3 48- The MSR auto-load/store area - R0 ptr. */607 /** 0x350 - The MSR auto-load/store area - R0 ptr. */ 606 608 R0PTRTYPE(PVMXAUTOMSR) pAutoMsrAreaR0; 607 609 #if HC_ARCH_BITS == 32 608 610 uint32_t uAutoMsrAreaR0; 609 611 #endif 610 /** 0x35 0- The MSR auto-load/store area - R3 ptr. */612 /** 0x358 - The MSR auto-load/store area - R3 ptr. */ 611 613 R3PTRTYPE(PVMXAUTOMSR) pAutoMsrAreaR3; 612 614 #if HC_ARCH_BITS == 32 613 615 uint32_t uAutoMsrAreaR3; 614 616 #endif 615 /** 0x3 58- Padding. */616 uint8_t abPadding[0x3f0 - 0x3 58];617 /** 0x360 - Padding. */ 618 uint8_t abPadding[0x3f0 - 0x360]; 617 619 } vmx; 618 620 } CPUM_UNION_NM(s); … … 690 692 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvIoBitmapR3, 0x3e0); 691 693 AssertCompileMemberOffset(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);695 694 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pVmcbR0, 8); 696 695 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) svm.pvMsrBitmapR0, 8); … … 698 697 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysVmxon, 0x2e0); 699 698 AssertCompileMemberOffset(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); 699 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.GCPhysShadowVmcs, 0x2f0); 700 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.enmDiag, 0x2f8); 701 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxRootMode, 0x2fc); 702 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInVmxNonRootMode, 0x2fd); 703 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.fInterceptEvents, 0x2fe); 704 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0, 0x300); 705 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR3, 0x308); 706 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0, 0x310); 707 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR3, 0x318); 708 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR0, 0x320); 709 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVirtApicPageR3, 0x328); 710 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0, 0x330); 711 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR3, 0x338); 712 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 0x340); 713 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR3, 0x348); 714 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR0, 0x350); 715 AssertCompileMemberOffset(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR3, 0x358); 713 716 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pVmcsR0, 8); 714 717 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pShadowVmcsR0, 8); … … 716 719 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmreadBitmapR0, 8); 717 720 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pvVmwriteBitmapR0, 8); 721 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.pAutoMsrAreaR0, 8); 722 AssertCompileMemberOffset(CPUMCTX, hwvirt.uInhibitRip, 0x3f0); 723 AssertCompileMemberOffset(CPUMCTX, hwvirt.fLocalForcedActions, 0x3f8); 724 AssertCompileMemberOffset(CPUMCTX, hwvirt.fGif, 0x3fc); 718 725 AssertCompileMembersAtSameOffset(CPUMCTX, CPUM_UNION_STRUCT_NM(g,qw.) rax, CPUMCTX, CPUM_UNION_NM(g.) aGRegs); 719 726 AssertCompileMembersAtSameOffset(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 361 361 # endif /* !IEM_WITH_CODE_TLB */ 362 362 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 363 366 /** Whether a shadow VMCS is present for the given VCPU. */ 364 367 #define IEM_VMX_HAS_SHADOW_VMCS(a_pVCpu) RT_BOOL(IEM_VMX_GET_SHADOW_VMCS(a_pVCpu) != NIL_RTGCPHYS) 365 368 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 369 369 /** Gets the VMXON region pointer. */ 370 370 #define IEM_VMX_GET_VMXON_PTR(a_pVCpu) ((a_pVCpu)->cpum.GstCtx.hwvirt.vmx.GCPhysVmxon) 371 371 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 372 375 /** Whether a current VMCS is present for the given VCPU. */ 373 376 #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)377 377 378 378 /** Assigns the guest-physical address of the current VMCS for the given VCPU. */ … … 3081 3081 if (pVmcs->u64VmcsLinkPtr.u != UINT64_C(0xffffffffffffffff)) 3082 3082 { 3083 RTGCPHYS const GCPhysShadowVmcs = pVmcs->u64VmcsLinkPtr.u; 3083 3084 /* 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)) 3085 3086 { /* likely */ } 3086 3087 else … … 3091 3092 3092 3093 /* 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)) 3096 3097 { 3097 3098 pVmcs->u64ExitQual.u = VMX_ENTRY_FAIL_QUAL_VMCS_LINK_PTR; … … 3102 3103 Assert(pVCpu->cpum.GstCtx.hwvirt.vmx.CTX_SUFF(pShadowVmcs)); 3103 3104 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); 3105 3106 if (RT_FAILURE(rc)) 3106 3107 { … … 3127 3128 IEM_VMX_VMENTRY_FAILED_RET(pVCpu, pszInstr, pszFailure, kVmxVDiag_Vmentry_VmcsLinkPtrShadow); 3128 3129 } 3130 3131 /* Finally update our cache of the guest physical address of the shadow VMCS. */ 3132 pVCpu->cpum.GstCtx.hwvirt.vmx.GCPhysShadowVmcs = GCPhysShadowVmcs; 3129 3133 } 3130 3134
Note:
See TracChangeset
for help on using the changeset viewer.