|
@@ -7110,8 +7110,6 @@ void kvm_make_scan_ioapic_request(struct kvm *kvm)
|
|
|
|
|
|
static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
- u64 eoi_exit_bitmap[4];
|
|
|
-
|
|
|
if (!kvm_apic_hw_enabled(vcpu->arch.apic))
|
|
|
return;
|
|
|
|
|
@@ -7124,6 +7122,20 @@ static void vcpu_scan_ioapic(struct kvm_vcpu *vcpu)
|
|
|
kvm_x86_ops->sync_pir_to_irr(vcpu);
|
|
|
kvm_ioapic_scan_entry(vcpu, vcpu->arch.ioapic_handled_vectors);
|
|
|
}
|
|
|
+
|
|
|
+ if (is_guest_mode(vcpu))
|
|
|
+ vcpu->arch.load_eoi_exitmap_pending = true;
|
|
|
+ else
|
|
|
+ kvm_make_request(KVM_REQ_LOAD_EOI_EXITMAP, vcpu);
|
|
|
+}
|
|
|
+
|
|
|
+static void vcpu_load_eoi_exitmap(struct kvm_vcpu *vcpu)
|
|
|
+{
|
|
|
+ u64 eoi_exit_bitmap[4];
|
|
|
+
|
|
|
+ if (!kvm_apic_hw_enabled(vcpu->arch.apic))
|
|
|
+ return;
|
|
|
+
|
|
|
bitmap_or((ulong *)eoi_exit_bitmap, vcpu->arch.ioapic_handled_vectors,
|
|
|
vcpu_to_synic(vcpu)->vec_bitmap, 256);
|
|
|
kvm_x86_ops->load_eoi_exitmap(vcpu, eoi_exit_bitmap);
|
|
@@ -7238,6 +7250,8 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
|
|
|
}
|
|
|
if (kvm_check_request(KVM_REQ_SCAN_IOAPIC, vcpu))
|
|
|
vcpu_scan_ioapic(vcpu);
|
|
|
+ if (kvm_check_request(KVM_REQ_LOAD_EOI_EXITMAP, vcpu))
|
|
|
+ vcpu_load_eoi_exitmap(vcpu);
|
|
|
if (kvm_check_request(KVM_REQ_APIC_PAGE_RELOAD, vcpu))
|
|
|
kvm_vcpu_reload_apic_access_page(vcpu);
|
|
|
if (kvm_check_request(KVM_REQ_HV_CRASH, vcpu)) {
|