Changeset 91306 in vbox for trunk/src/VBox/VMM/VMMR3
- Timestamp:
- Sep 17, 2021 9:11:01 PM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 146966
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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;
Note:
See TracChangeset
for help on using the changeset viewer.