From eada04b8000e2d10c5054e0960e1d3373ae1eac9 Mon Sep 17 00:00:00 2001 From: Mingqiang Chi Date: Fri, 7 Sep 2018 10:12:51 +0800 Subject: [PATCH] hv:Replace dynamic memory allocation for vmcs region Replace vmcs pointer with static memory for vmcs region inside structure vcpu_arch. Tracked-On: #861 Signed-off-by: Mingqiang Chi Reviewed-by: Anthony Xu Acked-by: Eddie Dong --- hypervisor/arch/x86/guest/vcpu.c | 8 -------- hypervisor/include/arch/x86/guest/vcpu.h | 12 ++++++------ 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/hypervisor/arch/x86/guest/vcpu.c b/hypervisor/arch/x86/guest/vcpu.c index ebaee866c..061fe077e 100644 --- a/hypervisor/arch/x86/guest/vcpu.c +++ b/hypervisor/arch/x86/guest/vcpu.c @@ -224,13 +224,6 @@ int create_vcpu(uint16_t pcpu_id, struct vm *vm, struct vcpu **rtn_vcpu_handle) vcpu->arch_vcpu.vpid = allocate_vpid(); - /* Allocate VMCS region for this VCPU */ - vcpu->arch_vcpu.vmcs = alloc_page(); - ASSERT(vcpu->arch_vcpu.vmcs != NULL, ""); - - /* Memset VMCS region for this VCPU */ - (void)memset(vcpu->arch_vcpu.vmcs, 0U, CPU_PAGE_SIZE); - /* Initialize exception field in VCPU context */ vcpu->arch_vcpu.exception_info.exception = VECTOR_INVALID; @@ -384,7 +377,6 @@ void destroy_vcpu(struct vcpu *vcpu) atomic_dec16(&vcpu->vm->hw.created_vcpus); vlapic_free(vcpu); - free(vcpu->arch_vcpu.vmcs); per_cpu(ever_run_vcpu, vcpu->pcpu_id) = NULL; free_pcpu(vcpu->pcpu_id); free(vcpu); diff --git a/hypervisor/include/arch/x86/guest/vcpu.h b/hypervisor/include/arch/x86/guest/vcpu.h index 731f3ec47..53b66a7c0 100644 --- a/hypervisor/include/arch/x86/guest/vcpu.h +++ b/hypervisor/include/arch/x86/guest/vcpu.h @@ -164,11 +164,11 @@ struct cpu_context { }; struct vcpu_arch { + /* vmcs region for this vcpu, MUST be 4KB-aligned */ + uint8_t vmcs[CPU_PAGE_SIZE]; int cur_context; struct cpu_context contexts[NR_WORLD]; - /* A pointer to the VMCS for this CPU. */ - void *vmcs; uint16_t vpid; /* Holds the information needed for IRQ/exception handling. */ @@ -205,14 +205,14 @@ struct vcpu_arch { /* per vcpu lapic */ void *vlapic; -}; +} __aligned(CPU_PAGE_SIZE); struct vm; struct vcpu { + /* Architecture specific definitions for this VCPU */ + struct vcpu_arch arch_vcpu; uint16_t pcpu_id; /* Physical CPU ID of this VCPU */ uint16_t vcpu_id; /* virtual identifier for VCPU */ - struct vcpu_arch arch_vcpu; - /* Architecture specific definitions for this VCPU */ struct vm *vm; /* Reference to the VM this VCPU belongs to */ void *entry_addr; /* Entry address for this VCPU when first started */ @@ -246,7 +246,7 @@ struct vcpu { #endif uint64_t reg_cached; uint64_t reg_updated; -}; +} __aligned(CPU_PAGE_SIZE); struct vcpu_dump { struct vcpu *vcpu;