[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for-7.1 v6 07/51] target/nios2: Fix BRET instruction
From: |
Richard Henderson |
Subject: |
[PATCH for-7.1 v6 07/51] target/nios2: Fix BRET instruction |
Date: |
Wed, 16 Mar 2022 22:04:54 -0700 |
We had failed to copy BSTATUS back to STATUS, and diagnose
supervisor-only. The spec is light on the specifics of the
implementation of bret, but it is an easy assumption that
the restore into STATUS should work the same as eret.
Therefore, reuse the existing helper_eret.
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Reported-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/nios2/translate.c | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/target/nios2/translate.c b/target/nios2/translate.c
index 7c2c430e99..3f7bbd6d7b 100644
--- a/target/nios2/translate.c
+++ b/target/nios2/translate.c
@@ -407,12 +407,22 @@ static void ret(DisasContext *dc, uint32_t code, uint32_t
flags)
dc->base.is_jmp = DISAS_JUMP;
}
-/* PC <- ba */
+/*
+ * status <- bstatus
+ * PC <- ba
+ */
static void bret(DisasContext *dc, uint32_t code, uint32_t flags)
{
- tcg_gen_mov_tl(cpu_pc, cpu_R[R_BA]);
+ if (!gen_check_supervisor(dc)) {
+ return;
+ }
- dc->base.is_jmp = DISAS_JUMP;
+#ifdef CONFIG_USER_ONLY
+ g_assert_not_reached();
+#else
+ gen_helper_eret(cpu_env, cpu_R[CR_BSTATUS], cpu_R[R_BA]);
+ dc->base.is_jmp = DISAS_NORETURN;
+#endif
}
/* PC <- rA */
--
2.25.1
- [PATCH for-7.1 v6 00/51] target/nios2: Shadow register set, EIC and VIC, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 01/51] tcg: Fix indirect lowering vs TCG_OPF_COND_BRANCH, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 03/51] target/nios2: Stop generating code if gen_check_supervisor fails, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 02/51] target/nios2: Check supervisor on eret, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 04/51] target/nios2: Add NUM_GP_REGS and NUM_CP_REGS, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 06/51] target/nios2: Split out helper for eret instruction, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 05/51] target/nios2: Split PC out of env->regs[], Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 07/51] target/nios2: Fix BRET instruction,
Richard Henderson <=
- [PATCH for-7.1 v6 08/51] target/nios2: Do not create TCGv for control registers, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 10/51] target/nios2: Remove cpu_interrupts_enabled, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 09/51] linux-user/nios2: Only initialize SP and PC in target_cpu_copy_regs, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 11/51] target/nios2: Split control registers away from general registers, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 12/51] target/nios2: Clean up nios2_cpu_dump_state, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 13/51] target/nios2: Use hw/registerfields.h for CR_STATUS fields, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 14/51] target/nios2: Use hw/registerfields.h for CR_EXCEPTION fields, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 15/51] target/nios2: Use hw/registerfields.h for CR_TLBADDR fields, Richard Henderson, 2022/03/17
- [PATCH for-7.1 v6 16/51] target/nios2: Use hw/registerfields.h for CR_TLBACC fields, Richard Henderson, 2022/03/17