qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio
at master 51 lines 1.4 kB view raw
1/* 2 * Copyright (C) 2017, Emilio G. Cota <cota@braap.org> 3 * 4 * License: GNU GPL, version 2 or later. 5 * See the COPYING file in the top-level directory. 6 */ 7#ifndef EXEC_TB_LOOKUP_H 8#define EXEC_TB_LOOKUP_H 9 10#ifdef NEED_CPU_H 11#include "cpu.h" 12#else 13#include "exec/poison.h" 14#endif 15 16#include "exec/exec-all.h" 17#include "exec/tb-hash.h" 18 19/* Might cause an exception, so have a longjmp destination ready */ 20static inline TranslationBlock * 21tb_lookup__cpu_state(CPUState *cpu, target_ulong *pc, target_ulong *cs_base, 22 uint32_t *flags, uint32_t cf_mask) 23{ 24 CPUArchState *env = (CPUArchState *)cpu->env_ptr; 25 TranslationBlock *tb; 26 uint32_t hash; 27 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]); 31 32 cf_mask &= ~CF_CLUSTER_MASK; 33 cf_mask |= cpu->cluster_index << CF_CLUSTER_SHIFT; 34 35 if (likely(tb && 36 tb->pc == *pc && 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)) { 41 return tb; 42 } 43 tb = tb_htable_lookup(cpu, *pc, *cs_base, *flags, cf_mask); 44 if (tb == NULL) { 45 return NULL; 46 } 47 atomic_set(&cpu->tb_jmp_cache[hash], tb); 48 return tb; 49} 50 51#endif /* EXEC_TB_LOOKUP_H */