diff options
author | David Hildenbrand <david@redhat.com> | 2017-09-28 22:36:47 +0200 |
---|---|---|
committer | Cornelia Huck <cohuck@redhat.com> | 2017-10-20 13:32:10 +0200 |
commit | f1cbfe6a736cf5a676fcdafcafdeb24125358c4e (patch) | |
tree | f50863fa3f4b855a103a436fb02cc47bb6f29a56 /target/s390x/excp_helper.c | |
parent | 83f7f32901c630f4fc01acd0d9082da466b17102 (diff) | |
download | qemu-f1cbfe6a736cf5a676fcdafcafdeb24125358c4e.zip qemu-f1cbfe6a736cf5a676fcdafcafdeb24125358c4e.tar.gz qemu-f1cbfe6a736cf5a676fcdafcafdeb24125358c4e.tar.bz2 |
s390x/tcg: handle WAIT PSWs during interrupt injection
If we encounter a WAIT PSW, we have to halt immediately. Using
cpu_loop_exit() at this point feels wrong. Simply leaving
cs->exception_index set doesn't result in an immediate stop.
This is also necessary to properly handle SIGP STOP interrupts later.
The CPU_INTERRUPT_HALT will be processed immediately and properly set
the CPU to halted (also resetting cs->exception_index to EXCP_HLT)
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20170928203708.9376-10-david@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Diffstat (limited to 'target/s390x/excp_helper.c')
-rw-r--r-- | target/s390x/excp_helper.c | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c index 63058a6..56331ae 100644 --- a/target/s390x/excp_helper.c +++ b/target/s390x/excp_helper.c @@ -468,6 +468,12 @@ void s390_cpu_do_interrupt(CPUState *cs) do_mchk_interrupt(env); break; } + + /* WAIT PSW during interrupt injection */ + if (cs->exception_index == EXCP_HLT) { + /* don't trigger a cpu_loop_exit(), use an interrupt instead */ + cpu_interrupt(CPU(cpu), CPU_INTERRUPT_HALT); + } cs->exception_index = -1; /* we might still have pending interrupts, but not deliverable */ |