aboutsummaryrefslogtreecommitdiff
path: root/target/s390x/helper.c
diff options
context:
space:
mode:
authorRichard Henderson <rth@twiddle.net>2017-05-21 09:50:00 -0700
committerRichard Henderson <rth@twiddle.net>2017-06-06 14:34:32 -0700
commit303c681a8f50eb88fbafc2bf6a7e4c5813ac2be0 (patch)
tree73c0154cfb153d248aaa6a50db1dbd4e774c8495 /target/s390x/helper.c
parent06fc03486cf9b825f8afd9defe80a255364ed02c (diff)
target/s390x: Implement EXECUTE via new TranslationBlock
Previously, helper_ex would construct the insn and then implement the insn via direct calls other helpers. This was sufficient to boot Linux but that is all. It is easy enough to go the whole nine yards by stashing state for EXECUTE within the cpu, and then rely on a new TB to be created that properly and completely interprets the insn. Reviewed-by: Aurelien Jarno <aurelien@aurel32.net> Signed-off-by: Richard Henderson <rth@twiddle.net>
Diffstat (limited to 'target/s390x/helper.c')
-rw-r--r--target/s390x/helper.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/target/s390x/helper.c b/target/s390x/helper.c
index 4f8aadf305..291db720fb 100644
--- a/target/s390x/helper.c
+++ b/target/s390x/helper.c
@@ -642,6 +642,11 @@ bool s390_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
S390CPU *cpu = S390_CPU(cs);
CPUS390XState *env = &cpu->env;
+ if (env->ex_value) {
+ /* Execution of the target insn is indivisible from
+ the parent EXECUTE insn. */
+ return false;
+ }
if (env->psw.mask & PSW_MASK_EXT) {
s390_cpu_do_interrupt(cs);
return true;