qemu/include/exec/plugin-gen.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 * plugin-gen.h - TCG-dependent definitions for generating plugin code
   8 *
   9 * This header should be included only from plugin.c and C files that emit
  10 * TCG code.
  11 */
  12#ifndef QEMU_PLUGIN_GEN_H
  13#define QEMU_PLUGIN_GEN_H
  14
  15#include "exec/cpu_ldst.h"
  16#include "qemu/plugin.h"
  17#include "tcg/tcg.h"
  18
  19struct DisasContextBase;
  20
  21#ifdef CONFIG_PLUGIN
  22
  23bool plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db,
  24                         bool supress);
  25void plugin_gen_tb_end(CPUState *cpu);
  26void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db);
  27void plugin_gen_insn_end(void);
  28
  29void plugin_gen_disable_mem_helpers(void);
  30void plugin_gen_empty_mem_callback(TCGv addr, uint32_t info);
  31
  32static inline void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
  33{
  34    struct qemu_plugin_insn *insn = tcg_ctx->plugin_insn;
  35    abi_ptr off;
  36
  37    if (insn == NULL) {
  38        return;
  39    }
  40    off = pc - insn->vaddr;
  41    if (off < insn->data->len) {
  42        g_byte_array_set_size(insn->data, off);
  43    } else if (off > insn->data->len) {
  44        /* we have an unexpected gap */
  45        g_assert_not_reached();
  46    }
  47
  48    insn->data = g_byte_array_append(insn->data, from, size);
  49}
  50
  51#else /* !CONFIG_PLUGIN */
  52
  53static inline bool
  54plugin_gen_tb_start(CPUState *cpu, const struct DisasContextBase *db, bool sup)
  55{
  56    return false;
  57}
  58
  59static inline
  60void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db)
  61{ }
  62
  63static inline void plugin_gen_insn_end(void)
  64{ }
  65
  66static inline void plugin_gen_tb_end(CPUState *cpu)
  67{ }
  68
  69static inline void plugin_gen_disable_mem_helpers(void)
  70{ }
  71
  72static inline void plugin_gen_empty_mem_callback(TCGv addr, uint32_t info)
  73{ }
  74
  75static inline void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
  76{ }
  77
  78#endif /* CONFIG_PLUGIN */
  79
  80#endif /* QEMU_PLUGIN_GEN_H */
  81
  82