Message ID | 20210308121155.2476-4-mark.cave-ayland@ilande.co.uk |
---|---|
State | New |
Headers | show |
Series | target/m68k: MacOS related fixes | expand |
On 3/8/21 4:11 AM, Mark Cave-Ayland wrote: > 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-ayland@ilande.co.uk> > Reviewed-by: Laurent Vivier<laurent@vivier.eu> > --- Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
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-ayland@ilande.co.uk> > Reviewed-by: Laurent Vivier <laurent@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
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");