2 * Plugin Shared Internal Functions
4 * Copyright (C) 2019, Linaro
6 * License: GNU GPL, version 2 or later.
7 * See the COPYING file in the top-level directory.
9 * SPDX-License-Identifier: GPL-2.0-or-later
18 #define QEMU_PLUGIN_MIN_VERSION 2
21 struct qemu_plugin_state
{
22 QTAILQ_HEAD(, qemu_plugin_ctx
) ctxs
;
23 QLIST_HEAD(, qemu_plugin_cb
) cb_lists
[QEMU_PLUGIN_EV_MAX
];
25 * Use the HT as a hash map by inserting k == v, which saves memory as
26 * documented by GLib. The parent struct is obtained with container_of().
30 * Use the HT as a hash map. Note that we could use a list here,
31 * but with the HT we avoid adding a field to CPUState.
34 QLIST_HEAD(, qemu_plugin_scoreboard
) scoreboards
;
35 size_t scoreboard_alloc_size
;
36 DECLARE_BITMAP(mask
, QEMU_PLUGIN_EV_MAX
);
38 * @lock protects the struct as well as ctx->uninstalling.
39 * The lock must be acquired by all API ops.
40 * The lock is recursive, which greatly simplifies things, e.g.
41 * callback registration from qemu_plugin_vcpu_for_each().
45 * HT of callbacks invoked from helpers. All entries are freed when
46 * the code cache is flushed.
48 struct qht dyn_cb_arr_ht
;
49 /* How many vcpus were started */
54 struct qemu_plugin_ctx
{
57 struct qemu_plugin_cb
*callbacks
[QEMU_PLUGIN_EV_MAX
];
58 QTAILQ_ENTRY(qemu_plugin_ctx
) entry
;
60 * keep a reference to @desc until uninstall, so that plugins do not have
61 * to strdup plugin args.
63 struct qemu_plugin_desc
*desc
;
69 struct qemu_plugin_ctx
*plugin_id_to_ctx_locked(qemu_plugin_id_t id
);
71 void plugin_register_inline_op_on_entry(GArray
**arr
,
72 enum qemu_plugin_mem_rw rw
,
73 enum qemu_plugin_op op
,
74 qemu_plugin_u64 entry
,
77 void plugin_reset_uninstall(qemu_plugin_id_t id
,
78 qemu_plugin_simple_cb_t cb
,
81 void plugin_register_cb(qemu_plugin_id_t id
, enum qemu_plugin_event ev
,
84 void plugin_unregister_cb__locked(struct qemu_plugin_ctx
*ctx
,
85 enum qemu_plugin_event ev
);
88 plugin_register_cb_udata(qemu_plugin_id_t id
, enum qemu_plugin_event ev
,
89 void *func
, void *udata
);
92 plugin_register_dyn_cb__udata(GArray
**arr
,
93 qemu_plugin_vcpu_udata_cb_t cb
,
94 enum qemu_plugin_cb_flags flags
, void *udata
);
97 plugin_register_dyn_cond_cb__udata(GArray
**arr
,
98 qemu_plugin_vcpu_udata_cb_t cb
,
99 enum qemu_plugin_cb_flags flags
,
100 enum qemu_plugin_cond cond
,
101 qemu_plugin_u64 entry
,
105 void plugin_register_vcpu_mem_cb(GArray
**arr
,
107 enum qemu_plugin_cb_flags flags
,
108 enum qemu_plugin_mem_rw rw
,
111 void exec_inline_op(enum plugin_dyn_cb_type type
,
112 struct qemu_plugin_inline_cb
*cb
,
115 int plugin_num_vcpus(void);
117 struct qemu_plugin_scoreboard
*plugin_scoreboard_new(size_t element_size
);
119 void plugin_scoreboard_free(struct qemu_plugin_scoreboard
*score
);
121 #endif /* PLUGIN_H */