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;
#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)
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 */