Skip to content

Commit

Permalink
KVM: x86: Software disabled APIC should still deliver NMIs
Browse files Browse the repository at this point in the history
Currently, the APIC logical map does not consider VCPUs whose local-apic is
software-disabled.  However, NMIs, INIT, etc. should still be delivered to such
VCPUs. Therefore, the APIC mode should first be determined, and then the map,
considering all VCPUs should be constructed.

To address this issue, first find the APIC mode, and only then construct the
logical map.

Signed-off-by: Nadav Amit <namit@cs.technion.ac.il>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
  • Loading branch information
Nadav Amit authored and Paolo Bonzini committed Nov 17, 2014
1 parent 5cc1502 commit 173beed
Showing 1 changed file with 15 additions and 8 deletions.
23 changes: 15 additions & 8 deletions arch/x86/kvm/lapic.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,8 +156,6 @@ static void recalculate_apic_map(struct kvm *kvm)

kvm_for_each_vcpu(i, vcpu, kvm) {
struct kvm_lapic *apic = vcpu->arch.apic;
u16 cid, lid;
u32 ldr;

if (!kvm_apic_present(vcpu))
continue;
Expand All @@ -175,13 +173,22 @@ static void recalculate_apic_map(struct kvm *kvm)
new->cid_mask = (1 << KVM_X2APIC_CID_BITS) - 1;
new->lid_mask = 0xffff;
new->broadcast = X2APIC_BROADCAST;
} else if (kvm_apic_sw_enabled(apic) &&
!new->cid_mask /* flat mode */ &&
kvm_apic_get_reg(apic, APIC_DFR) == APIC_DFR_CLUSTER) {
new->cid_shift = 4;
new->cid_mask = 0xf;
new->lid_mask = 0xf;
break;
} else if (kvm_apic_sw_enabled(apic)) {
if (kvm_apic_get_reg(apic, APIC_DFR) ==
APIC_DFR_CLUSTER) {
new->cid_shift = 4;
new->cid_mask = 0xf;
new->lid_mask = 0xf;
}
break;
}
}

kvm_for_each_vcpu(i, vcpu, kvm) {
struct kvm_lapic *apic = vcpu->arch.apic;
u16 cid, lid;
u32 ldr;

new->phys_map[kvm_apic_id(apic)] = apic;

Expand Down

0 comments on commit 173beed

Please sign in to comment.