This paves the way for upcoming changes. Signed-off-by: Emilio G. Cota <c...@braap.org> --- cpu-exec.c | 19 +++++++++++++++++++ include/exec/exec-all.h | 2 +- 2 files changed, 20 insertions(+), 1 deletion(-)
diff --git a/cpu-exec.c b/cpu-exec.c index 748cb66..ce9750a 100644 --- a/cpu-exec.c +++ b/cpu-exec.c @@ -309,6 +309,25 @@ static bool tb_cmp(const void *p, const void *d) return false; } +TranslationBlock *tb_from_jmp_cache(CPUArchState *env, target_ulong vaddr) +{ + CPUState *cpu = ENV_GET_CPU(env); + TranslationBlock *tb; + target_ulong cs_base, pc; + uint32_t flags; + + if (unlikely(atomic_read(&cpu->exit_request))) { + return NULL; + } + cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); + tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(vaddr)]); + if (likely(tb && tb->pc == vaddr && tb->cs_base == cs_base && + tb->flags == flags)) { + return tb; + } + return NULL; +} + static TranslationBlock *tb_htable_lookup(CPUState *cpu, target_ulong pc, target_ulong cs_base, diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h index bcde1e6..18b80bc 100644 --- a/include/exec/exec-all.h +++ b/include/exec/exec-all.h @@ -56,7 +56,6 @@ TranslationBlock *tb_gen_code(CPUState *cpu, target_ulong pc, target_ulong cs_base, uint32_t flags, int cflags); - void QEMU_NORETURN cpu_loop_exit(CPUState *cpu); void QEMU_NORETURN cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc); void QEMU_NORETURN cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc); @@ -368,6 +367,7 @@ struct TranslationBlock { void tb_free(TranslationBlock *tb); void tb_flush(CPUState *cpu); void tb_phys_invalidate(TranslationBlock *tb, tb_page_addr_t page_addr); +TranslationBlock *tb_from_jmp_cache(CPUArchState *env, target_ulong vaddr); #if defined(USE_DIRECT_JUMP) -- 2.7.4