Avoid delivering APIC message to non-exist VCPU
    and fixes booting 32bit PAE guest issue.
    
        against lapic2 branch.

    Signed-off-by: Yaozu (Eddie) Dong <[EMAIL PROTECTED]>

diff --git a/drivers/kvm/ioapic.c b/drivers/kvm/ioapic.c
index 7c5a6ea..6c734db 100644
--- a/drivers/kvm/ioapic.c
+++ b/drivers/kvm/ioapic.c
@@ -151,12 +151,14 @@ static u32 ioapic_get_delivery_bitmask(struct
kvm_ioapic *ioapic, u8 dest,
        if (dest_mode == 0) {   /* Physical mode. */
                if (dest == 0xFF) {     /* Broadcast. */
                        for (i = 0; i < KVM_MAX_VCPUS; ++i)
-                               mask |= 1 << i;
+                               if (kvm->vcpus[i].apic)
+                                       mask |= 1 << i;
                        return mask;
                }
                for (i = 0; i < KVM_MAX_VCPUS; ++i) {
                        vcpu = &kvm->vcpus[i];
-                       if (kvm_apic_match_physical_addr(vcpu->apic,
dest)) {
+                       if (vcpu->apic &&
+                           kvm_apic_match_physical_addr(vcpu->apic,
dest)) {
                                mask = 1 << vcpu->vcpu_id;
                                break;
                        }
@@ -164,7 +166,8 @@ static u32 ioapic_get_delivery_bitmask(struct
kvm_ioapic *ioapic, u8 dest,
        } else if (dest != 0)   /* Logical mode, MDA non-zero. */
                for (i = 0; i < KVM_MAX_VCPUS; ++i) {
                        vcpu = &kvm->vcpus[i];
-                       if (kvm_apic_match_logical_addr(vcpu->apic,
dest))
+                       if (vcpu->apic &&
+                           kvm_apic_match_logical_addr(vcpu->apic,
dest))
                                mask |= 1 << vcpu->vcpu_id;
                }
        ioapic_debug("mask %x", mask);
diff --git a/drivers/kvm/kvm_main.c b/drivers/kvm/kvm_main.c
diff --git a/drivers/kvm/lapic.c b/drivers/kvm/lapic.c
index 0eb8895..1f1fa89 100644
--- a/drivers/kvm/lapic.c
+++ b/drivers/kvm/lapic.c
@@ -260,8 +260,7 @@ static int apic_match_dest(struct kvm_vcpu *vcpu,
struct kvm_lapic *source,
                   "dest_mode 0x%x, short_hand 0x%x",
                   target, source, dest, dest_mode, short_hand);
 
-       if (!target)
-               return 0;
+       ASSERT(!target);
        switch (short_hand) {
        case APIC_DEST_NOSHORT:
                if (dest_mode == 0) {
@@ -421,7 +420,8 @@ static void apic_send_ipi(struct kvm_lapic *apic)
        for (i = 0; i < KVM_MAX_VCPUS; i++) {
                vcpu = &apic->vcpu->kvm->vcpus[i];
 
-               if (apic_match_dest(vcpu, apic, short_hand, dest,
dest_mode)) {
+               if (vcpu->apic &&
+                   apic_match_dest(vcpu, apic, short_hand, dest,
dest_mode)) {
                        if (delivery_mode == APIC_DM_LOWEST)
                                set_bit(vcpu->vcpu_id, &lpr_map);
                        else
diff --git a/drivers/kvm/vmx.c b/drivers/kvm/vmx.c

Attachment: irqchip-fix1.patch
Description: irqchip-fix1.patch

-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2005.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
kvm-devel mailing list
kvm-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/kvm-devel

Reply via email to