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 "qemu/plugin.h"
  16#include "tcg/tcg.h"
  17
  18struct DisasContextBase;
  19
  20#ifdef CONFIG_PLUGIN
  21
  22bool plugin_gen_tb_start(CPUState *cpu, const TranslationBlock *tb, bool supress);
  23void plugin_gen_tb_end(CPUState *cpu);
  24void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db);
  25void plugin_gen_insn_end(void);
  26
  27void plugin_gen_disable_mem_helpers(void);
  28void plugin_gen_empty_mem_callback(TCGv addr, uint32_t info);
  29
  30static inline void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
  31{
  32    struct qemu_plugin_insn *insn = tcg_ctx->plugin_insn;
  33    abi_ptr off;
  34
  35    if (insn == NULL) {
  36        return;
  37    }
  38    off = pc - insn->vaddr;
  39    if (off < insn->data->len) {
  40        g_byte_array_set_size(insn->data, off);
  41    } else if (off > insn->data->len) {
  42        /* we have an unexpected gap */
  43        g_assert_not_reached();
  44    }
  45
  46    insn->data = g_byte_array_append(insn->data, from, size);
  47}
  48
  49#else /* !CONFIG_PLUGIN */
  50
  51static inline
  52bool plugin_gen_tb_start(CPUState *cpu, const TranslationBlock *tb, bool supress)
  53{
  54    return false;
  55}
  56
  57static inline
  58void plugin_gen_insn_start(CPUState *cpu, const struct DisasContextBase *db)
  59{ }
  60
  61static inline void plugin_gen_insn_end(void)
  62{ }
  63
  64static inline void plugin_gen_tb_end(CPUState *cpu)
  65{ }
  66
  67static inline void plugin_gen_disable_mem_helpers(void)
  68{ }
  69
  70static inline void plugin_gen_empty_mem_callback(TCGv addr, uint32_t info)
  71{ }
  72
  73static inline void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
  74{ }
  75
  76#endif /* CONFIG_PLUGIN */
  77
  78#endif /* QEMU_PLUGIN_GEN_H */
  79
  80