On Wed, Mar 16, 2022 at 5:26 AM Idan Horowitz <idan.horow...@gmail.com> wrote:
>
> If the pages which control the translation of the currently executing
> instructions are changed, and then the TLB is flushed using sfence.vma
> we have to exit the current TB early, to ensure we don't execute stale
> instructions.
>
> Signed-off-by: Idan Horowitz <idan.horow...@gmail.com>
Thanks!
Applied to riscv-to-apply.next
Alistair
> ---
> target/riscv/insn_trans/trans_privileged.c.inc | 7 +++++++
> 1 file changed, 7 insertions(+)
>
> diff --git a/target/riscv/insn_trans/trans_privileged.c.inc
> b/target/riscv/insn_trans/trans_privileged.c.inc
> index 53613682e8..f265e8202d 100644
> --- a/target/riscv/insn_trans/trans_privileged.c.inc
> +++ b/target/riscv/insn_trans/trans_privileged.c.inc
> @@ -114,6 +114,13 @@ static bool trans_sfence_vma(DisasContext *ctx,
> arg_sfence_vma *a)
> {
> #ifndef CONFIG_USER_ONLY
> gen_helper_tlb_flush(cpu_env);
> + /*
> + * The flush might have changed the backing physical memory of
> + * the instructions we're currently executing
> + */
> + gen_set_pc_imm(ctx, ctx->pc_succ_insn);
> + tcg_gen_exit_tb(NULL, 0);
> + ctx->base.is_jmp = DISAS_NORETURN;
> return true;
> #endif
> return false;
> --
> 2.35.1
>
>