4 /* Raise IRQ to CPU if necessary. It must be called every time the active
6 void cpu_mips_update_irq(CPUState
*env
)
8 if ((env
->CP0_Status
& env
->CP0_Cause
& CP0Ca_IP_mask
) &&
9 (env
->CP0_Status
& (1 << CP0St_IE
)) &&
10 !(env
->hflags
& MIPS_HFLAG_EXL
) &&
11 !(env
->hflags
& MIPS_HFLAG_ERL
) &&
12 !(env
->hflags
& MIPS_HFLAG_DM
)) {
13 if (! (env
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
14 cpu_interrupt(env
, CPU_INTERRUPT_HARD
);
17 cpu_reset_interrupt(env
, CPU_INTERRUPT_HARD
);
21 void cpu_mips_irq_request(void *opaque
, int irq
, int level
)
23 CPUState
*env
= first_cpu
;
30 mask
= 1 << (irq
+ CP0Ca_IP
);
33 env
->CP0_Cause
|= mask
;
35 env
->CP0_Cause
&= ~mask
;
37 cpu_mips_update_irq(env
);
43 /* Raise IRQ to CPU if necessary. It must be called every time the active
45 void cpu_mips_update_irq(CPUState
*env
)
47 if ((env
->CP0_Status
& env
->CP0_Cause
& CP0Ca_IP_mask
) &&
48 (env
->CP0_Status
& (1 << CP0St_IE
)) &&
49 !(env
->hflags
& MIPS_HFLAG_EXL
) &&
50 !(env
->hflags
& MIPS_HFLAG_ERL
) &&
51 !(env
->hflags
& MIPS_HFLAG_DM
)) {
52 if (! (env
->interrupt_request
& CPU_INTERRUPT_HARD
)) {
53 cpu_interrupt(env
, CPU_INTERRUPT_HARD
);
56 cpu_reset_interrupt(env
, CPU_INTERRUPT_HARD
);
60 void cpu_mips_irq_request(void *opaque
, int irq
, int level
)
62 CPUState
*env
= first_cpu
;
69 mask
= 1 << (irq
+ CP0Ca_IP
);
72 env
->CP0_Cause
|= mask
;
74 env
->CP0_Cause
&= ~mask
;
76 cpu_mips_update_irq(env
);