On 2017-05-08 08:17, Richard Henderson wrote: > All of the interlocked access facility instructions raise a > specification exception for unaligned accesses. Do this by > using the (previously unused) unaligned_access hook. > > Signed-off-by: Richard Henderson <r...@twiddle.net> > --- > target/s390x/cpu.c | 1 + > target/s390x/cpu.h | 3 +++ > target/s390x/helper.c | 16 ++++++++++++++++ > 3 files changed, 20 insertions(+) > > diff --git a/target/s390x/cpu.c b/target/s390x/cpu.c > index 066dcd1..a1bf2ba 100644 > --- a/target/s390x/cpu.c > +++ b/target/s390x/cpu.c > @@ -430,6 +430,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void > *data) > cc->write_elf64_note = s390_cpu_write_elf64_note; > cc->cpu_exec_interrupt = s390_cpu_exec_interrupt; > cc->debug_excp_handler = s390x_cpu_debug_excp_handler; > + cc->do_unaligned_access = s390x_cpu_do_unaligned_access; > #endif > cc->disas_set_info = s390_cpu_disas_set_info; > > diff --git a/target/s390x/cpu.h b/target/s390x/cpu.h > index 058ddad..bbed320 100644 > --- a/target/s390x/cpu.h > +++ b/target/s390x/cpu.h > @@ -480,6 +480,9 @@ int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr > address, int rw, > > #ifndef CONFIG_USER_ONLY > void do_restart_interrupt(CPUS390XState *env); > +void s390x_cpu_do_unaligned_access(CPUState *cs, vaddr addr, > + MMUAccessType access_type, > + int mmu_idx, uintptr_t retaddr); > > static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb, > uint8_t *ar) > diff --git a/target/s390x/helper.c b/target/s390x/helper.c > index 68bd2f9..9978490 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 */
Reviewed-by: Aurelien Jarno <aurel...@aurel32.net> -- Aurelien Jarno GPG: 4096R/1DDD8C9B aurel...@aurel32.net http://www.aurel32.net