Emit the yield_needed reset from gen_yield() before calling gen_helper_exception() for EXCP_YIELD. This keeps the state change at the Xtensa icount-yield call site instead of adding EXCP_YIELD-specific behavior to the generic exception helper.
Signed-off-by: Yonggang Luo <[email protected]> --- target/xtensa/cpu.h | 2 +- target/xtensa/exc_helper.c | 3 --- target/xtensa/translate.c | 8 +++++--- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h index 49d6ad9083d..cab2df43709 100644 --- a/target/xtensa/cpu.h +++ b/target/xtensa/cpu.h @@ -541,7 +541,7 @@ struct CPUArchState { uint32_t ccount_base; #endif - int yield_needed; + int32_t yield_needed; unsigned static_vectors; /* Watchpoints for DBREAK registers */ diff --git a/target/xtensa/exc_helper.c b/target/xtensa/exc_helper.c index 7cb67d179a8..793761a698f 100644 --- a/target/xtensa/exc_helper.c +++ b/target/xtensa/exc_helper.c @@ -40,9 +40,6 @@ void HELPER(exception)(CPUXtensaState *env, uint32_t excp) CPUState *cs = env_cpu(env); cs->exception_index = excp; - if (excp == EXCP_YIELD) { - env->yield_needed = 0; - } cpu_loop_exit(cs); } diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c index 175fd4b5cfc..db48f0c562a 100644 --- a/target/xtensa/translate.c +++ b/target/xtensa/translate.c @@ -303,9 +303,11 @@ static void gen_left_shift_sar(DisasContext *dc, TCGv_i32 sa) dc->sar_m32_5bit = true; } -static void gen_exception(DisasContext *dc, int excp) +static void gen_yield(DisasContext *dc) { - gen_helper_exception(tcg_env, tcg_constant_i32(excp)); + tcg_gen_st_i32(tcg_constant_i32(0), tcg_env, + offsetof(CPUXtensaState, yield_needed)); + gen_helper_exception(tcg_env, tcg_constant_i32(EXCP_YIELD)); } static void gen_exception_cause(DisasContext *dc, uint32_t cause) @@ -1167,7 +1169,7 @@ static void xtensa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu) but this is the first TranslateOps hook that allows exiting. */ if ((tb_cflags(dc->base.tb) & CF_USE_ICOUNT) && (dc->base.tb->flags & XTENSA_TBFLAG_YIELD)) { - gen_exception(dc, EXCP_YIELD); + gen_yield(dc); dc->base.pc_next = dc->pc + 1; dc->base.is_jmp = DISAS_NORETURN; return; -- 2.52.0.windows.1
