env->psw_c = FIELD_EX32(psw, PSW, C);
}
-#define INT_FLAGS (CPU_INTERRUPT_HARD | CPU_INTERRUPT_FIR)
void rx_cpu_do_interrupt(CPUState *cs)
{
CPURXState *env = cpu_env(cs);
- int do_irq = cpu_test_interrupt(cs, INT_FLAGS);
uint32_t save_psw;
uint64_t last_pc = env->pc;
save_psw = rx_cpu_pack_psw(env);
env->psw_pm = env->psw_i = env->psw_u = 0;
- if (do_irq) {
- if (do_irq & CPU_INTERRUPT_FIR) {
- env->bpc = env->pc;
- env->bpsw = save_psw;
- env->pc = env->fintv;
- env->psw_ipl = 15;
- cpu_reset_interrupt(cs, CPU_INTERRUPT_FIR);
- qemu_set_irq(env->ack, env->ack_irq);
- qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
- qemu_log_mask(CPU_LOG_INT, "fast interrupt raised\n");
- } else if (do_irq & CPU_INTERRUPT_HARD) {
- env->isp -= 4;
- cpu_stl_data(env, env->isp, save_psw);
- env->isp -= 4;
- cpu_stl_data(env, env->isp, env->pc);
- env->pc = cpu_ldl_data(env, env->intb + env->ack_irq * 4);
- env->psw_ipl = env->ack_ipl;
- cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
- qemu_set_irq(env->ack, env->ack_irq);
- qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
- qemu_log_mask(CPU_LOG_INT,
- "interrupt 0x%02x raised\n", env->ack_irq);
- }
+ if (cpu_test_interrupt(cs, CPU_INTERRUPT_FIR)) {
+ env->bpc = env->pc;
+ env->bpsw = save_psw;
+ env->pc = env->fintv;
+ env->psw_ipl = 15;
+ cpu_reset_interrupt(cs, CPU_INTERRUPT_FIR);
+ qemu_set_irq(env->ack, env->ack_irq);
+ qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
+ qemu_log_mask(CPU_LOG_INT, "fast interrupt raised\n");
+ } else if (cpu_test_interrupt(cs, CPU_INTERRUPT_HARD)) {
+ env->isp -= 4;
+ cpu_stl_data(env, env->isp, save_psw);
+ env->isp -= 4;
+ cpu_stl_data(env, env->isp, env->pc);
+ env->pc = cpu_ldl_data(env, env->intb + env->ack_irq * 4);
+ env->psw_ipl = env->ack_ipl;
+ cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
+ qemu_set_irq(env->ack, env->ack_irq);
+ qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
+ qemu_log_mask(CPU_LOG_INT, "interrupt 0x%02x raised\n", env->ack_irq);
} else {
uint32_t vec = cs->exception_index;
const char *expname = "unknown exception";