[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v4 08/13] pc: kvm_apic: pass APIC ID depending on xA
From: |
Igor Mammedov |
Subject: |
[Qemu-devel] [PATCH v4 08/13] pc: kvm_apic: pass APIC ID depending on xAPIC/x2APIC mode |
Date: |
Wed, 19 Oct 2016 14:05:38 +0200 |
Signed-off-by: Igor Mammedov <address@hidden>
Reviewed-by: Radim Krčmář <address@hidden>
Reviewed-by: Eduardo Habkost <address@hidden>
---
v4:
- restore kvm_has_x2apic_api() and use it to avoid side-effects
of kvm_enable_x2apic(). x2APIC API will be enabled by iommu
if it's present or not enabled at all.
v3:
- drop kvm_has_x2apic_api() and reuse kvm_enable_x2apic() instead
---
target-i386/kvm_i386.h | 1 +
hw/i386/kvm/apic.c | 12 ++++++++++--
target-i386/kvm.c | 13 ++++++++++---
3 files changed, 21 insertions(+), 5 deletions(-)
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
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)
--
2.7.4
- Re: [Qemu-devel] [PATCH v4 02/13] pc: acpi: x2APIC support for SRAT table, (continued)
- [Qemu-devel] [PATCH v4 03/13] acpi: cphp: force switch to modern cpu hotplug if APIC ID > 254, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 01/13] pc: acpi: x2APIC support for MADT table and _MAT method, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 06/13] pc: apic_common: restore APIC ID to initial ID on reset, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 05/13] pc: apic_common: extend APIC ID property to 32bit, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 04/13] pc: leave max apic_id_limit only in legacy cpu hotplug code, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 08/13] pc: kvm_apic: pass APIC ID depending on xAPIC/x2APIC mode,
Igor Mammedov <=
- [Qemu-devel] [PATCH v4 07/13] pc: apic_common: reset APIC ID to initial ID when switching into x2APIC mode, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 09/13] pc: clarify FW_CFG_MAX_CPUS usage comment, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 10/13] increase MAX_CPUMASK_BITS from 255 to 288, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 12/13] pc: require IRQ remapping and EIM if there could be x2APIC CPUs, Igor Mammedov, 2016/10/19
- [Qemu-devel] [PATCH v4 13/13] pc: q35: bump max_cpus to 288, Igor Mammedov, 2016/10/19