diff options
Diffstat (limited to 'hw/mips/mips_int.c')
-rw-r--r-- | hw/mips/mips_int.c | 24 |
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) |