[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL v2 08/16] pc: kvm_apic: Pass APIC ID depending on xAP
From: |
Eduardo Habkost |
Subject: |
[Qemu-devel] [PULL v2 08/16] pc: kvm_apic: Pass APIC ID depending on xAPIC/x2APIC mode |
Date: |
Mon, 24 Oct 2016 17:52:17 -0200 |
From: Igor Mammedov <address@hidden>
Signed-off-by: Igor Mammedov <address@hidden>
Reviewed-by: Radim Krčmář <address@hidden>
Reviewed-by: Eduardo Habkost <address@hidden>
Signed-off-by: Eduardo Habkost <address@hidden>
---
hw/i386/kvm/apic.c | 12 ++++++++++--
target-i386/kvm.c | 13 ++++++++++---
target-i386/kvm_i386.h | 1 +
3 files changed, 21 insertions(+), 5 deletions(-)
diff --git a/hw/i386/kvm/apic.c b/hw/i386/kvm/apic.c
index be55102..39b73e7 100644
--- a/hw/i386/kvm/apic.c
+++ b/hw/i386/kvm/apic.c
@@ -34,7 +34,11 @@ static void kvm_put_apic_state(APICCommonState *s, struct
kvm_lapic_state *kapic
int i;
memset(kapic, 0, sizeof(*kapic));
- kvm_apic_set_reg(kapic, 0x2, s->id << 24);
+ if (kvm_has_x2apic_api() && s->apicbase & MSR_IA32_APICBASE_EXTD) {
+ kvm_apic_set_reg(kapic, 0x2, s->initial_apic_id);
+ } else {
+ kvm_apic_set_reg(kapic, 0x2, s->id << 24);
+ }
kvm_apic_set_reg(kapic, 0x8, s->tpr);
kvm_apic_set_reg(kapic, 0xd, s->log_dest << 24);
kvm_apic_set_reg(kapic, 0xe, s->dest_mode << 28 | 0x0fffffff);
@@ -59,7 +63,11 @@ void kvm_get_apic_state(DeviceState *dev, struct
kvm_lapic_state *kapic)
APICCommonState *s = APIC_COMMON(dev);
int i, v;
- s->id = kvm_apic_get_reg(kapic, 0x2) >> 24;
+ if (kvm_has_x2apic_api() && s->apicbase & MSR_IA32_APICBASE_EXTD) {
+ assert(kvm_apic_get_reg(kapic, 0x2) == s->initial_apic_id);
+ } else {
+ s->id = kvm_apic_get_reg(kapic, 0x2) >> 24;
+ }
s->tpr = kvm_apic_get_reg(kapic, 0x8);
s->arb_id = kvm_apic_get_reg(kapic, 0x9);
s->log_dest = kvm_apic_get_reg(kapic, 0xd) >> 24;
diff --git a/target-i386/kvm.c b/target-i386/kvm.c
index 0472f45..86b41a9 100644
--- a/target-i386/kvm.c
+++ b/target-i386/kvm.c
@@ -129,9 +129,8 @@ static bool kvm_x2apic_api_set_flags(uint64_t flags)
return !kvm_vm_enable_cap(s, KVM_CAP_X2APIC_API, 0, flags);
}
-#define MEMORIZE(fn) \
+#define MEMORIZE(fn, _result) \
({ \
- static typeof(fn) _result; \
static bool _memorized; \
\
if (_memorized) { \
@@ -141,11 +140,19 @@ static bool kvm_x2apic_api_set_flags(uint64_t flags)
_result = fn; \
})
+static bool has_x2apic_api;
+
+bool kvm_has_x2apic_api(void)
+{
+ return has_x2apic_api;
+}
+
bool kvm_enable_x2apic(void)
{
return MEMORIZE(
kvm_x2apic_api_set_flags(KVM_X2APIC_API_USE_32BIT_IDS |
- KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK));
+ KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK),
+ has_x2apic_api);
}
static int kvm_get_tsc(CPUState *cs)
diff --git a/target-i386/kvm_i386.h b/target-i386/kvm_i386.h
index 5c369b1..7607929 100644
--- a/target-i386/kvm_i386.h
+++ b/target-i386/kvm_i386.h
@@ -44,4 +44,5 @@ int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id);
void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
bool kvm_enable_x2apic(void);
+bool kvm_has_x2apic_api(void);
#endif
--
2.7.4
- [Qemu-devel] [PULL v2 00/16] x86 and CPU queue, 2016-10-24, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 01/16] pc: acpi: x2APIC support for MADT table and _MAT method, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 02/16] pc: acpi: x2APIC support for SRAT table, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 03/16] acpi: cphp: Force switch to modern cpu hotplug if APIC ID > 254, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 04/16] pc: Leave max apic_id_limit only in legacy cpu hotplug code, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 06/16] pc: apic_common: Restore APIC ID to initial ID on reset, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 05/16] pc: apic_common: Extend APIC ID property to 32bit, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 08/16] pc: kvm_apic: Pass APIC ID depending on xAPIC/x2APIC mode,
Eduardo Habkost <=
- [Qemu-devel] [PULL v2 07/16] pc: apic_common: Reset APIC ID to initial ID when switching into x2APIC mode, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 09/16] pc: Clarify FW_CFG_MAX_CPUS usage comment, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 10/16] Increase MAX_CPUMASK_BITS from 255 to 288, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 11/16] pc: Add 'etc/boot-cpus' fw_cfg file for machine with more than 255 CPUs, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 13/16] pc: q35: Bump max_cpus to 288, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 12/16] pc: Require IRQ remapping and EIM if there could be x2APIC CPUs, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 14/16] exec: split cpu_exec_init(), Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 16/16] exec: call cpu_exec_exit() from a CPU unrealize common function, Eduardo Habkost, 2016/10/24
- [Qemu-devel] [PULL v2 15/16] exec: move cpu_exec_init() calls to realize functions, Eduardo Habkost, 2016/10/24
- Re: [Qemu-devel] [PULL v2 00/16] x86 and CPU queue, 2016-10-24, Peter Maydell, 2016/10/25