> @@ -248,6 +249,19 @@ static void do_ext_interrupt(CPUS390XState *env) > lowcore->ext_int_code = cpu_to_be16(EXT_CPU_TIMER); > lowcore->cpu_addr = 0; > env->pending_int &= ~INTERRUPT_EXT_CPU_TIMER; > + } else if (env->pending_int & INTERRUPT_EMERGENCY_SIGNAL) { > + lowcore->ext_int_code = cpu_to_be16(EXT_EMERGENCY); > + cpu_addr = find_first_bit(env->emergency_signals, S390_MAX_CPUS); > + g_assert(cpu_addr < S390_MAX_CPUS); > + lowcore->cpu_addr = cpu_to_be16(cpu_addr); > + clear_bit(cpu_addr, env->emergency_signals); > + if (bitmap_empty(env->emergency_signals, max_cpus)) { > + env->pending_int &= ~INTERRUPT_EMERGENCY_SIGNAL; > + } > + } else if (env->pending_int & INTERRUPT_EXTERNAL_CALL) { > + lowcore->ext_int_code = cpu_to_be16(EXT_EXTERNAL_CALL); > + lowcore->cpu_addr = cpu_to_be16(env->external_call_addr); > + env->pending_int &= ~INTERRUPT_EXTERNAL_CALL;
The priority of the interrupts is still wrong and we don't check for the subclass-mask bits. Will fix this. -- Thanks, David