|
@@ -27,6 +27,9 @@
|
|
#include "exec/helper-proto.h"
|
|
#include "exec/helper-proto.h"
|
|
#include "exec/cpu_ldst.h"
|
|
#include "exec/cpu_ldst.h"
|
|
#include "exec/exec-all.h"
|
|
#include "exec/exec-all.h"
|
|
|
|
+#include "exec/tb-hash.h"
|
|
|
|
+#include "disas/disas.h"
|
|
|
|
+#include "exec/log.h"
|
|
|
|
|
|
/* 32-bit helpers */
|
|
/* 32-bit helpers */
|
|
|
|
|
|
@@ -141,6 +144,35 @@ uint64_t HELPER(ctpop_i64)(uint64_t arg)
|
|
return ctpop64(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;
|
|
|
|
+
|
|
|
|
+ tb = atomic_rcu_read(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)]);
|
|
|
|
+ if (likely(tb)) {
|
|
|
|
+ cpu_get_tb_cpu_state(env, &pc, &cs_base, &flags);
|
|
|
|
+ if (likely(tb->pc == addr && tb->cs_base == cs_base &&
|
|
|
|
+ tb->flags == flags)) {
|
|
|
|
+ goto found;
|
|
|
|
+ }
|
|
|
|
+ tb = tb_htable_lookup(cpu, addr, cs_base, flags);
|
|
|
|
+ if (likely(tb)) {
|
|
|
|
+ atomic_set(&cpu->tb_jmp_cache[tb_jmp_cache_hash_func(addr)], tb);
|
|
|
|
+ goto found;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return tcg_ctx.code_gen_epilogue;
|
|
|
|
+ found:
|
|
|
|
+ qemu_log_mask_and_addr(CPU_LOG_EXEC, addr,
|
|
|
|
+ "Chain %p [%d: " TARGET_FMT_lx "] %s\n",
|
|
|
|
+ tb->tc_ptr, cpu->cpu_index, addr,
|
|
|
|
+ lookup_symbol(addr));
|
|
|
|
+ return tb->tc_ptr;
|
|
|
|
+}
|
|
|
|
+
|
|
void HELPER(exit_atomic)(CPUArchState *env)
|
|
void HELPER(exit_atomic)(CPUArchState *env)
|
|
{
|
|
{
|
|
cpu_loop_exit_atomic(ENV_GET_CPU(env), GETPC());
|
|
cpu_loop_exit_atomic(ENV_GET_CPU(env), GETPC());
|