From 2b7168da9e38d7b7163847d61d89833ceec0e0a2 Mon Sep 17 00:00:00 2001 From: Li Fei1 Date: Mon, 30 Mar 2020 14:02:24 +0800 Subject: [PATCH] hv: vmtrr: remove vcpu structure pointer from vmtrr We could use container_of to get vcpu structure pointer from vmtrr. So vcpu structure pointer is no need in vmtrr structure. Tracked-On: #4550 Signed-off-by: Li Fei1 --- hypervisor/arch/x86/guest/vmtrr.c | 14 +++++++++----- hypervisor/include/arch/x86/guest/vmtrr.h | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/hypervisor/arch/x86/guest/vmtrr.c b/hypervisor/arch/x86/guest/vmtrr.c index 27640b7e3..119de8b54 100644 --- a/hypervisor/arch/x86/guest/vmtrr.c +++ b/hypervisor/arch/x86/guest/vmtrr.c @@ -43,6 +43,11 @@ static struct fixed_range_mtrr_maps fixed_mtrr_map[FIXED_RANGE_MTRR_NUM] = { { MSR_IA32_MTRR_FIX4K_F8000, 0xF8000U, 0x1000U }, }; +static inline struct acrn_vcpu *vmtrr2vcpu(const struct acrn_vmtrr *vmtrr) +{ + return container_of(container_of(vmtrr, struct acrn_vcpu_arch, vmtrr), struct acrn_vcpu, arch); +} + static uint32_t get_index_of_fixed_mtrr(uint32_t msr) { uint32_t i; @@ -92,8 +97,6 @@ void init_vmtrr(struct acrn_vcpu *vcpu) union mtrr_cap_reg cap = {0}; uint32_t i; - vmtrr->vcpu = vcpu; - /* * We emulate fixed range MTRRs only * And expecting the guests won't write variable MTRRs @@ -165,6 +168,7 @@ static void update_ept_mem_type(const struct acrn_vmtrr *vmtrr) uint8_t type; uint64_t start, size; uint32_t i, j; + struct acrn_vm *vm = vmtrr2vcpu(vmtrr)->vm; /* * Intel SDM, Vol 3, 11.11.2.1 Section "IA32_MTRR_DEF_TYPE MSR": @@ -172,7 +176,7 @@ static void update_ept_mem_type(const struct acrn_vmtrr *vmtrr) * - when def_type.FE is clear, MTRRdefType.type is applied */ if (!is_mtrr_enabled(vmtrr) || !is_fixed_range_mtrr_enabled(vmtrr)) { - update_ept(vmtrr->vcpu->vm, 0U, MAX_FIXED_RANGE_ADDR, get_default_memory_type(vmtrr)); + update_ept(vm, 0U, MAX_FIXED_RANGE_ADDR, get_default_memory_type(vmtrr)); } else { /* Deal with fixed-range MTRRs only */ for (i = 0U; i < FIXED_RANGE_MTRR_NUM; i++) { @@ -185,14 +189,14 @@ static void update_ept_mem_type(const struct acrn_vmtrr *vmtrr) if (type == vmtrr->fixed_range[i].type[j]) { size += get_subrange_size_of_fixed_mtrr(i); } else { - update_ept(vmtrr->vcpu->vm, start, size, type); + update_ept(vm, start, size, type); type = vmtrr->fixed_range[i].type[j]; start = get_subrange_start_of_fixed_mtrr(i, j); size = get_subrange_size_of_fixed_mtrr(i); } } - update_ept(vmtrr->vcpu->vm, start, size, type); + update_ept(vm, start, size, type); } } } diff --git a/hypervisor/include/arch/x86/guest/vmtrr.h b/hypervisor/include/arch/x86/guest/vmtrr.h index cad98af31..91850a24b 100644 --- a/hypervisor/include/arch/x86/guest/vmtrr.h +++ b/hypervisor/include/arch/x86/guest/vmtrr.h @@ -48,12 +48,12 @@ union mtrr_fixed_range_reg { }; struct acrn_vmtrr { - struct acrn_vcpu *vcpu; union mtrr_cap_reg cap; union mtrr_def_type_reg def_type; union mtrr_fixed_range_reg fixed_range[FIXED_RANGE_MTRR_NUM]; }; +struct acrn_vcpu; /** * @brief Virtual MTRR MSR write *