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 <sainath.grandhi@intel.com>
Reviewed-by: Xu Anthony <anthony.xu@intel.com>
This commit is contained in:
Sainath Grandhi 2018-11-01 15:12:39 -07:00 committed by lijinxia
parent 80b6e62735
commit cf4d191272
3 changed files with 11 additions and 13 deletions

View File

@ -327,10 +327,10 @@ void guest_cpuid(struct vcpu *vcpu,
case 0x01U: case 0x01U:
{ {
cpuid(leaf, eax, ebx, ecx, edx); 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 */ /* Patching initial APIC ID */
*ebx &= ~APIC_ID_MASK; *ebx &= ~APIC_ID_MASK;
*ebx |= (apicid & APIC_ID_MASK); *ebx |= (apicid << APIC_ID_SHIFT);
#ifndef CONFIG_MTRR_ENABLED #ifndef CONFIG_MTRR_ENABLED
/* mask mtrr */ /* mask mtrr */

View File

@ -148,17 +148,16 @@ vm_active_cpus(const struct vm *vm)
} }
uint32_t 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; uint32_t apicid;
return id; if (is_x2apic_enabled(vlapic)) {
} apicid = vlapic->apic_page.id.v;
} else {
apicid = (vlapic->apic_page.id.v) >> APIC_ID_SHIFT;
}
uint8_t return apicid;
vlapic_get_apicid(const struct acrn_vlapic *vlapic)
{
uint32_t apicid = (vlapic->apic_page.id.v) >> APIC_ID_SHIFT;
return (uint8_t)apicid;
} }
static inline uint32_t static inline uint32_t

View File

@ -171,8 +171,7 @@ void vlapic_set_tmr_one_vec(struct acrn_vlapic *vlapic, uint32_t delmode,
uint32_t vector, bool level); uint32_t vector, bool level);
void vlapic_apicv_batch_set_tmr(struct acrn_vlapic *vlapic); void vlapic_apicv_batch_set_tmr(struct acrn_vlapic *vlapic);
uint32_t vlapic_get_id(const struct acrn_vlapic *vlapic); uint32_t vlapic_get_apicid(struct acrn_vlapic *vlapic);
uint8_t vlapic_get_apicid(const struct acrn_vlapic *vlapic);
int vlapic_create(struct vcpu *vcpu); int vlapic_create(struct vcpu *vcpu);
/* /*
* @pre vcpu != NULL * @pre vcpu != NULL