[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [PATCH v2 1/3] target/m68k: don't set SSW ATC bit for physical bus e
From: |
Laurent Vivier |
Subject: |
Re: [PATCH v2 1/3] target/m68k: don't set SSW ATC bit for physical bus errors |
Date: |
Tue, 9 Mar 2021 20:46:24 +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 :
> If a NuBus slot doesn't contain a card, the Quadra hardware generates a
> physical
> bus error if the CPU attempts to access the slot address space. Both Linux and
> MacOS use a separate bus error handler during NuBus accesses in order to
> detect
> and recover when addressing empty slots.
>
> According to the MC68040 users manual the ATC bit of the SSW is used to
> distinguish between ATC faults and physical bus errors. MacOS specifically
> checks
> the stack frame generated by a NuBus error and panics if the SSW ATC bit is
> set.
>
> Update m68k_cpu_transaction_failed() so that the SSW ATC bit is not set if the
> memory API returns MEMTX_DECODE_ERROR which will be used to indicate that an
> access to an empty NuBus slot occurred.
>
> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
> Reviewed-by: Laurent Vivier <laurent@vivier.eu>
> ---
> target/m68k/op_helper.c | 12 +++++++++++-
> 1 file changed, 11 insertions(+), 1 deletion(-)
>
> diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
> index 202498deb5..59a6448296 100644
> --- a/target/m68k/op_helper.c
> +++ b/target/m68k/op_helper.c
> @@ -468,7 +468,17 @@ void m68k_cpu_transaction_failed(CPUState *cs, hwaddr
> physaddr, vaddr addr,
>
> if (m68k_feature(env, M68K_FEATURE_M68040)) {
> env->mmu.mmusr = 0;
> - env->mmu.ssw |= M68K_ATC_040;
> +
> + /*
> + * According to the MC68040 users manual the ATC bit of the SSW is
> + * used to distinguish between ATC faults and physical bus errors.
> + * In the case of a bus error e.g. during nubus read from an empty
> + * slot this bit should not be set
> + */
> + if (response != MEMTX_DECODE_ERROR) {
> + env->mmu.ssw |= M68K_ATC_040;
> + }
> +
> /* FIXME: manage MMU table access error */
> env->mmu.ssw &= ~M68K_TM_040;
> if (env->sr & SR_S) { /* SUPERVISOR */
>
Applied to my m68k-for-6.0 branch
Thanks,
Laurent