1
2
3
4
5
6
7
8
9
10
11
12#ifndef PLUGIN_H
13#define PLUGIN_H
14
15#include <gmodule.h>
16#include "qemu/queue.h"
17#include "qemu/qht.h"
18
19#define QEMU_PLUGIN_MIN_VERSION 2
20
21
22struct qemu_plugin_state {
23 QTAILQ_HEAD(, qemu_plugin_ctx) ctxs;
24 QLIST_HEAD(, qemu_plugin_cb) cb_lists[QEMU_PLUGIN_EV_MAX];
25
26
27
28
29 GHashTable *id_ht;
30
31
32
33
34 GHashTable *cpu_ht;
35 QLIST_HEAD(, qemu_plugin_scoreboard) scoreboards;
36 size_t scoreboard_alloc_size;
37 DECLARE_BITMAP(mask, QEMU_PLUGIN_EV_MAX);
38
39
40
41
42
43
44 QemuRecMutex lock;
45
46
47
48
49 struct qht dyn_cb_arr_ht;
50
51 int num_vcpus;
52};
53
54
55struct qemu_plugin_ctx {
56 GModule *handle;
57 qemu_plugin_id_t id;
58 struct qemu_plugin_cb *callbacks[QEMU_PLUGIN_EV_MAX];
59 QTAILQ_ENTRY(qemu_plugin_ctx) entry;
60
61
62
63
64 struct qemu_plugin_desc *desc;
65 bool installing;
66 bool uninstalling;
67 bool resetting;
68};
69
70struct qemu_plugin_ctx *plugin_id_to_ctx_locked(qemu_plugin_id_t id);
71
72void plugin_register_inline_op_on_entry(GArray **arr,
73 enum qemu_plugin_mem_rw rw,
74 enum qemu_plugin_op op,
75 qemu_plugin_u64 entry,
76 uint64_t imm);
77
78void plugin_reset_uninstall(qemu_plugin_id_t id,
79 qemu_plugin_simple_cb_t cb,
80 bool reset);
81
82void plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev,
83 void *func);
84
85void plugin_unregister_cb__locked(struct qemu_plugin_ctx *ctx,
86 enum qemu_plugin_event ev);
87
88void
89plugin_register_cb_udata(qemu_plugin_id_t id, enum qemu_plugin_event ev,
90 void *func, void *udata);
91
92void
93plugin_register_dyn_cb__udata(GArray **arr,
94 qemu_plugin_vcpu_udata_cb_t cb,
95 enum qemu_plugin_cb_flags flags, void *udata);
96
97void
98plugin_register_dyn_cond_cb__udata(GArray **arr,
99 qemu_plugin_vcpu_udata_cb_t cb,
100 enum qemu_plugin_cb_flags flags,
101 enum qemu_plugin_cond cond,
102 qemu_plugin_u64 entry,
103 uint64_t imm,
104 void *udata);
105
106void plugin_register_vcpu_mem_cb(GArray **arr,
107 void *cb,
108 enum qemu_plugin_cb_flags flags,
109 enum qemu_plugin_mem_rw rw,
110 void *udata);
111
112void exec_inline_op(enum plugin_dyn_cb_type type,
113 struct qemu_plugin_inline_cb *cb,
114 int cpu_index);
115
116int plugin_num_vcpus(void);
117
118struct qemu_plugin_scoreboard *plugin_scoreboard_new(size_t element_size);
119
120void plugin_scoreboard_free(struct qemu_plugin_scoreboard *score);
121
122
123
124
125
126void qemu_plugin_fillin_mode_info(qemu_info_t *info);
127
128#endif
129