[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v7 18/64] target/nios2: Fix BRET instruction
From: |
Richard Henderson |
Subject: |
[PATCH v7 18/64] target/nios2: Fix BRET instruction |
Date: |
Thu, 21 Apr 2022 08:16:49 -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 53699ee088..3694f2503b 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.34.1
- [PATCH v7 09/64] target/nios2: Remove user-only nios2_cpu_do_interrupt, (continued)
- [PATCH v7 09/64] target/nios2: Remove user-only nios2_cpu_do_interrupt, Richard Henderson, 2022/04/21
- [PATCH v7 08/64] tests/tcg/nios2: Re-enable linux-user tests, Richard Henderson, 2022/04/21
- [PATCH v7 10/64] target/nios2: Remove nios2_cpu_record_sigsegv, Richard Henderson, 2022/04/21
- [PATCH v7 11/64] target/nios2: Build helper.c for system only, Richard Henderson, 2022/04/21
- [PATCH v7 12/64] linux-user/nios2: Use force_sig_fault for EXCP_DEBUG, Richard Henderson, 2022/04/21
- [PATCH v7 13/64] target/nios2: Check supervisor on eret, Richard Henderson, 2022/04/21
- [PATCH v7 14/64] target/nios2: Stop generating code if gen_check_supervisor fails, Richard Henderson, 2022/04/21
- [PATCH v7 15/64] target/nios2: Add NUM_GP_REGS and NUM_CP_REGS, Richard Henderson, 2022/04/21
- [PATCH v7 16/64] target/nios2: Split PC out of env->regs[], Richard Henderson, 2022/04/21
- [PATCH v7 17/64] target/nios2: Split out helper for eret instruction, Richard Henderson, 2022/04/21
- [PATCH v7 18/64] target/nios2: Fix BRET instruction,
Richard Henderson <=
- [PATCH v7 19/64] target/nios2: Do not create TCGv for control registers, Richard Henderson, 2022/04/21
- [PATCH v7 20/64] linux-user/nios2: Only initialize SP and PC in target_cpu_copy_regs, Richard Henderson, 2022/04/21
- [PATCH v7 23/64] target/nios2: Clean up nios2_cpu_dump_state, Richard Henderson, 2022/04/21
- [PATCH v7 22/64] target/nios2: Split control registers away from general registers, Richard Henderson, 2022/04/21
- [PATCH v7 24/64] target/nios2: Use hw/registerfields.h for CR_STATUS fields, Richard Henderson, 2022/04/21
- [PATCH v7 25/64] target/nios2: Use hw/registerfields.h for CR_EXCEPTION fields, Richard Henderson, 2022/04/21
- [PATCH v7 21/64] target/nios2: Remove cpu_interrupts_enabled, Richard Henderson, 2022/04/21
- [PATCH v7 26/64] target/nios2: Use hw/registerfields.h for CR_TLBADDR fields, Richard Henderson, 2022/04/21
- [PATCH v7 27/64] target/nios2: Use hw/registerfields.h for CR_TLBACC fields, Richard Henderson, 2022/04/21
- [PATCH v7 28/64] target/nios2: Rename CR_TLBMISC_WR to CR_TLBMISC_WE, Richard Henderson, 2022/04/21