Skip to content

Commit 6593080

Browse files
mingqiangchilijinxia
authored andcommitted
hv: Replace dynamic allocation with static memory for vmxon_region
Remove vmxon_region_pa from structure per_cpu_region, and define vmxon_region inside per_cpu_region. Tracked-On: #861 Signed-off-by: Mingqiang Chi <mingqiang.chi@intel.com> Reviewed-by: Junjie Mao <junjie.mao@intel.com> Acked-by: Eddie Dong <eddie.dong@intel.com>
1 parent 4360235 commit 6593080

File tree

2 files changed

+21
-34
lines changed

2 files changed

+21
-34
lines changed

hypervisor/arch/x86/vmx.c

Lines changed: 19 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -84,42 +84,28 @@ int exec_vmxon_instr(uint16_t pcpu_id)
8484
{
8585
uint64_t tmp64, vmcs_pa;
8686
uint32_t tmp32;
87-
int ret = -ENOMEM;
88-
void *vmxon_region_va;
87+
int ret = 0;
88+
void *vmxon_region_va = (void *)per_cpu(vmxon_region, pcpu_id);
89+
uint64_t vmxon_region_pa;
8990
struct vcpu *vcpu = get_ever_run_vcpu(pcpu_id);
9091

91-
/* Allocate page aligned memory for VMXON region */
92-
if (per_cpu(vmxon_region_pa, pcpu_id) == 0UL) {
93-
vmxon_region_va = alloc_page();
94-
}
95-
else {
96-
vmxon_region_va = HPA2HVA(per_cpu(vmxon_region_pa, pcpu_id));
97-
}
92+
/* Initialize vmxon page with revision id from IA32 VMX BASIC MSR */
93+
tmp32 = (uint32_t)msr_read(MSR_IA32_VMX_BASIC);
94+
(void)memcpy_s((uint32_t *) vmxon_region_va, 4U, (void *)&tmp32, 4U);
9895

99-
if (vmxon_region_va != NULL) {
100-
/* Initialize vmxon page with revision id from IA32 VMX BASIC
101-
* MSR
102-
*/
103-
tmp32 = (uint32_t)msr_read(MSR_IA32_VMX_BASIC);
104-
(void)memcpy_s((uint32_t *) vmxon_region_va, 4U, (void *)&tmp32, 4U);
105-
106-
/* Turn on CR0.NE and CR4.VMXE */
107-
CPU_CR_READ(cr0, &tmp64);
108-
CPU_CR_WRITE(cr0, tmp64 | CR0_NE);
109-
CPU_CR_READ(cr4, &tmp64);
110-
CPU_CR_WRITE(cr4, tmp64 | CR4_VMXE);
111-
112-
/* Turn ON VMX */
113-
per_cpu(vmxon_region_pa, pcpu_id) = HVA2HPA(vmxon_region_va);
114-
ret = exec_vmxon(&per_cpu(vmxon_region_pa, pcpu_id));
115-
116-
if (vcpu != NULL) {
117-
vmcs_pa = HVA2HPA(vcpu->arch_vcpu.vmcs);
118-
ret = exec_vmptrld(&vmcs_pa);
119-
}
120-
} else {
121-
pr_err("%s, alloc memory for VMXON region failed\n",
122-
__func__);
96+
/* Turn on CR0.NE and CR4.VMXE */
97+
CPU_CR_READ(cr0, &tmp64);
98+
CPU_CR_WRITE(cr0, tmp64 | CR0_NE);
99+
CPU_CR_READ(cr4, &tmp64);
100+
CPU_CR_WRITE(cr4, tmp64 | CR4_VMXE);
101+
102+
/* Turn ON VMX */
103+
vmxon_region_pa = HVA2HPA(vmxon_region_va);
104+
ret = exec_vmxon(&vmxon_region_pa);
105+
106+
if (vcpu != NULL) {
107+
vmcs_pa = HVA2HPA(vcpu->arch_vcpu.vmcs);
108+
ret = exec_vmptrld(&vmcs_pa);
123109
}
124110

125111
return ret;

hypervisor/include/arch/x86/per_cpu.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "arch/x86/guest/instr_emul.h"
2020

2121
struct per_cpu_region {
22+
/* vmxon_region MUST be 4KB-aligned */
23+
uint8_t vmxon_region[CPU_PAGE_SIZE];
2224
#ifdef HV_DEBUG
2325
uint64_t *sbuf[ACRN_SBUF_ID_MAX];
2426
uint64_t vmexit_cnt[64];
@@ -28,7 +30,6 @@ struct per_cpu_region {
2830
uint64_t irq_count[NR_IRQS];
2931
uint64_t softirq_pending;
3032
uint64_t spurious;
31-
uint64_t vmxon_region_pa;
3233
struct shared_buf *earlylog_sbuf;
3334
void *vcpu;
3435
void *ever_run_vcpu;

0 commit comments

Comments
 (0)