qemu/include/exec/tb-lookup.h
<<
>>
Prefs
   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#include "qemu/osdep.h"
  11
  12#ifdef NEED_CPU_H
  13#include "cpu.h"
  14#else
  15#include "exec/poison.h"
  16#endif
  17
  18#include "exec/exec-all.h"
  19#include "exec/tb-hash.h"
  20
  21/* Might cause an exception, so have a longjmp destination ready */
  22static inline TranslationBlock *
  23tb_lookup__cpu_state(CPUState *cpu, target_ulong *pc, target_ulong *cs_base,
  24                     uint32_t *flags, uint32_t cf_mask)
  25{
  26    CPUArchState *env = (CPUArchState *)cpu->env_ptr;
  27    TranslationBlock *tb;
  28    uint32_t hash;
  29
  30    cpu_get_tb_cpu_state(env, pc, cs_base, flags);
  31    hash = tb_jmp_cache_hash_func(*pc);
  32    tb = atomic_rcu_read(&cpu->tb_jmp_cache[hash]);
  33    if (likely(tb &&
  34               tb->pc == *pc &&
  35               tb->cs_base == *cs_base &&
  36               tb->flags == *flags &&
  37               tb->trace_vcpu_dstate == *cpu->trace_dstate &&
  38               (tb_cflags(tb) & (CF_HASH_MASK | CF_INVALID)) == cf_mask)) {
  39        return tb;
  40    }
  41    tb = tb_htable_lookup(cpu, *pc, *cs_base, *flags, cf_mask);
  42    if (tb == NULL) {
  43        return NULL;
  44    }
  45    atomic_set(&cpu->tb_jmp_cache[hash], tb);
  46    return tb;
  47}
  48
  49#endif /* EXEC_TB_LOOKUP_H */
  50