Le 08/03/2021 à 13:11, 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_UNALIGNED_DATA 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> > Reviewed-by: Laurent Vivier <laur...@vivier.eu> > --- > target/m68k/cpu.c | 1 + > target/m68k/cpu.h | 2 ++ > target/m68k/op_helper.c | 5 ++++- > 3 files changed, 7 insertions(+), 1 deletion(-) > > diff --git a/target/m68k/cpu.c b/target/m68k/cpu.c > index 37d2ed9dc7..a14874b4da 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_UNALIGNED_DATA); > } > > /* > diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h > index ce558e9b03..402c86c876 100644 > --- a/target/m68k/cpu.h > +++ b/target/m68k/cpu.h > @@ -527,6 +527,8 @@ enum m68k_features { > M68K_FEATURE_MOVEP, > /* MOVEC insn. (from 68010) */ > M68K_FEATURE_MOVEC, > + /* Unaligned data accesses (680[2346]0) */ > + M68K_FEATURE_UNALIGNED_DATA, > }; > > 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..3fa7b7e19e 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_UNALIGNED_DATA)) { > + sp &= ~1; > + } > + > if (cs->exception_index == EXCP_ACCESS) { > if (env->mmu.fault) { > cpu_abort(cs, "DOUBLE MMU FAULT\n"); >
Applied to my m68k-for-6.0 branch Thanks, Laurent