PLUGIN_CB_INLINE_STORE_U64,
};
+struct qemu_plugin_regular_cb {
+ union qemu_plugin_cb_sig f;
+ TCGHelperInfo *info;
+ void *userp;
+ enum qemu_plugin_mem_rw rw;
+};
+
+struct qemu_plugin_inline_cb {
+ qemu_plugin_u64 entry;
+ enum qemu_plugin_op op;
+ uint64_t imm;
+ enum qemu_plugin_mem_rw rw;
+};
+
+struct qemu_plugin_conditional_cb {
+ union qemu_plugin_cb_sig f;
+ TCGHelperInfo *info;
+ void *userp;
+ qemu_plugin_u64 entry;
+ enum qemu_plugin_cond cond;
+ uint64_t imm;
+};
+
/*
* A dynamic callback has an insertion point that is determined at run-time.
* Usually the insertion point is somewhere in the code cache; think for
* instance of a callback to be called upon the execution of a particular TB.
*/
struct qemu_plugin_dyn_cb {
- void *userp;
enum plugin_dyn_cb_type type;
- /* @rw applies to mem callbacks only (both regular and inline) */
- enum qemu_plugin_mem_rw rw;
- /* fields specific to each dyn_cb type go here */
union {
- struct {
- union qemu_plugin_cb_sig f;
- TCGHelperInfo *info;
- } regular;
- struct {
- union qemu_plugin_cb_sig f;
- TCGHelperInfo *info;
- qemu_plugin_u64 entry;
- enum qemu_plugin_cond cond;
- uint64_t imm;
- } cond;
- struct {
- qemu_plugin_u64 entry;
- enum qemu_plugin_op op;
- uint64_t imm;
- } inline_insn;
+ struct qemu_plugin_regular_cb regular;
+ struct qemu_plugin_conditional_cb cond;
+ struct qemu_plugin_inline_cb inline_insn;
};
};