qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH for-7.1 v6 39/51] target/nios2: Implement Misaligned destinat


From: Peter Maydell
Subject: Re: [PATCH for-7.1 v6 39/51] target/nios2: Implement Misaligned destination exception
Date: Thu, 17 Mar 2022 16:37:50 +0000

On Thu, 17 Mar 2022 at 05:36, Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Indirect branches, plus eret and bret optionally raise
> an exception when branching to a misaligned address.
> The exception is required when an mmu is enabled, but
> enable it always because the fallback behaviour is not
> documented (though presumably it discards low bits).
>
> For the purposes of the linux-user cpu loop, if EXCP_UNALIGN
> (misaligned data) were to arrive, it would be treated the
> same as EXCP_UNALIGND (misaligned destination).  See the
> !defined(CONFIG_NIOS2_ALIGNMENT_TRAP) block in kernel/traps.c.
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
>  linux-user/nios2/cpu_loop.c |  6 ++++++
>  target/nios2/op_helper.c    |  9 ++++++++-
>  target/nios2/translate.c    | 15 ++++++++++++++-
>  3 files changed, 28 insertions(+), 2 deletions(-)


> @@ -64,6 +64,13 @@ uint32_t helper_divu(CPUNios2State *env, uint32_t num, 
> uint32_t den)
>  void helper_eret(CPUNios2State *env, uint32_t new_status, uint32_t new_pc)
>  {
>      Nios2CPU *cpu = env_archcpu(env);
> +    CPUState *cs = env_cpu(env);
> +
> +    if (unlikely(new_pc & 3)) {
> +        env->ctrl[CR_BADADDR] = new_pc;
> +        cs->exception_index = EXCP_UNALIGND;
> +        cpu_loop_exit_restore(cs, GETPC());
> +    }
>
>      /*
>       * Both estatus and bstatus have no constraints on write;
> @@ -74,6 +81,6 @@ void helper_eret(CPUNios2State *env, uint32_t new_status, 
> uint32_t new_pc)
>
>      env->ctrl[CR_STATUS] = new_status;
>      env->pc = new_pc;
> -    cpu_loop_exit(env_cpu(env));
> +    cpu_loop_exit(cs);
>  }

The spec isn't clear about whether an unaligned-destination on
an eret is handled as "do the eret (ie restore status), then take
the exception when trying to set the new PC" or "take the exception
immediately" (ie whether it's always a nested exception, effectively).
I guess this is as good a guess as any.

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>

thanks
-- PMM



reply via email to

[Prev in Thread] Current Thread [Next in Thread]