mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 15:53:54 -06:00
Reworking MIPS interrupt handling, by Aurelien Jarno.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2350 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
30c4bbace1
commit
4de9b249d3
13 changed files with 76 additions and 75 deletions
39
hw/mips_int.c
Normal file
39
hw/mips_int.c
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include "vl.h"
|
||||
#include "cpu.h"
|
||||
|
||||
/* Raise IRQ to CPU if necessary. It must be called every time the active
|
||||
IRQ may change */
|
||||
void cpu_mips_update_irq(CPUState *env)
|
||||
{
|
||||
if ((env->CP0_Status & env->CP0_Cause & CP0Ca_IP_mask) &&
|
||||
(env->CP0_Status & (1 << CP0St_IE)) &&
|
||||
!(env->hflags & MIPS_HFLAG_EXL) &&
|
||||
!(env->hflags & MIPS_HFLAG_ERL) &&
|
||||
!(env->hflags & MIPS_HFLAG_DM)) {
|
||||
if (! (env->interrupt_request & CPU_INTERRUPT_HARD)) {
|
||||
cpu_interrupt(env, CPU_INTERRUPT_HARD);
|
||||
}
|
||||
} else {
|
||||
cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
|
||||
}
|
||||
}
|
||||
|
||||
void cpu_mips_irq_request(void *opaque, int irq, int level)
|
||||
{
|
||||
CPUState *env = first_cpu;
|
||||
|
||||
uint32_t mask;
|
||||
|
||||
if (irq >= 16)
|
||||
return;
|
||||
|
||||
mask = 1 << (irq + CP0Ca_IP);
|
||||
|
||||
if (level) {
|
||||
env->CP0_Cause |= mask;
|
||||
} else {
|
||||
env->CP0_Cause &= ~mask;
|
||||
}
|
||||
cpu_mips_update_irq(env);
|
||||
}
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue