|
From: | Richard Henderson |
Subject: | Re: [Qemu-devel] [PATCH v3 01/10] tcg-runtime: add lookup_tb_ptr helper |
Date: | Wed, 26 Apr 2017 10:40:45 +0200 |
User-agent: | Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.0 |
On 04/26/2017 08:23 AM, Emilio G. Cota wrote:
This paves the way for upcoming work. Reviewed-by: Richard Henderson <address@hidden> Signed-off-by: Emilio G. Cota <address@hidden> --- 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; + }
Paolo is right. This will also be checked by the first instructions of the TB and there's little point in repeating it here, especially if it is indeed unlikely.
+ 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)) {
This comparison is wrong. It will incorrectly reject a TB for i386 guest when CS_BASE != 0. You really want
tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)]); if (tb) { cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags); if (tb->pc == pc && tb->cs_base == cs_base && tb->flags == flags) { return tb->tc_ptr; } } return tcg_ctx.code_gen_epilogue;where you don't even load the cpu state if there isn't a preliminary hit in the cache. (Note to self: That minor optimization would also apply to tb_find.)
I also wonder, if we've gone this far, if we wouldn't go all the way and also check tb_htable_lookup.
r~
[Prev in Thread] | Current Thread | [Next in Thread] |