2 * Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
4 * License: GNU GPL, version 2 or later.
5 * See the COPYING file in the top-level directory.
7 #ifndef EXEC_TB_LOOKUP_H
8 #define EXEC_TB_LOOKUP_H
13 #include "exec/poison.h"
16 #include "exec/exec-all.h"
17 #include "exec/tb-hash.h"
19 /* Might cause an exception, so have a longjmp destination ready */
20 static inline TranslationBlock
*
21 tb_lookup__cpu_state(CPUState
*cpu
, target_ulong
*pc
, target_ulong
*cs_base
,
22 uint32_t *flags
, uint32_t cf_mask
)
24 CPUArchState
*env
= (CPUArchState
*)cpu
->env_ptr
;
28 cpu_get_tb_cpu_state(env
, pc
, cs_base
, flags
);
29 hash
= tb_jmp_cache_hash_func(*pc
);
30 tb
= atomic_rcu_read(&cpu
->tb_jmp_cache
[hash
]);
32 cf_mask
&= ~CF_CLUSTER_MASK
;
33 cf_mask
|= cpu
->cluster_index
<< CF_CLUSTER_SHIFT
;
37 tb
->cs_base
== *cs_base
&&
38 tb
->flags
== *flags
&&
39 tb
->trace_vcpu_dstate
== *cpu
->trace_dstate
&&
40 (tb_cflags(tb
) & (CF_HASH_MASK
| CF_INVALID
)) == cf_mask
)) {
43 tb
= tb_htable_lookup(cpu
, *pc
, *cs_base
, *flags
, cf_mask
);
47 atomic_set(&cpu
->tb_jmp_cache
[hash
], tb
);
51 #endif /* EXEC_TB_LOOKUP_H */