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:
parent
8d855c89d1
commit
48da43b258
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user