Changeset 91306 in vbox
- Timestamp:
- Sep 17, 2021 9:11:01 PM (3 years ago)
- svn:sync-xref-src-repo-rev:
- 146966
- Location:
- trunk
- Files:
-
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/cpum.h
r91303 r91306 2441 2441 } 2442 2442 2443 /**2444 * Gets the nested-guest virtual-APIC page.2445 *2446 * @returns The virtual-APIC page.2447 * @param pCtx Pointer to the context.2448 * @param pHCPhys Where to store the host-physical address of the virtual-APIC2449 * page.2450 */2451 DECLINLINE(void *) CPUMGetGuestVmxVirtApicPage(PCCPUMCTX pCtx, PRTHCPHYS pHCPhysVirtApicPage)2452 {2453 Assert(pHCPhysVirtApicPage);2454 Assert(pCtx->hwvirt.enmHwvirt == CPUMHWVIRT_VMX);2455 *pHCPhysVirtApicPage = pCtx->hwvirt.vmx.HCPhysVirtApicPage;2456 return pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage);2457 }2458 2459 2443 # endif /* !IN_RC */ 2460 2444 -
trunk/include/VBox/vmm/cpum.mac
r91305 r91306 290 290 .hwvirt.vmx.abMsrBitmap resb 0x1000 291 291 .hwvirt.vmx.abIoBitmap resb 0x1000+0x1000 292 .hwvirt.vmx.abVirtApicPage resb 0x1000 292 293 alignb 8 293 294 .hwvirt.vmx.GCPhysVmxon resq 1 … … 302 303 .hwvirt.vmx.fInterceptEvents resb 1 303 304 .hwvirt.vmx.fNmiUnblockingIret resb 1 304 .hwvirt.vmx.pvVirtApicPageR0 resq 1305 .hwvirt.vmx.pvVirtApicPageR3 resq 1306 305 .hwvirt.vmx.uFirstPauseLoopTick resq 1 307 306 .hwvirt.vmx.uPrevPauseTick resq 1 … … 311 310 alignb 8 312 311 .hwvirt.vmx.Msrs resb 224 313 .hwvirt.vmx.HCPhysVirtApicPage resq 1314 312 315 313 alignb 8 -
trunk/include/VBox/vmm/cpumctx.h
r91305 r91306 557 557 /** 0x10000 - The I/O permission bitmap. */ 558 558 uint8_t abIoBitmap[VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE]; 559 /** 0x12000 - The virtual-APIC page. 560 * @note This is used by VT-x hardware... */ 561 uint8_t abVirtApicPage[VMX_V_VIRT_APIC_SIZE]; 559 562 560 563 /** 0x300 - Guest physical address of the VMXON region. */ … … 582 585 * mode before execution of IRET. */ 583 586 bool fNmiUnblockingIret; 584 /** 0x350 - The virtual-APIC page - R0 ptr. */585 R0PTRTYPE(void *) pvVirtApicPageR0;586 /** 0x358 - The virtual-APIC page - R3 ptr. */587 R3PTRTYPE(void *) pvVirtApicPageR3;588 587 /** 0x3d0 - Guest TSC timestamp of the first PAUSE instruction that is considered to 589 588 * be the first in a loop. */ … … 601 600 /** 0x3f0 - Guest VMX MSRs. */ 602 601 VMXMSRS Msrs; 603 /** 0x4e0 - Host physical address of the virtual-APIC page. */604 RTHCPHYS HCPhysVirtApicPage;605 602 } vmx; 606 603 } CPUM_UNION_NM(s); … … 619 616 uint32_t fPadding; 620 617 #endif 618 #if 0 621 619 /** 0x530 - Pad to 64 byte boundary. */ 622 uint8_t abPadding0[8+32]; 620 uint8_t abPadding0[8+16+32]; 621 #endif 623 622 } hwvirt; 624 623 } CPUMCTX; … … 838 837 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abMsrBitmap, X86_PAGE_SIZE); 839 838 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abIoBitmap, X86_PAGE_SIZE); 839 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.abVirtApicPage, X86_PAGE_SIZE); 840 840 AssertCompileMemberAlignment(CPUMCTX, hwvirt.CPUM_UNION_NM(s.) vmx.Msrs, 8); 841 841 -
trunk/include/VBox/vmm/vm.h
r91305 r91306 305 305 CPUMCTX GstCtx; 306 306 #endif 307 uint8_t padding[ 98304];/* multiple of 4096 */307 uint8_t padding[102400]; /* multiple of 4096 */ 308 308 } cpum; 309 309 -
trunk/include/VBox/vmm/vm.mac
r91305 r91306 91 91 .pgm resb 4096+28672 92 92 alignb 4096 93 .cpum resb 9830493 .cpum resb 102400 94 94 %define VMCPU.cpum.GstCtx VMCPU.cpum 95 95 alignb 4096 -
trunk/src/VBox/VMM/VMMR0/HMVMXR0.cpp
r91304 r91306 1972 1972 else 1973 1973 { 1974 pVmcsInfo->pbVirtApic = (uint8_t *)CPUMGetGuestVmxVirtApicPage(&pVCpu->cpum.GstCtx, &pVmcsInfo->HCPhysVirtApic);1975 Assert(pVmcsInfo->pbVirtApic);1974 pVmcsInfo->pbVirtApic = &pVCpu->cpum.GstCtx.hwvirt.vmx.abVirtApicPage[0]; 1975 pVmcsInfo->HCPhysVirtApic = GVMMR0ConvertGVMPtr2HCPhys(pVM, pVmcsInfo->pbVirtApic); 1976 1976 Assert(pVmcsInfo->HCPhysVirtApic && pVmcsInfo->HCPhysVirtApic != NIL_RTHCPHYS); 1977 1977 } -
trunk/src/VBox/VMM/VMMR3/CPUM.cpp
r91305 r91306 1019 1019 Assert(pVM->cpum.s.GuestFeatures.fSvm); 1020 1020 1021 LogRel(("CPUM: Allocating %u pages for the nested-guest SVM MSR and IO permission bitmaps\n", 1022 pVM->cCpus * (SVM_MSRPM_PAGES + SVM_IOPM_PAGES))); 1021 LogRel(("CPUM: AMD-V nested-guest init\n")); 1023 1022 for (VMCPUID i = 0; i < pVM->cCpus; i++) 1024 1023 { … … 1050 1049 1051 1050 /** 1052 * Frees memory allocatedfor the VMX hardware virtualization state.1051 * Allocates memory for the VMX hardware virtualization state. 1053 1052 * 1054 1053 * @param pVM The cross context VM structure. 1055 1054 */ 1056 static void cpumR3 FreeVmxHwVirtState(PVM pVM)1057 { 1058 Assert(pVM->cpum.s.GuestFeatures.fVmx);1055 static void cpumR3InitVmxHwVirtState(PVM pVM) 1056 { 1057 LogRel(("CPUM: VT-x nested-guest init\n")); 1059 1058 for (VMCPUID i = 0; i < pVM->cCpus; i++) 1060 1059 { … … 1062 1061 PCPUMCTX pCtx = &pVCpu->cpum.s.Guest; 1063 1062 1064 if (pCtx->hwvirt.vmx.pvVirtApicPageR3)1065 {1066 SUPR3ContFree(pCtx->hwvirt.vmx.pvVirtApicPageR3, VMX_V_VIRT_APIC_PAGES);1067 pCtx->hwvirt.vmx.pvVirtApicPageR3 = NULL;1068 }1069 }1070 }1071 1072 1073 /**1074 * Allocates memory for the VMX hardware virtualization state.1075 *1076 * @returns VBox status code.1077 * @param pVM The cross context VM structure.1078 */1079 static int cpumR3AllocVmxHwVirtState(PVM pVM)1080 {1081 int rc = VINF_SUCCESS;1082 uint32_t const cPages = VMX_V_VMCS_PAGES1083 + VMX_V_SHADOW_VMCS_PAGES1084 + VMX_V_VIRT_APIC_PAGES1085 + (2 * VMX_V_VMREAD_VMWRITE_BITMAP_PAGES)1086 + (3 * VMX_V_AUTOMSR_AREA_PAGES)1087 + VMX_V_MSR_BITMAP_PAGES1088 + (VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES);1089 LogRel(("CPUM: Allocating %u pages for the nested-guest VMCS and related structures\n", pVM->cCpus * cPages));1090 for (VMCPUID i = 0; i < pVM->cCpus; i++)1091 {1092 PVMCPU pVCpu = pVM->apCpusR3[i];1093 PCPUMCTX pCtx = &pVCpu->cpum.s.Guest;1094 1063 pCtx->hwvirt.enmHwvirt = CPUMHWVIRT_VMX; 1095 1064 … … 1112 1081 AssertCompile(sizeof(pCtx->hwvirt.vmx.abIoBitmap) == (VMX_V_IO_BITMAP_A_PAGES + VMX_V_IO_BITMAP_B_PAGES) * X86_PAGE_SIZE); 1113 1082 AssertCompile(sizeof(pCtx->hwvirt.vmx.abIoBitmap) == VMX_V_IO_BITMAP_A_SIZE + VMX_V_IO_BITMAP_B_SIZE); 1114 1115 /* 1116 * Allocate the virtual-APIC page. 1117 */ 1118 pCtx->hwvirt.vmx.pvVirtApicPageR3 = SUPR3ContAlloc(VMX_V_VIRT_APIC_PAGES, 1119 &pCtx->hwvirt.vmx.pvVirtApicPageR0, 1120 &pCtx->hwvirt.vmx.HCPhysVirtApicPage); 1121 if (pCtx->hwvirt.vmx.pvVirtApicPageR3) 1122 { /* likely */ } 1123 else 1124 { 1125 LogRel(("CPUM%u: Failed to alloc %u pages for the nested-guest's virtual-APIC page\n", pVCpu->idCpu, 1126 VMX_V_VIRT_APIC_PAGES)); 1127 break; 1128 } 1083 AssertCompile(sizeof(pCtx->hwvirt.vmx.abVirtApicPage) == VMX_V_VIRT_APIC_PAGES * X86_PAGE_SIZE); 1084 AssertCompile(sizeof(pCtx->hwvirt.vmx.abVirtApicPage) == VMX_V_VIRT_APIC_SIZE); 1129 1085 1130 1086 /* … … 1141 1097 RT_ZERO(pCtx->hwvirt.vmx.abMsrBitmap); 1142 1098 RT_ZERO(pCtx->hwvirt.vmx.abIoBitmap); 1143 memset(pCtx->hwvirt.vmx.CTX_SUFF(pvVirtApicPage), 0, VMX_V_VIRT_APIC_SIZE); 1144 } 1145 1146 /* On any failure, cleanup. */ 1147 if (RT_FAILURE(rc)) 1148 cpumR3FreeVmxHwVirtState(pVM); 1149 1150 return rc; 1099 RT_ZERO(pCtx->hwvirt.vmx.abVirtApicPage); 1100 } 1151 1101 } 1152 1102 … … 2089 2039 2090 2040 /* 2091 * Allocate memory required by the guest hardware-virtualization structures. 2041 * Init the VMX/SVM state. 2042 * 2092 2043 * This must be done after initializing CPUID/MSR features as we access the 2093 2044 * the VMX/SVM guest features below. … … 2097 2048 */ 2098 2049 if (pVM->cpum.s.GuestFeatures.fVmx) 2099 rc = cpumR3AllocVmxHwVirtState(pVM);2050 cpumR3InitVmxHwVirtState(pVM); 2100 2051 else if (pVM->cpum.s.GuestFeatures.fSvm) 2101 2052 cpumR3InitSvmHwVirtState(pVM); 2102 2053 else 2103 2054 Assert(pVM->apCpusR3[0]->cpum.s.Guest.hwvirt.enmHwvirt == CPUMHWVIRT_NONE); 2104 if (RT_FAILURE(rc))2105 return rc;2106 2055 2107 2056 CPUMR3Reset(pVM); … … 2157 2106 } 2158 2107 } 2159 2160 cpumR3FreeVmxHwVirtState(pVM);2161 2108 } 2162 2109 return VINF_SUCCESS; -
trunk/src/VBox/VMM/include/CPUMInternal.mac
r91305 r91306 257 257 .Guest.hwvirt.vmx.abMsrBitmap resb 0x1000 258 258 .Guest.hwvirt.vmx.abIoBitmap resb 0x1000+0x1000 259 .Guest.hwvirt.vmx.abVirtApicPage resb 0x1000 259 260 alignb 8 260 261 .Guest.hwvirt.vmx.GCPhysVmxon resq 1 … … 269 270 .Guest.hwvirt.vmx.fInterceptEvents resb 1 270 271 .Guest.hwvirt.vmx.fNmiUnblockingIret resb 1 271 .Guest.hwvirt.vmx.pvVirtApicPageR0 resq 1272 .Guest.hwvirt.vmx.pvVirtApicPageR3 resq 1273 272 .Guest.hwvirt.vmx.uFirstPauseLoopTick resq 1 274 273 .Guest.hwvirt.vmx.uPrevPauseTick resq 1 … … 278 277 alignb 8 279 278 .Guest.hwvirt.vmx.Msrs resb 224 280 .Guest.hwvirt.vmx.HCPhysVirtApicPage resq 1281 279 282 280 alignb 8 -
trunk/src/VBox/VMM/testcase/tstVMStruct.h
r91305 r91306 148 148 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fInterceptEvents); 149 149 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.fNmiUnblockingIret); 150 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR0);151 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.pvVirtApicPageR3);152 150 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uFirstPauseLoopTick); 153 151 GEN_CHECK_OFF(CPUMCTX, hwvirt.vmx.uPrevPauseTick); -
trunk/src/VBox/VMM/testcase/tstVMStructSize.cpp
r91305 r91306 261 261 CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abMsrBitmap, 4096); 262 262 CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abIoBitmap, 4096); 263 CHECK_MEMBER_ALIGNMENT(VMCPU, cpum.s.Guest.hwvirt.vmx.abVirtApicPage, 4096); 263 264 264 265 PVM pVM = NULL; NOREF(pVM);
Note:
See TracChangeset
for help on using the changeset viewer.