aboutsummaryrefslogtreecommitdiff
path: root/target/s390x/sigp.c
diff options
context:
space:
mode:
authorDavid Hildenbrand <david@redhat.com>2017-09-28 22:37:08 +0200
committerCornelia Huck <cohuck@redhat.com>2017-10-20 13:32:10 +0200
commit741a4ec186160b632b6e19d2ad9623bc0121ea5d (patch)
treeef51ed709f0a17273b1034347cb5bba9f3f57b6c /target/s390x/sigp.c
parentf74990a5d019751c545e9800a3376b6336e77d38 (diff)
target/s390x: special handling when starting a CPU with WAIT PSW
When we try to start a CPU with a WAIT PSW, we have to take care that TCG will actually try to continue executing instructions. We must therefore really only unhalt the CPU if we don't have a WAIT PSW. Also document the special order for restart interrupts, which load a new PSW and change the state to operating. To keep KVM working, simply don't have a look at the WAIT bit when loading the PSW. Otherwise the behavior of a restart interrupt when a CPU stopped would be changed. Signed-off-by: David Hildenbrand <david@redhat.com> Message-Id: <20170928203708.9376-31-david@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Diffstat (limited to 'target/s390x/sigp.c')
-rw-r--r--target/s390x/sigp.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/target/s390x/sigp.c b/target/s390x/sigp.c
index 964c75a736..ac3f8e7dc2 100644
--- a/target/s390x/sigp.c
+++ b/target/s390x/sigp.c
@@ -232,8 +232,12 @@ static void sigp_restart(CPUState *cs, run_on_cpu_data arg)
case CPU_STATE_STOPPED:
/* the restart irq has to be delivered prior to any other pending irq */
cpu_synchronize_state(cs);
- do_restart_interrupt(&cpu->env);
+ /*
+ * Set OPERATING (and unhalting) before loading the restart PSW.
+ * load_psw() will then properly halt the CPU again if necessary (TCG).
+ */
s390_cpu_set_state(CPU_STATE_OPERATING, cpu);
+ do_restart_interrupt(&cpu->env);
break;
case CPU_STATE_OPERATING:
cpu_inject_restart(cpu);