Revision 327ac2e7 hw/sun4m.c

b/hw/sun4m.c
240 240
    slavio_irq_info(slavio_intctl);
241 241
}
242 242

  
243
void cpu_check_irqs(CPUState *env)
244
{
245
    if (env->pil_in && (env->interrupt_index == 0 ||
246
                        (env->interrupt_index & ~15) == TT_EXTINT)) {
247
        unsigned int i;
248

  
249
        for (i = 15; i > 0; i--) {
250
            if (env->pil_in & (1 << i)) {
251
                int old_interrupt = env->interrupt_index;
252

  
253
                env->interrupt_index = TT_EXTINT | i;
254
                if (old_interrupt != env->interrupt_index)
255
                    cpu_interrupt(env, CPU_INTERRUPT_HARD);
256
                break;
257
            }
258
        }
259
    } else if (!env->pil_in && (env->interrupt_index & ~15) == TT_EXTINT) {
260
        env->interrupt_index = 0;
261
        cpu_reset_interrupt(env, CPU_INTERRUPT_HARD);
262
    }
263
}
264

  
243 265
static void cpu_set_irq(void *opaque, int irq, int level)
244 266
{
245 267
    CPUState *env = opaque;
246 268

  
247 269
    if (level) {
248 270
        DPRINTF("Raise CPU IRQ %d\n", irq);
249

  
250 271
        env->halted = 0;
251

  
252
        if (env->interrupt_index == 0 ||
253
            ((env->interrupt_index & ~15) == TT_EXTINT &&
254
             (env->interrupt_index & 15) < irq)) {
255
            env->interrupt_index = TT_EXTINT | irq;
256
            cpu_interrupt(env, CPU_INTERRUPT_HARD);
257
        } else {
258
            DPRINTF("Not triggered, pending exception %d\n",
259
                    env->interrupt_index);
260
        }
272
        env->pil_in |= 1 << irq;
273
        cpu_check_irqs(env);
261 274
    } else {
262 275
        DPRINTF("Lower CPU IRQ %d\n", irq);
276
        env->pil_in &= ~(1 << irq);
277
        cpu_check_irqs(env);
263 278
    }
264 279
}
265 280

  

Also available in: Unified diff