mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
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:
@@ -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 */
|
||||
|
||||
Reference in New Issue
Block a user