mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-17 15:12:07 -06:00
pc: kvm_apic: Pass APIC ID depending on xAPIC/x2APIC mode
Signed-off-by: Igor Mammedov <imammedo@redhat.com> Reviewed-by: Radim Krčmář <rkrcmar@redhat.com> Reviewed-by: Eduardo Habkost <ehabkost@redhat.com> Signed-off-by: Eduardo Habkost <ehabkost@redhat.com>
This commit is contained in:
parent
facb07cd2a
commit
e391c00970
3 changed files with 21 additions and 5 deletions
|
@ -34,7 +34,11 @@ static void kvm_put_apic_state(APICCommonState *s, struct kvm_lapic_state *kapic
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
memset(kapic, 0, sizeof(*kapic));
|
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, 0x8, s->tpr);
|
||||||
kvm_apic_set_reg(kapic, 0xd, s->log_dest << 24);
|
kvm_apic_set_reg(kapic, 0xd, s->log_dest << 24);
|
||||||
kvm_apic_set_reg(kapic, 0xe, s->dest_mode << 28 | 0x0fffffff);
|
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);
|
APICCommonState *s = APIC_COMMON(dev);
|
||||||
int i, v;
|
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->tpr = kvm_apic_get_reg(kapic, 0x8);
|
||||||
s->arb_id = kvm_apic_get_reg(kapic, 0x9);
|
s->arb_id = kvm_apic_get_reg(kapic, 0x9);
|
||||||
s->log_dest = kvm_apic_get_reg(kapic, 0xd) >> 24;
|
s->log_dest = kvm_apic_get_reg(kapic, 0xd) >> 24;
|
||||||
|
|
|
@ -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);
|
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; \
|
static bool _memorized; \
|
||||||
\
|
\
|
||||||
if (_memorized) { \
|
if (_memorized) { \
|
||||||
|
@ -141,11 +140,19 @@ static bool kvm_x2apic_api_set_flags(uint64_t flags)
|
||||||
_result = fn; \
|
_result = fn; \
|
||||||
})
|
})
|
||||||
|
|
||||||
|
static bool has_x2apic_api;
|
||||||
|
|
||||||
|
bool kvm_has_x2apic_api(void)
|
||||||
|
{
|
||||||
|
return has_x2apic_api;
|
||||||
|
}
|
||||||
|
|
||||||
bool kvm_enable_x2apic(void)
|
bool kvm_enable_x2apic(void)
|
||||||
{
|
{
|
||||||
return MEMORIZE(
|
return MEMORIZE(
|
||||||
kvm_x2apic_api_set_flags(KVM_X2APIC_API_USE_32BIT_IDS |
|
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)
|
static int kvm_get_tsc(CPUState *cs)
|
||||||
|
|
|
@ -44,4 +44,5 @@ int kvm_device_msix_deassign(KVMState *s, uint32_t dev_id);
|
||||||
void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
||||||
|
|
||||||
bool kvm_enable_x2apic(void);
|
bool kvm_enable_x2apic(void);
|
||||||
|
bool kvm_has_x2apic_api(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue