mirror of https://github.com/xqemu/xqemu.git
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>
This commit is contained in:
parent
190b2422e6
commit
44977a8fe7
|
@ -430,6 +430,7 @@ static void s390_cpu_class_init(ObjectClass *oc, void *data)
|
||||||
cc->write_elf64_note = s390_cpu_write_elf64_note;
|
cc->write_elf64_note = s390_cpu_write_elf64_note;
|
||||||
cc->cpu_exec_interrupt = s390_cpu_exec_interrupt;
|
cc->cpu_exec_interrupt = s390_cpu_exec_interrupt;
|
||||||
cc->debug_excp_handler = s390x_cpu_debug_excp_handler;
|
cc->debug_excp_handler = s390x_cpu_debug_excp_handler;
|
||||||
|
cc->do_unaligned_access = s390x_cpu_do_unaligned_access;
|
||||||
#endif
|
#endif
|
||||||
cc->disas_set_info = s390_cpu_disas_set_info;
|
cc->disas_set_info = s390_cpu_disas_set_info;
|
||||||
|
|
||||||
|
|
|
@ -480,6 +480,9 @@ int s390_cpu_handle_mmu_fault(CPUState *cpu, vaddr address, int rw,
|
||||||
|
|
||||||
#ifndef CONFIG_USER_ONLY
|
#ifndef CONFIG_USER_ONLY
|
||||||
void do_restart_interrupt(CPUS390XState *env);
|
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,
|
static inline hwaddr decode_basedisp_s(CPUS390XState *env, uint32_t ipb,
|
||||||
uint8_t *ar)
|
uint8_t *ar)
|
||||||
|
|
|
@ -718,4 +718,20 @@ void s390x_cpu_debug_excp_handler(CPUState *cs)
|
||||||
cpu_loop_exit_noexc(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 */
|
#endif /* CONFIG_USER_ONLY */
|
||||||
|
|
Loading…
Reference in New Issue