|
[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 |