[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 06/48] target/nios2: Fix BRET instruction
|
From: |
Richard Henderson |
|
Subject: |
[PATCH v5 06/48] target/nios2: Fix BRET instruction |
|
Date: |
Thu, 10 Mar 2022 03:26:43 -0800 |
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.
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 v5 00/48] target/nios2: Shadow register set, EIC and VIC, Richard Henderson, 2022/03/10
- [PATCH v5 02/48] target/nios2: Stop generating code if gen_check_supervisor fails, Richard Henderson, 2022/03/10
- [PATCH v5 01/48] target/nios2: Check supervisor on eret, Richard Henderson, 2022/03/10
- [PATCH v5 04/48] target/nios2: Split PC out of env->regs[], Richard Henderson, 2022/03/10
- [PATCH v5 03/48] target/nios2: Add NUM_GP_REGS and NUM_CP_REGS, Richard Henderson, 2022/03/10
- [PATCH v5 05/48] target/nios2: Split out helper for eret instruction, Richard Henderson, 2022/03/10
- [PATCH v5 06/48] target/nios2: Fix BRET instruction,
Richard Henderson <=
- [PATCH v5 07/48] target/nios2: Do not create TCGv for control registers, Richard Henderson, 2022/03/10
- [PATCH v5 08/48] linux-user/nios2: Only initialize SP and PC in target_cpu_copy_regs, Richard Henderson, 2022/03/10
- [PATCH v5 09/48] target/nios2: Remove cpu_interrupts_enabled, Richard Henderson, 2022/03/10
- [PATCH v5 13/48] target/nios2: Use hw/registerfields.h for CR_STATUS fields, Richard Henderson, 2022/03/10
- [PATCH v5 11/48] target/nios2: Do not zero the general registers on reset, Richard Henderson, 2022/03/10
- [PATCH v5 10/48] target/nios2: Split control registers away from general registers, Richard Henderson, 2022/03/10