[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [RFC PATCH 2/8] x86/vlapic: use apic_id array to set initial (x2)APIC ID
It removes the fixed mapping between vcpu_id and apic_id. Signed-off-by: Chao Gao <chao.gao@xxxxxxxxx> --- xen/arch/x86/cpuid.c | 7 +++++-- xen/arch/x86/hvm/vlapic.c | 10 +++++----- xen/include/asm-x86/hvm/domain.h | 3 +++ 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/xen/arch/x86/cpuid.c b/xen/arch/x86/cpuid.c index 5ee82d3..b47dc86 100644 --- a/xen/arch/x86/cpuid.c +++ b/xen/arch/x86/cpuid.c @@ -696,7 +696,7 @@ void guest_cpuid(const struct vcpu *v, uint32_t leaf, /* TODO: Rework topology logic. */ res->b &= 0x00ffffffu; if ( is_hvm_domain(d) ) - res->b |= (v->vcpu_id * 2) << 24; + res->b |= hvm_vcpu_apic_id(v) << 24; /* TODO: Rework vPMU control in terms of toolstack choices. */ if ( vpmu_available(v) && @@ -875,7 +875,10 @@ void guest_cpuid(const struct vcpu *v, uint32_t leaf, *(uint8_t *)&res->c = subleaf; /* Fix the x2APIC identifier. */ - res->d = v->vcpu_id * 2; + if ( is_hvm_domain(d) ) + res->d = hvm_vcpu_x2apic_id(v); + else + res->d = v->vcpu_id * 2; } break; diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c index 50f53bd..01848b0 100644 --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -1053,10 +1053,10 @@ static const struct hvm_mmio_ops vlapic_mmio_ops = { static void set_x2apic_id(struct vlapic *vlapic) { - u32 id = vlapic_vcpu(vlapic)->vcpu_id; - u32 ldr = ((id & ~0xf) << 12) | (1 << (id & 0xf)); + u32 x2apic_id = hvm_vcpu_x2apic_id(vlapic_vcpu(vlapic)); + u32 ldr = ((x2apic_id & ~0xf) << 12) | (1 << (x2apic_id & 0xf)); - vlapic_set_reg(vlapic, APIC_ID, id * 2); + vlapic_set_reg(vlapic, APIC_ID, x2apic_id); vlapic_set_reg(vlapic, APIC_LDR, ldr); } @@ -1365,7 +1365,7 @@ void vlapic_reset(struct vlapic *vlapic) if ( v->vcpu_id == 0 ) vlapic->hw.apic_base_msr |= MSR_IA32_APICBASE_BSP; - vlapic_set_reg(vlapic, APIC_ID, (v->vcpu_id * 2) << 24); + vlapic_set_reg(vlapic, APIC_ID, hvm_vcpu_apic_id(v) << 24); vlapic_do_init(vlapic); } @@ -1456,7 +1456,7 @@ static void lapic_load_fixup(struct vlapic *vlapic) * here, but can be dropped as soon as it is found to conflict with * other (future) changes. */ - if ( GET_xAPIC_ID(id) != vlapic_vcpu(vlapic)->vcpu_id * 2 || + if ( GET_xAPIC_ID(id) != hvm_vcpu_apic_id(vlapic_vcpu(vlapic)) || id != SET_xAPIC_ID(GET_xAPIC_ID(id)) ) printk(XENLOG_G_WARNING "%pv: bogus APIC ID %#x loaded\n", vlapic_vcpu(vlapic), id); diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h index 501ed99..f3da7ed 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -213,6 +213,9 @@ struct hvm_domain { uint8_t thread_per_core; }; +#define hvm_vcpu_x2apic_id(v) (v->domain->arch.hvm_domain.apic_id[v->vcpu_id]) +#define hvm_vcpu_apic_id(v) (hvm_vcpu_x2apic_id(v) % 255) + #define hap_enabled(d) ((d)->arch.hvm_domain.hap_enabled) #endif /* __ASM_X86_HVM_DOMAIN_H__ */ -- 1.8.3.1 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |