aboutsummaryrefslogtreecommitdiff
path: root/hw/mips/mips_int.c
diff options
context:
space:
mode:
Diffstat (limited to 'hw/mips/mips_int.c')
-rw-r--r--hw/mips/mips_int.c24
1 files changed, 11 insertions, 13 deletions
diff --git a/hw/mips/mips_int.c b/hw/mips/mips_int.c
index 48192d22f3..eef2fd2cd1 100644
--- a/hw/mips/mips_int.c
+++ b/hw/mips/mips_int.c
@@ -21,9 +21,8 @@
*/
#include "qemu/osdep.h"
-#include "hw/hw.h"
-#include "hw/mips/cpudevs.h"
-#include "cpu.h"
+#include "qemu/main-loop.h"
+#include "hw/irq.h"
#include "sysemu/kvm.h"
#include "kvm_mips.h"
@@ -33,22 +32,20 @@ static void cpu_mips_irq_request(void *opaque, int irq, int level)
CPUMIPSState *env = &cpu->env;
CPUState *cs = CPU(cpu);
- if (irq < 0 || irq > 7)
+ if (irq < 0 || irq > 7) {
return;
+ }
+
+ BQL_LOCK_GUARD();
if (level) {
env->CP0_Cause |= 1 << (irq + CP0Ca_IP);
-
- if (kvm_enabled() && irq == 2) {
- kvm_mips_set_interrupt(cpu, irq, level);
- }
-
} else {
env->CP0_Cause &= ~(1 << (irq + CP0Ca_IP));
+ }
- if (kvm_enabled() && irq == 2) {
- kvm_mips_set_interrupt(cpu, irq, level);
- }
+ if (kvm_enabled() && (irq == 2 || irq == 3)) {
+ kvm_mips_set_interrupt(cpu, irq, level);
}
if (env->CP0_Cause & CP0Ca_IP_mask) {
@@ -64,10 +61,11 @@ void cpu_mips_irq_init_cpu(MIPSCPU *cpu)
qemu_irq *qi;
int i;
- qi = qemu_allocate_irqs(cpu_mips_irq_request, mips_env_get_cpu(env), 8);
+ qi = qemu_allocate_irqs(cpu_mips_irq_request, cpu, 8);
for (i = 0; i < 8; i++) {
env->irq[i] = qi[i];
}
+ g_free(qi);
}
void cpu_mips_soft_irq(CPUMIPSState *env, int irq, int level)