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>
---
target/s390x/excp_helper.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/target/s390x/excp_helper.c b/target/s390x/excp_helper.c
index f6747f3877..1a0d0770a9 100644
--- a/target/s390x/excp_helper.c
+++ b/target/s390x/excp_helper.c
@@ -467,6 +467,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 */
--
2.13.5