[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
- [PATCH for-7.1 v6 28/51] target/nios2: Implement CR_STATUS.RSIE, (continued)
- [PATCH for-7.1 v6 28/51] target/nios2: Implement CR_STATUS.RSIE, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 30/51] target/nios2: Support division error exception, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 34/51] target/nios2: Enable unaligned traps for system mode, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 35/51] target/nios2: Create gen_jumpr, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 36/51] target/nios2: Hoist set of is_jmp into gen_goto_tb, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 39/51] target/nios2: Implement Misaligned destination exception, Richard Henderson, 2022/03/17
- Re: [PATCH for-7.1 v6 39/51] target/nios2: Implement Misaligned destination exception,
Peter Maydell <=
- [PATCH for-7.1 v6 38/51] target/nios2: Use tcg_gen_lookup_and_goto_ptr, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 40/51] linux-user/nios2: Handle various SIGILL exceptions, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 41/51] target/nios2: Introduce shadow register sets, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 42/51] target/nios2: Implement rdprs, wrprs, Richard Henderson, 2022/03/17