From cf4d1912729b95d2f145810d0f2f0327bbebfd7d Mon Sep 17 00:00:00 2001 From: Sainath Grandhi Date: Thu, 1 Nov 2018 15:12:39 -0700 Subject: [PATCH] hv: Modify vlapic_get_apicid for x2APIC mode of vLAPIC This patch adds support to return APIC ID if guest uses vLAPIC in x2APIC mode. Tracked-On: #1626 Signed-off-by: Sainath Grandhi Reviewed-by: Xu Anthony --- hypervisor/arch/x86/cpuid.c | 4 ++-- hypervisor/arch/x86/guest/vlapic.c | 17 ++++++++--------- hypervisor/include/arch/x86/guest/vlapic.h | 3 +-- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/hypervisor/arch/x86/cpuid.c b/hypervisor/arch/x86/cpuid.c index 5b8293e39..0e0c29649 100644 --- a/hypervisor/arch/x86/cpuid.c +++ b/hypervisor/arch/x86/cpuid.c @@ -327,10 +327,10 @@ void guest_cpuid(struct vcpu *vcpu, case 0x01U: { cpuid(leaf, eax, ebx, ecx, edx); - uint32_t apicid = vlapic_get_id(vcpu_vlapic(vcpu)); + uint32_t apicid = vlapic_get_apicid(vcpu_vlapic(vcpu)); /* Patching initial APIC ID */ *ebx &= ~APIC_ID_MASK; - *ebx |= (apicid & APIC_ID_MASK); + *ebx |= (apicid << APIC_ID_SHIFT); #ifndef CONFIG_MTRR_ENABLED /* mask mtrr */ diff --git a/hypervisor/arch/x86/guest/vlapic.c b/hypervisor/arch/x86/guest/vlapic.c index b9f0c93b9..d716e9f59 100644 --- a/hypervisor/arch/x86/guest/vlapic.c +++ b/hypervisor/arch/x86/guest/vlapic.c @@ -148,17 +148,16 @@ vm_active_cpus(const struct vm *vm) } uint32_t -vlapic_get_id(const struct acrn_vlapic *vlapic) +vlapic_get_apicid(struct acrn_vlapic *vlapic) { - uint32_t id = vlapic->apic_page.id.v; - return id; -} + uint32_t apicid; + if (is_x2apic_enabled(vlapic)) { + apicid = vlapic->apic_page.id.v; + } else { + apicid = (vlapic->apic_page.id.v) >> APIC_ID_SHIFT; + } -uint8_t -vlapic_get_apicid(const struct acrn_vlapic *vlapic) -{ - uint32_t apicid = (vlapic->apic_page.id.v) >> APIC_ID_SHIFT; - return (uint8_t)apicid; + return apicid; } static inline uint32_t diff --git a/hypervisor/include/arch/x86/guest/vlapic.h b/hypervisor/include/arch/x86/guest/vlapic.h index 74bf6bccc..a0e452747 100644 --- a/hypervisor/include/arch/x86/guest/vlapic.h +++ b/hypervisor/include/arch/x86/guest/vlapic.h @@ -171,8 +171,7 @@ void vlapic_set_tmr_one_vec(struct acrn_vlapic *vlapic, uint32_t delmode, uint32_t vector, bool level); void vlapic_apicv_batch_set_tmr(struct acrn_vlapic *vlapic); -uint32_t vlapic_get_id(const struct acrn_vlapic *vlapic); -uint8_t vlapic_get_apicid(const struct acrn_vlapic *vlapic); +uint32_t vlapic_get_apicid(struct acrn_vlapic *vlapic); int vlapic_create(struct vcpu *vcpu); /* * @pre vcpu != NULL