target/nios2: Fix BRET instruction

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>
Message-Id: <20220421151735.31996-19-richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2022-04-21 08:16:49 -07:00
parent 8d855c89d1
commit 48da43b258
1 changed files with 13 additions and 3 deletions

View File

@ -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 */