    Avoid delivering APIC message to non-exist VCPU
    and fixes booting 32bit PAE guest issue.
    
    Signed-off-by: Yaozu (Eddie) Dong <eddie.dong@intel.com>

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
