diff options
Diffstat (limited to 'arch/mips/kvm/kvm_mips_int.c')
-rw-r--r-- | arch/mips/kvm/kvm_mips_int.c | 45 |
1 files changed, 22 insertions, 23 deletions
diff --git a/arch/mips/kvm/kvm_mips_int.c b/arch/mips/kvm/kvm_mips_int.c index 1e5de16afe29..d458c042d558 100644 --- a/arch/mips/kvm/kvm_mips_int.c +++ b/arch/mips/kvm/kvm_mips_int.c | |||
@@ -1,13 +1,13 @@ | |||
1 | /* | 1 | /* |
2 | * This file is subject to the terms and conditions of the GNU General Public | 2 | * This file is subject to the terms and conditions of the GNU General Public |
3 | * License. See the file "COPYING" in the main directory of this archive | 3 | * License. See the file "COPYING" in the main directory of this archive |
4 | * for more details. | 4 | * for more details. |
5 | * | 5 | * |
6 | * KVM/MIPS: Interrupt delivery | 6 | * KVM/MIPS: Interrupt delivery |
7 | * | 7 | * |
8 | * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. | 8 | * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. |
9 | * Authors: Sanjay Lal <sanjayl@kymasys.com> | 9 | * Authors: Sanjay Lal <sanjayl@kymasys.com> |
10 | */ | 10 | */ |
11 | 11 | ||
12 | #include <linux/errno.h> | 12 | #include <linux/errno.h> |
13 | #include <linux/err.h> | 13 | #include <linux/err.h> |
@@ -34,7 +34,8 @@ void kvm_mips_dequeue_irq(struct kvm_vcpu *vcpu, uint32_t priority) | |||
34 | 34 | ||
35 | void kvm_mips_queue_timer_int_cb(struct kvm_vcpu *vcpu) | 35 | void kvm_mips_queue_timer_int_cb(struct kvm_vcpu *vcpu) |
36 | { | 36 | { |
37 | /* Cause bits to reflect the pending timer interrupt, | 37 | /* |
38 | * Cause bits to reflect the pending timer interrupt, | ||
38 | * the EXC code will be set when we are actually | 39 | * the EXC code will be set when we are actually |
39 | * delivering the interrupt: | 40 | * delivering the interrupt: |
40 | */ | 41 | */ |
@@ -51,12 +52,13 @@ void kvm_mips_dequeue_timer_int_cb(struct kvm_vcpu *vcpu) | |||
51 | kvm_mips_dequeue_irq(vcpu, MIPS_EXC_INT_TIMER); | 52 | kvm_mips_dequeue_irq(vcpu, MIPS_EXC_INT_TIMER); |
52 | } | 53 | } |
53 | 54 | ||
54 | void | 55 | void kvm_mips_queue_io_int_cb(struct kvm_vcpu *vcpu, |
55 | kvm_mips_queue_io_int_cb(struct kvm_vcpu *vcpu, struct kvm_mips_interrupt *irq) | 56 | struct kvm_mips_interrupt *irq) |
56 | { | 57 | { |
57 | int intr = (int)irq->irq; | 58 | int intr = (int)irq->irq; |
58 | 59 | ||
59 | /* Cause bits to reflect the pending IO interrupt, | 60 | /* |
61 | * Cause bits to reflect the pending IO interrupt, | ||
60 | * the EXC code will be set when we are actually | 62 | * the EXC code will be set when we are actually |
61 | * delivering the interrupt: | 63 | * delivering the interrupt: |
62 | */ | 64 | */ |
@@ -83,11 +85,11 @@ kvm_mips_queue_io_int_cb(struct kvm_vcpu *vcpu, struct kvm_mips_interrupt *irq) | |||
83 | 85 | ||
84 | } | 86 | } |
85 | 87 | ||
86 | void | 88 | void kvm_mips_dequeue_io_int_cb(struct kvm_vcpu *vcpu, |
87 | kvm_mips_dequeue_io_int_cb(struct kvm_vcpu *vcpu, | 89 | struct kvm_mips_interrupt *irq) |
88 | struct kvm_mips_interrupt *irq) | ||
89 | { | 90 | { |
90 | int intr = (int)irq->irq; | 91 | int intr = (int)irq->irq; |
92 | |||
91 | switch (intr) { | 93 | switch (intr) { |
92 | case -2: | 94 | case -2: |
93 | kvm_clear_c0_guest_cause(vcpu->arch.cop0, (C_IRQ0)); | 95 | kvm_clear_c0_guest_cause(vcpu->arch.cop0, (C_IRQ0)); |
@@ -111,9 +113,8 @@ kvm_mips_dequeue_io_int_cb(struct kvm_vcpu *vcpu, | |||
111 | } | 113 | } |
112 | 114 | ||
113 | /* Deliver the interrupt of the corresponding priority, if possible. */ | 115 | /* Deliver the interrupt of the corresponding priority, if possible. */ |
114 | int | 116 | int kvm_mips_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority, |
115 | kvm_mips_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority, | 117 | uint32_t cause) |
116 | uint32_t cause) | ||
117 | { | 118 | { |
118 | int allowed = 0; | 119 | int allowed = 0; |
119 | uint32_t exccode; | 120 | uint32_t exccode; |
@@ -164,7 +165,6 @@ kvm_mips_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority, | |||
164 | 165 | ||
165 | /* Are we allowed to deliver the interrupt ??? */ | 166 | /* Are we allowed to deliver the interrupt ??? */ |
166 | if (allowed) { | 167 | if (allowed) { |
167 | |||
168 | if ((kvm_read_c0_guest_status(cop0) & ST0_EXL) == 0) { | 168 | if ((kvm_read_c0_guest_status(cop0) & ST0_EXL) == 0) { |
169 | /* save old pc */ | 169 | /* save old pc */ |
170 | kvm_write_c0_guest_epc(cop0, arch->pc); | 170 | kvm_write_c0_guest_epc(cop0, arch->pc); |
@@ -195,9 +195,8 @@ kvm_mips_irq_deliver_cb(struct kvm_vcpu *vcpu, unsigned int priority, | |||
195 | return allowed; | 195 | return allowed; |
196 | } | 196 | } |
197 | 197 | ||
198 | int | 198 | int kvm_mips_irq_clear_cb(struct kvm_vcpu *vcpu, unsigned int priority, |
199 | kvm_mips_irq_clear_cb(struct kvm_vcpu *vcpu, unsigned int priority, | 199 | uint32_t cause) |
200 | uint32_t cause) | ||
201 | { | 200 | { |
202 | return 1; | 201 | return 1; |
203 | } | 202 | } |