projects
/
linux-2.6-microblaze.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge remote-tracking branch 'regulator/fix/core' into regulator-linus
[linux-2.6-microblaze.git]
/
arch
/
x86
/
kvm
/
irq.c
diff --git
a/arch/x86/kvm/irq.c
b/arch/x86/kvm/irq.c
index
a1ec6a5
..
097060e
100644
(file)
--- a/
arch/x86/kvm/irq.c
+++ b/
arch/x86/kvm/irq.c
@@
-37,15
+37,28
@@
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
}
EXPORT_SYMBOL(kvm_cpu_has_pending_timer);
}
EXPORT_SYMBOL(kvm_cpu_has_pending_timer);
+/*
+ * check if there is a pending userspace external interrupt
+ */
+static int pending_userspace_extint(struct kvm_vcpu *v)
+{
+ return v->arch.pending_external_vector != -1;
+}
+
/*
* check if there is pending interrupt from
* non-APIC source without intack.
*/
static int kvm_cpu_has_extint(struct kvm_vcpu *v)
{
/*
* check if there is pending interrupt from
* non-APIC source without intack.
*/
static int kvm_cpu_has_extint(struct kvm_vcpu *v)
{
- if (kvm_apic_accept_pic_intr(v))
- return pic_irqchip(v->kvm)->output; /* PIC */
- else
+ u8 accept = kvm_apic_accept_pic_intr(v);
+
+ if (accept) {
+ if (irqchip_split(v->kvm))
+ return pending_userspace_extint(v);
+ else
+ return pic_irqchip(v->kvm)->output;
+ } else
return 0;
}
return 0;
}
@@
-57,13
+70,13
@@
static int kvm_cpu_has_extint(struct kvm_vcpu *v)
*/
int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
{
*/
int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
{
- if (!
irqchip_in_kernel(v->kvm
))
+ if (!
lapic_in_kernel(v
))
return v->arch.interrupt.pending;
if (kvm_cpu_has_extint(v))
return 1;
return v->arch.interrupt.pending;
if (kvm_cpu_has_extint(v))
return 1;
- if (kvm_
apic_vid_enabled(v->kvm
))
+ if (kvm_
vcpu_apic_vid_enabled(v
))
return 0;
return kvm_apic_has_interrupt(v) != -1; /* LAPIC */
return 0;
return kvm_apic_has_interrupt(v) != -1; /* LAPIC */
@@
-75,7
+88,7
@@
int kvm_cpu_has_injectable_intr(struct kvm_vcpu *v)
*/
int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
{
*/
int kvm_cpu_has_interrupt(struct kvm_vcpu *v)
{
- if (!
irqchip_in_kernel(v->kvm
))
+ if (!
lapic_in_kernel(v
))
return v->arch.interrupt.pending;
if (kvm_cpu_has_extint(v))
return v->arch.interrupt.pending;
if (kvm_cpu_has_extint(v))
@@
-91,9
+104,16
@@
EXPORT_SYMBOL_GPL(kvm_cpu_has_interrupt);
*/
static int kvm_cpu_get_extint(struct kvm_vcpu *v)
{
*/
static int kvm_cpu_get_extint(struct kvm_vcpu *v)
{
- if (kvm_cpu_has_extint(v))
- return kvm_pic_read_irq(v->kvm); /* PIC */
- return -1;
+ if (kvm_cpu_has_extint(v)) {
+ if (irqchip_split(v->kvm)) {
+ int vector = v->arch.pending_external_vector;
+
+ v->arch.pending_external_vector = -1;
+ return vector;
+ } else
+ return kvm_pic_read_irq(v->kvm); /* PIC */
+ } else
+ return -1;
}
/*
}
/*
@@
-103,7
+123,7
@@
int kvm_cpu_get_interrupt(struct kvm_vcpu *v)
{
int vector;
{
int vector;
- if (!
irqchip_in_kernel(v->kvm
))
+ if (!
lapic_in_kernel(v
))
return v->arch.interrupt.nr;
vector = kvm_cpu_get_extint(v);
return v->arch.interrupt.nr;
vector = kvm_cpu_get_extint(v);