Le 07/03/2021 à 21:26, Mark Cave-Ayland a écrit : > According to the M68040UM Appendix D the requirement for data accesses to be > word aligned is only for the 68000, 68008 and 68010 CPUs. Later CPUs from the > 68020 onwards will allow unaligned data accesses but at the cost of being less > efficient. > > Add a new M68K_FEATURE_NO_DALIGN feature to specify that data accesses are not > required to be word aligned, and don't perform the alignment on the stack > pointer when taking an exception if this feature is not selected. > > This is required because the MacOS DAFB driver attempts to call an A-trap > with a byte-aligned stack pointer during initialisation and without this the > stack pointer is off by one when the A-trap returns. > > Signed-off-by: Mark Cave-Ayland <mark.cave-ayl...@ilande.co.uk> > --- > target/m68k/cpu.c | 1 + > target/m68k/cpu.h | 1 + > target/m68k/op_helper.c | 5 ++++- > 3 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c > index 37d2ed9dc7..ea51753eb0 100644 > --- a/target/m68k/cpu.c > +++ b/target/m68k/cpu.c > @@ -161,6 +161,7 @@ static void m68020_cpu_initfn(Object *obj) > m68k_set_feature(env, M68K_FEATURE_CAS); > m68k_set_feature(env, M68K_FEATURE_CHK2); > m68k_set_feature(env, M68K_FEATURE_MSP); > + m68k_set_feature(env, M68K_FEATURE_NO_DALIGN); > } > > /* > diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h > index 7c3feeaf8a..1e0876bba8 100644 > --- a/target/m68k/cpu.h > +++ b/target/m68k/cpu.h > @@ -505,6 +505,7 @@ enum m68k_features { > M68K_FEATURE_CHK2, /* CHK2 insn. (680[2346]0, and CPU32) */ > M68K_FEATURE_MOVEP, /* MOVEP insn. (680[01234]0, and CPU32) */ > M68K_FEATURE_MOVEC, /* MOVEC insn. (from 68010) */ > + M68K_FEATURE_NO_DALIGN, /* Unaligned data accesses (680[2346]0) */ > }; > > static inline int m68k_feature(CPUM68KState *env, int feature) > diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c > index 59a6448296..71b3df0910 100644 > --- a/target/m68k/op_helper.c > +++ b/target/m68k/op_helper.c > @@ -348,7 +348,10 @@ static void m68k_interrupt_all(CPUM68KState *env, int > is_hw) > cpu_m68k_set_sr(env, sr); > sp = env->aregs[7]; > > - sp &= ~1; > + if (!m68k_feature(env, M68K_FEATURE_NO_DALIGN)) { > + sp &= ~1; > + } > + > if (cs->exception_index == EXCP_ACCESS) { > if (env->mmu.fault) { > cpu_abort(cs, "DOUBLE MMU FAULT\n"); >
Reviewed-by: Laurent Vivier <laur...@vivier.eu>