diff options
author | Richard Henderson <rth@twiddle.net> | 2017-03-02 13:06:18 +1100 |
---|---|---|
committer | Richard Henderson <rth@twiddle.net> | 2017-05-12 15:40:29 -0700 |
commit | 44977a8fe7b5ed8fc3d135b74d5933dfa53b11ee (patch) | |
tree | 75815086b02f333f4372b3809170c3c066227b08 /target/s390x/helper.c | |
parent | 190b2422e65fb8bb559f4337dfe461a50d0b7ec1 (diff) |
target/s390x: Diagnose specification exception for atomics
All of the interlocked access facility instructions raise a
specification exception for unaligned accesses. Do this by
using the (previously unused) unaligned_access hook.
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.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/target/s390x/helper.c b/target/s390x/helper.c index 68bd2f9784..997849008f 100644 --- a/target/s390x/helper.c +++ b/target/s390x/helper.c @@ -718,4 +718,20 @@ void s390x_cpu_debug_excp_handler(CPUState *cs) cpu_loop_exit_noexc(cs); } } + +/* Unaligned accesses are only diagnosed with MO_ALIGN. At the moment, + this is only for the atomic operations, for which we want to raise a + specification exception. */ +void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr, + MMUAccessType access_type, + int mmu_idx, uintptr_t retaddr) +{ + S390CPU *cpu = S390_CPU(cs); + CPUS390XState *env = &cpu->env; + + if (retaddr) { + cpu_restore_state(cs, retaddr); + } + program_interrupt(env, PGM_SPECIFICATION, ILEN_LATER); +} #endif /* CONFIG_USER_ONLY */ |