aboutsummaryrefslogtreecommitdiff
path: root/target/s390x/excp_helper.c
diff options
context:
space:
mode:
authorDavid Hildenbrand <david@redhat.com>2017-09-28 22:36:47 +0200
committerCornelia Huck <cohuck@redhat.com>2017-10-20 13:32:10 +0200
commitf1cbfe6a736cf5a676fcdafcafdeb24125358c4e (patch)
treef50863fa3f4b855a103a436fb02cc47bb6f29a56 /target/s390x/excp_helper.c
parent83f7f32901c630f4fc01acd0d9082da466b17102 (diff)
downloadqemu-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.c6
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 */