hc
2024-05-11 04dd17822334871b23ea2862f7798fb0e0007777
kernel/arch/mips/kvm/interrupt.c
....@@ -13,7 +13,7 @@
1313 #include <linux/err.h>
1414 #include <linux/vmalloc.h>
1515 #include <linux/fs.h>
16
-#include <linux/bootmem.h>
16
+#include <linux/memblock.h>
1717 #include <asm/page.h>
1818 #include <asm/cacheflush.h>
1919
....@@ -61,27 +61,8 @@
6161 * the EXC code will be set when we are actually
6262 * delivering the interrupt:
6363 */
64
- switch (intr) {
65
- case 2:
66
- kvm_set_c0_guest_cause(vcpu->arch.cop0, (C_IRQ0));
67
- /* Queue up an INT exception for the core */
68
- kvm_mips_queue_irq(vcpu, MIPS_EXC_INT_IO);
69
- break;
70
-
71
- case 3:
72
- kvm_set_c0_guest_cause(vcpu->arch.cop0, (C_IRQ1));
73
- kvm_mips_queue_irq(vcpu, MIPS_EXC_INT_IPI_1);
74
- break;
75
-
76
- case 4:
77
- kvm_set_c0_guest_cause(vcpu->arch.cop0, (C_IRQ2));
78
- kvm_mips_queue_irq(vcpu, MIPS_EXC_INT_IPI_2);
79
- break;
80
-
81
- default:
82
- break;
83
- }
84
-
64
+ kvm_set_c0_guest_cause(vcpu->arch.cop0, 1 << (intr + 8));
65
+ kvm_mips_queue_irq(vcpu, kvm_irq_to_priority(intr));
8566 }
8667
8768 void kvm_mips_dequeue_io_int_cb(struct kvm_vcpu *vcpu,
....@@ -89,26 +70,8 @@
8970 {
9071 int intr = (int)irq->irq;
9172
92
- switch (intr) {
93
- case -2:
94
- kvm_clear_c0_guest_cause(vcpu->arch.cop0, (C_IRQ0));
95
- kvm_mips_dequeue_irq(vcpu, MIPS_EXC_INT_IO);
96
- break;
97
-
98
- case -3:
99
- kvm_clear_c0_guest_cause(vcpu->arch.cop0, (C_IRQ1));
100
- kvm_mips_dequeue_irq(vcpu, MIPS_EXC_INT_IPI_1);
101
- break;
102
-
103
- case -4:
104
- kvm_clear_c0_guest_cause(vcpu->arch.cop0, (C_IRQ2));
105
- kvm_mips_dequeue_irq(vcpu, MIPS_EXC_INT_IPI_2);
106
- break;
107
-
108
- default:
109
- break;
110
- }
111
-
73
+ kvm_clear_c0_guest_cause(vcpu->arch.cop0, 1 << (-intr + 8));
74
+ kvm_mips_dequeue_irq(vcpu, kvm_irq_to_priority(-intr));
11275 }
11376
11477 /* Deliver the interrupt of the corresponding priority, if possible. */
....@@ -116,50 +79,20 @@
11679 u32 cause)
11780 {
11881 int allowed = 0;
119
- u32 exccode;
82
+ u32 exccode, ie;
12083
12184 struct kvm_vcpu_arch *arch = &vcpu->arch;
12285 struct mips_coproc *cop0 = vcpu->arch.cop0;
12386
124
- switch (priority) {
125
- case MIPS_EXC_INT_TIMER:
126
- if ((kvm_read_c0_guest_status(cop0) & ST0_IE)
127
- && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL)))
128
- && (kvm_read_c0_guest_status(cop0) & IE_IRQ5)) {
129
- allowed = 1;
130
- exccode = EXCCODE_INT;
131
- }
132
- break;
87
+ if (priority == MIPS_EXC_MAX)
88
+ return 0;
13389
134
- case MIPS_EXC_INT_IO:
135
- if ((kvm_read_c0_guest_status(cop0) & ST0_IE)
136
- && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL)))
137
- && (kvm_read_c0_guest_status(cop0) & IE_IRQ0)) {
138
- allowed = 1;
139
- exccode = EXCCODE_INT;
140
- }
141
- break;
142
-
143
- case MIPS_EXC_INT_IPI_1:
144
- if ((kvm_read_c0_guest_status(cop0) & ST0_IE)
145
- && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL)))
146
- && (kvm_read_c0_guest_status(cop0) & IE_IRQ1)) {
147
- allowed = 1;
148
- exccode = EXCCODE_INT;
149
- }
150
- break;
151
-
152
- case MIPS_EXC_INT_IPI_2:
153
- if ((kvm_read_c0_guest_status(cop0) & ST0_IE)
154
- && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL)))
155
- && (kvm_read_c0_guest_status(cop0) & IE_IRQ2)) {
156
- allowed = 1;
157
- exccode = EXCCODE_INT;
158
- }
159
- break;
160
-
161
- default:
162
- break;
90
+ ie = 1 << (kvm_priority_to_irq[priority] + 8);
91
+ if ((kvm_read_c0_guest_status(cop0) & ST0_IE)
92
+ && (!(kvm_read_c0_guest_status(cop0) & (ST0_EXL | ST0_ERL)))
93
+ && (kvm_read_c0_guest_status(cop0) & ie)) {
94
+ allowed = 1;
95
+ exccode = EXCCODE_INT;
16396 }
16497
16598 /* Are we allowed to deliver the interrupt ??? */