0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <linux/export.h>
0012 #include <linux/kvm_host.h>
0013
0014 #include "irq.h"
0015 #include "i8254.h"
0016 #include "x86.h"
0017 #include "xen.h"
0018
0019
0020
0021
0022
0023 int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
0024 {
0025 int r = 0;
0026
0027 if (lapic_in_kernel(vcpu))
0028 r = apic_has_pending_timer(vcpu);
0029 if (kvm_xen_timer_enabled(vcpu))
0030 r += kvm_xen_has_pending_timer(vcpu);
0031
0032 return r;
0033 }
0034 EXPORT_SYMBOL(kvm_cpu_has_pending_timer);
0035
0036
0037
0038
0039 static int pending_userspace_extint(struct kvm_vcpu *v)
0040 {
0041 return v->arch.pending_external_vector != -1;
0042 }
0043
0044
0045
0046
0047
0048 int kvm_cpu_has_extint(struct kvm_vcpu *v)
0049 {
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 if (!lapic_in_kernel(v))
0062 return v->arch.interrupt.injected;
0063
0064 if (kvm_xen_has_interrupt(v))
0065 return 1;
0066
0067 if (!kvm_apic_accept_pic_intr(v))
0068 return 0;
0069
0070 if (irqchip_split(v->kvm))
0071 return pending_userspace_extint(v);
0072 else
0073 return v->kvm->arch.vpic->output;
0074 }
0075
0076
0077
0078
0079
0080
0081
0082 int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
0083 {
0084 if (kvm_cpu_has_extint(v))
0085 return 1;
0086
0087 if (!is_guest_mode(v) && kvm_vcpu_apicv_active(v))
0088 return 0;
0089
0090 return kvm_apic_has_interrupt(v) != -1;
0091 }
0092 EXPORT_SYMBOL_GPL(kvm_cpu_has_injectable_intr);
0093
0094
0095
0096
0097
0098 int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
0099 {
0100 if (kvm_cpu_has_extint(v))
0101 return 1;
0102
0103 return kvm_apic_has_interrupt(v) != -1;
0104 }
0105 EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
0106
0107
0108
0109
0110
0111 static int kvm_cpu_get_extint(struct kvm_vcpu *v)
0112 {
0113 if (!kvm_cpu_has_extint(v)) {
0114 WARN_ON(!lapic_in_kernel(v));
0115 return -1;
0116 }
0117
0118 if (!lapic_in_kernel(v))
0119 return v->arch.interrupt.nr;
0120
0121 if (kvm_xen_has_interrupt(v))
0122 return v->kvm->arch.xen.upcall_vector;
0123
0124 if (irqchip_split(v->kvm)) {
0125 int vector = v->arch.pending_external_vector;
0126
0127 v->arch.pending_external_vector = -1;
0128 return vector;
0129 } else
0130 return kvm_pic_read_irq(v->kvm);
0131 }
0132
0133
0134
0135
0136 int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
0137 {
0138 int vector = kvm_cpu_get_extint(v);
0139 if (vector != -1)
0140 return vector;
0141
0142 return kvm_get_apic_interrupt(v);
0143 }
0144 EXPORT_SYMBOL_GPL(kvm_cpu_get_interrupt);
0145
0146 void kvm_inject_pending_timer_irqs(struct kvm_vcpu *vcpu)
0147 {
0148 if (lapic_in_kernel(vcpu))
0149 kvm_inject_apic_timer_irqs(vcpu);
0150 if (kvm_xen_timer_enabled(vcpu))
0151 kvm_xen_inject_timer_irqs(vcpu);
0152 }
0153 EXPORT_SYMBOL_GPL(kvm_inject_pending_timer_irqs);
0154
0155 void __kvm_migrate_timers(struct kvm_vcpu *vcpu)
0156 {
0157 __kvm_migrate_apic_timer(vcpu);
0158 __kvm_migrate_pit_timer(vcpu);
0159 static_call_cond(kvm_x86_migrate_timers)(vcpu);
0160 }
0161
0162 bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args)
0163 {
0164 bool resample = args->flags & KVM_IRQFD_FLAG_RESAMPLE;
0165
0166 return resample ? irqchip_kernel(kvm) : irqchip_in_kernel(kvm);
0167 }