|
@@ -788,6 +788,8 @@ static void lapic_reset(struct kvm_vcpu *vcpu)
|
|
|
|
|
|
for (i = 0; i < APIC_LVT_NUM; i++)
|
|
|
apic_set_reg(apic, APIC_LVTT + 0x10 * i, APIC_LVT_MASKED);
|
|
|
+ apic_set_reg(apic, APIC_LVT0,
|
|
|
+ SET_APIC_DELIVERY_MODE(0, APIC_MODE_EXTINT));
|
|
|
|
|
|
apic_set_reg(apic, APIC_DFR, 0xffffffffU);
|
|
|
apic_set_reg(apic, APIC_SPIV, 0xff);
|
|
@@ -932,6 +934,21 @@ int kvm_apic_has_interrupt(struct kvm_vcpu *vcpu)
|
|
|
return highest_irr;
|
|
|
}
|
|
|
|
|
|
+int kvm_apic_accept_pic_intr(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ u32 lvt0 = apic_get_reg(vcpu->apic, APIC_LVT0);
|
|
|
+ int r = 0;
|
|
|
+
|
|
|
+ if (vcpu->vcpu_id == 0) {
|
|
|
+ if (!apic_hw_enabled(vcpu->apic))
|
|
|
+ r = 1;
|
|
|
+ if ((lvt0 & APIC_LVT_MASKED) == 0 &&
|
|
|
+ GET_APIC_DELIVERY_MODE(lvt0) == APIC_MODE_EXTINT)
|
|
|
+ r = 1;
|
|
|
+ }
|
|
|
+ return r;
|
|
|
+}
|
|
|
+
|
|
|
void kvm_inject_apic_timer_irqs(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
struct kvm_lapic *apic = vcpu->apic;
|