Skip to content

Commit

Permalink
target/sh4: Disable decode_gusa when plugins enabled
Browse files Browse the repository at this point in the history
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Message-Id: <20230824181233.1568795-3-richard.henderson@linaro.org>
[AJB: fixed s/cpu_env/tcg_env/ during re-base]
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
Message-Id: <20231009164104.369749-22-alex.bennee@linaro.org>
  • Loading branch information
rth7680 authored and stsquad committed Oct 11, 2023
1 parent 28a4f0b commit 4f9ef4e
Showing 1 changed file with 29 additions and 12 deletions.
41 changes: 29 additions & 12 deletions target/sh4/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -1816,6 +1816,18 @@ static void decode_opc(DisasContext * ctx)
}

#ifdef CONFIG_USER_ONLY
/*
* Restart with the EXCLUSIVE bit set, within a TB run via
* cpu_exec_step_atomic holding the exclusive lock.
*/
static void gen_restart_exclusive(DisasContext *ctx)
{
ctx->envflags |= TB_FLAG_GUSA_EXCLUSIVE;
gen_save_cpu_state(ctx, false);
gen_helper_exclusive(tcg_env);
ctx->base.is_jmp = DISAS_NORETURN;
}

/* For uniprocessors, SH4 uses optimistic restartable atomic sequences.
Upon an interrupt, a real kernel would simply notice magic values in
the registers and reset the PC to the start of the sequence.
Expand Down Expand Up @@ -2149,12 +2161,7 @@ static void decode_gusa(DisasContext *ctx, CPUSH4State *env)
qemu_log_mask(LOG_UNIMP, "Unrecognized gUSA sequence %08x-%08x\n",
pc, pc_end);

/* Restart with the EXCLUSIVE bit set, within a TB run via
cpu_exec_step_atomic holding the exclusive lock. */
ctx->envflags |= TB_FLAG_GUSA_EXCLUSIVE;
gen_save_cpu_state(ctx, false);
gen_helper_exclusive(tcg_env);
ctx->base.is_jmp = DISAS_NORETURN;
gen_restart_exclusive(ctx);

/* We're not executing an instruction, but we must report one for the
purposes of accounting within the TB. We might as well report the
Expand Down Expand Up @@ -2242,12 +2249,22 @@ static void sh4_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
#ifdef CONFIG_USER_ONLY
if (unlikely(ctx->envflags & TB_FLAG_GUSA_MASK)
&& !(ctx->envflags & TB_FLAG_GUSA_EXCLUSIVE)) {
/* We're in an gUSA region, and we have not already fallen
back on using an exclusive region. Attempt to parse the
region into a single supported atomic operation. Failure
is handled within the parser by raising an exception to
retry using an exclusive region. */
decode_gusa(ctx, env);
/*
* We're in an gUSA region, and we have not already fallen
* back on using an exclusive region. Attempt to parse the
* region into a single supported atomic operation. Failure
* is handled within the parser by raising an exception to
* retry using an exclusive region.
*
* Parsing the region in one block conflicts with plugins,
* so always use exclusive mode if plugins enabled.
*/
if (ctx->base.plugin_enabled) {
gen_restart_exclusive(ctx);
ctx->base.pc_next += 2;
} else {
decode_gusa(ctx, env);
}
return;
}
#endif
Expand Down

0 comments on commit 4f9ef4e

Please sign in to comment.