On 26/04/2017 12:29, Alex Bennée wrote: > > Emilio G. Cota <c...@braap.org> writes: > >> This paves the way for upcoming work. >> >> Reviewed-by: Richard Henderson <r...@twiddle.net> >> Signed-off-by: Emilio G. Cota <c...@braap.org> >> --- >> tcg-runtime.c | 21 +++++++++++++++++++++ >> tcg/tcg-runtime.h | 2 ++ >> tcg/tcg.h | 1 + >> 3 files changed, 24 insertions(+) >> >> diff --git a/tcg-runtime.c b/tcg-runtime.c >> index 4c60c96..90d2d4b 100644 >> --- a/tcg-runtime.c >> +++ b/tcg-runtime.c >> @@ -27,6 +27,7 @@ >> #include "exec/helper-proto.h" >> #include "exec/cpu_ldst.h" >> #include "exec/exec-all.h" >> +#include "exec/tb-hash.h" >> >> /* 32-bit helpers */ >> >> @@ -141,6 +142,26 @@ uint64_t HELPER(ctpop_i64)(uint64_t arg) >> return ctpop64(arg); >> } >> >> +void *HELPER(lookup_tb_ptr)(CPUArchState *env, target_ulong addr) >> +{ >> + CPUState *cpu = ENV_GET_CPU(env); >> + TranslationBlock *tb; >> + target_ulong cs_base, pc; >> + uint32_t flags; >> + >> + if (unlikely(atomic_read(&cpu->exit_request))) { >> + goto out_epilogue; >> + } >> + cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); >> + tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)]); >> + if (likely(tb && tb->pc == addr && tb->cs_base == cs_base && >> + tb->flags == flags)) { > > Should we also not be checking the TB hasn't been invalidated: tb->invalid?
It's not needed because this lookup is (if I understand it right) once only and is not reused later. This is why tb_find doesn't check tb->invalid, but uses it to avoid adding the TB to the chain. Good: tb_find tb_phys_invalidate tb_lock tb->invalid = true lookup cache cache hit tb_unlock tb_lock tb->invalid? yes, skip tb_add_jump tb_unlock execute tb once Bad (doesn't happen): tb_find tb_phys_invalidate tb_lock tb->invalid = true lookup cache cache hit tb_unlock tb_lock tb_add_jump tb_unlock execute tb many times Paolo >> + return tb->tc_ptr; >> + } >> + out_epilogue: >> + return tcg_ctx.code_gen_epilogue; >> +} >> + >> void HELPER(exit_atomic)(CPUArchState *env) >> { >> cpu_loop_exit_atomic(ENV_GET_CPU(env), GETPC()); >> diff --git a/tcg/tcg-runtime.h b/tcg/tcg-runtime.h >> index 114ea6f..c41d38a 100644 >> --- a/tcg/tcg-runtime.h >> +++ b/tcg/tcg-runtime.h >> @@ -24,6 +24,8 @@ DEF_HELPER_FLAGS_1(clrsb_i64, TCG_CALL_NO_RWG_SE, i64, i64) >> DEF_HELPER_FLAGS_1(ctpop_i32, TCG_CALL_NO_RWG_SE, i32, i32) >> DEF_HELPER_FLAGS_1(ctpop_i64, TCG_CALL_NO_RWG_SE, i64, i64) >> >> +DEF_HELPER_FLAGS_2(lookup_tb_ptr, TCG_CALL_NO_WG_SE, ptr, env, tl) >> + >> DEF_HELPER_FLAGS_1(exit_atomic, TCG_CALL_NO_WG, noreturn, env) >> >> #ifdef CONFIG_SOFTMMU >> diff --git a/tcg/tcg.h b/tcg/tcg.h >> index 6c216bb..5ec48d1 100644 >> --- a/tcg/tcg.h >> +++ b/tcg/tcg.h >> @@ -699,6 +699,7 @@ struct TCGContext { >> extension that allows arithmetic on void*. */ >> int code_gen_max_blocks; >> void *code_gen_prologue; >> + void *code_gen_epilogue; >> void *code_gen_buffer; >> size_t code_gen_buffer_size; >> void *code_gen_ptr; > > > -- > Alex Bennée >