accel/tcg: Pass TCGTBCPUState to tb_lookup

Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
Richard Henderson 2025-04-29 12:13:18 -07:00
parent c37f8978d9
commit b46357db32

View file

@ -232,35 +232,33 @@ static TranslationBlock *tb_htable_lookup(CPUState *cpu, vaddr pc,
* *
* Returns: an existing translation block or NULL. * Returns: an existing translation block or NULL.
*/ */
static inline TranslationBlock *tb_lookup(CPUState *cpu, vaddr pc, static inline TranslationBlock *tb_lookup(CPUState *cpu, TCGTBCPUState s)
uint64_t cs_base, uint32_t flags,
uint32_t cflags)
{ {
TranslationBlock *tb; TranslationBlock *tb;
CPUJumpCache *jc; CPUJumpCache *jc;
uint32_t hash; uint32_t hash;
/* we should never be trying to look up an INVALID tb */ /* we should never be trying to look up an INVALID tb */
tcg_debug_assert(!(cflags & CF_INVALID)); tcg_debug_assert(!(s.cflags & CF_INVALID));
hash = tb_jmp_cache_hash_func(pc); hash = tb_jmp_cache_hash_func(s.pc);
jc = cpu->tb_jmp_cache; jc = cpu->tb_jmp_cache;
tb = qatomic_read(&jc->array[hash].tb); tb = qatomic_read(&jc->array[hash].tb);
if (likely(tb && if (likely(tb &&
jc->array[hash].pc == pc && jc->array[hash].pc == s.pc &&
tb->cs_base == cs_base && tb->cs_base == s.cs_base &&
tb->flags == flags && tb->flags == s.flags &&
tb_cflags(tb) == cflags)) { tb_cflags(tb) == s.cflags)) {
goto hit; goto hit;
} }
tb = tb_htable_lookup(cpu, pc, cs_base, flags, cflags); tb = tb_htable_lookup(cpu, s.pc, s.cs_base, s.flags, s.cflags);
if (tb == NULL) { if (tb == NULL) {
return NULL; return NULL;
} }
jc->array[hash].pc = pc; jc->array[hash].pc = s.pc;
qatomic_set(&jc->array[hash].tb, tb); qatomic_set(&jc->array[hash].tb, tb);
hit: hit:
@ -268,7 +266,7 @@ hit:
* As long as tb is not NULL, the contents are consistent. Therefore, * As long as tb is not NULL, the contents are consistent. Therefore,
* the virtual PC has to match for non-CF_PCREL translations. * the virtual PC has to match for non-CF_PCREL translations.
*/ */
assert((tb_cflags(tb) & CF_PCREL) || tb->pc == pc); assert((tb_cflags(tb) & CF_PCREL) || tb->pc == s.pc);
return tb; return tb;
} }
@ -402,7 +400,7 @@ const void *HELPER(lookup_tb_ptr)(CPUArchState *env)
cpu_loop_exit(cpu); cpu_loop_exit(cpu);
} }
tb = tb_lookup(cpu, s.pc, s.cs_base, s.flags, s.cflags); tb = tb_lookup(cpu, s);
if (tb == NULL) { if (tb == NULL) {
return tcg_code_gen_epilogue; return tcg_code_gen_epilogue;
} }
@ -581,7 +579,7 @@ void cpu_exec_step_atomic(CPUState *cpu)
* Any breakpoint for this insn will have been recognized earlier. * Any breakpoint for this insn will have been recognized earlier.
*/ */
tb = tb_lookup(cpu, s.pc, s.cs_base, s.flags, s.cflags); tb = tb_lookup(cpu, s);
if (tb == NULL) { if (tb == NULL) {
mmap_lock(); mmap_lock();
tb = tb_gen_code(cpu, s.pc, s.cs_base, s.flags, s.cflags); tb = tb_gen_code(cpu, s.pc, s.cs_base, s.flags, s.cflags);
@ -955,7 +953,7 @@ cpu_exec_loop(CPUState *cpu, SyncClocks *sc)
break; break;
} }
tb = tb_lookup(cpu, s.pc, s.cs_base, s.flags, s.cflags); tb = tb_lookup(cpu, s);
if (tb == NULL) { if (tb == NULL) {
CPUJumpCache *jc; CPUJumpCache *jc;
uint32_t h; uint32_t h;