mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-06 09:13:55 -06:00
s390: Keep I/O interrupts enabled for all iscs.
do_io_interrupt() would stop scanning further iscs if it found an I/O interrupt it could inject. This might cause the pending interrupt indication for I/O interrupts to be reset although there might be queued I/O interrupts for subsequent iscs. Fix this by reordering the logic: Inject the I/O interrupt immediately and continue searching all iscs for queued interrupts. Signed-off-by: Cornelia Huck <cornelia.huck@de.ibm.com> Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
760794f784
commit
bd9a8d852c
1 changed files with 21 additions and 19 deletions
|
@ -617,7 +617,6 @@ static void do_ext_interrupt(CPUS390XState *env)
|
||||||
|
|
||||||
static void do_io_interrupt(CPUS390XState *env)
|
static void do_io_interrupt(CPUS390XState *env)
|
||||||
{
|
{
|
||||||
uint64_t mask = 0, addr = 0;
|
|
||||||
LowCore *lowcore;
|
LowCore *lowcore;
|
||||||
IOIntQueue *q;
|
IOIntQueue *q;
|
||||||
uint8_t isc;
|
uint8_t isc;
|
||||||
|
@ -642,6 +641,9 @@ static void do_io_interrupt(CPUS390XState *env)
|
||||||
disable = 0;
|
disable = 0;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
if (!found) {
|
||||||
|
uint64_t mask, addr;
|
||||||
|
|
||||||
found = 1;
|
found = 1;
|
||||||
lowcore = cpu_map_lowcore(env);
|
lowcore = cpu_map_lowcore(env);
|
||||||
|
|
||||||
|
@ -657,21 +659,21 @@ static void do_io_interrupt(CPUS390XState *env)
|
||||||
cpu_unmap_lowcore(lowcore);
|
cpu_unmap_lowcore(lowcore);
|
||||||
|
|
||||||
env->io_index[isc]--;
|
env->io_index[isc]--;
|
||||||
|
|
||||||
|
DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,
|
||||||
|
env->psw.mask, env->psw.addr);
|
||||||
|
load_psw(env, mask, addr);
|
||||||
|
}
|
||||||
if (env->io_index[isc] >= 0) {
|
if (env->io_index[isc] >= 0) {
|
||||||
disable = 0;
|
disable = 0;
|
||||||
}
|
}
|
||||||
break;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (disable) {
|
if (disable) {
|
||||||
env->pending_int &= ~INTERRUPT_IO;
|
env->pending_int &= ~INTERRUPT_IO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found) {
|
|
||||||
DPRINTF("%s: %" PRIx64 " %" PRIx64 "\n", __func__,
|
|
||||||
env->psw.mask, env->psw.addr);
|
|
||||||
load_psw(env, mask, addr);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_mchk_interrupt(CPUS390XState *env)
|
static void do_mchk_interrupt(CPUS390XState *env)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue