[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 3/3] target/m68k: add M68K_FEATURE_UNALIGNED_DATA feature
From: |
Laurent Vivier |
Subject: |
Re: [PATCH v2 3/3] target/m68k: add M68K_FEATURE_UNALIGNED_DATA feature |
Date: |
Tue, 9 Mar 2021 20:47:50 +0100 |
User-agent: |
Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.8.0 |
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