|
@@ -338,12 +338,26 @@ void plugin_register_dyn_cb__udata(GArray **arr,
|
|
enum qemu_plugin_cb_flags flags,
|
|
enum qemu_plugin_cb_flags flags,
|
|
void *udata)
|
|
void *udata)
|
|
{
|
|
{
|
|
- struct qemu_plugin_dyn_cb *dyn_cb = plugin_get_dyn_cb(arr);
|
|
|
|
|
|
+ static TCGHelperInfo info[3] = {
|
|
|
|
+ [QEMU_PLUGIN_CB_NO_REGS].flags = TCG_CALL_NO_RWG | TCG_CALL_PLUGIN,
|
|
|
|
+ [QEMU_PLUGIN_CB_R_REGS].flags = TCG_CALL_NO_WG | TCG_CALL_PLUGIN,
|
|
|
|
+ [QEMU_PLUGIN_CB_RW_REGS].flags = TCG_CALL_PLUGIN,
|
|
|
|
+ /*
|
|
|
|
+ * Match qemu_plugin_vcpu_udata_cb_t:
|
|
|
|
+ * void (*)(uint32_t, void *)
|
|
|
|
+ */
|
|
|
|
+ [0 ... 2].typemask = (dh_typemask(void, 0) |
|
|
|
|
+ dh_typemask(i32, 1) |
|
|
|
|
+ dh_typemask(ptr, 2))
|
|
|
|
+ };
|
|
|
|
|
|
|
|
+ struct qemu_plugin_dyn_cb *dyn_cb = plugin_get_dyn_cb(arr);
|
|
dyn_cb->userp = udata;
|
|
dyn_cb->userp = udata;
|
|
- /* Note flags are discarded as unused. */
|
|
|
|
- dyn_cb->regular.f.vcpu_udata = cb;
|
|
|
|
dyn_cb->type = PLUGIN_CB_REGULAR;
|
|
dyn_cb->type = PLUGIN_CB_REGULAR;
|
|
|
|
+ dyn_cb->regular.f.vcpu_udata = cb;
|
|
|
|
+
|
|
|
|
+ assert((unsigned)flags < ARRAY_SIZE(info));
|
|
|
|
+ dyn_cb->regular.info = &info[flags];
|
|
}
|
|
}
|
|
|
|
|
|
void plugin_register_vcpu_mem_cb(GArray **arr,
|
|
void plugin_register_vcpu_mem_cb(GArray **arr,
|
|
@@ -352,14 +366,39 @@ void plugin_register_vcpu_mem_cb(GArray **arr,
|
|
enum qemu_plugin_mem_rw rw,
|
|
enum qemu_plugin_mem_rw rw,
|
|
void *udata)
|
|
void *udata)
|
|
{
|
|
{
|
|
- struct qemu_plugin_dyn_cb *dyn_cb;
|
|
|
|
|
|
+ /*
|
|
|
|
+ * Expect that the underlying type for enum qemu_plugin_meminfo_t
|
|
|
|
+ * is either int32_t or uint32_t, aka int or unsigned int.
|
|
|
|
+ */
|
|
|
|
+ QEMU_BUILD_BUG_ON(
|
|
|
|
+ !__builtin_types_compatible_p(qemu_plugin_meminfo_t, uint32_t) &&
|
|
|
|
+ !__builtin_types_compatible_p(qemu_plugin_meminfo_t, int32_t));
|
|
|
|
+
|
|
|
|
+ static TCGHelperInfo info[3] = {
|
|
|
|
+ [QEMU_PLUGIN_CB_NO_REGS].flags = TCG_CALL_NO_RWG | TCG_CALL_PLUGIN,
|
|
|
|
+ [QEMU_PLUGIN_CB_R_REGS].flags = TCG_CALL_NO_WG | TCG_CALL_PLUGIN,
|
|
|
|
+ [QEMU_PLUGIN_CB_RW_REGS].flags = TCG_CALL_PLUGIN,
|
|
|
|
+ /*
|
|
|
|
+ * Match qemu_plugin_vcpu_mem_cb_t:
|
|
|
|
+ * void (*)(uint32_t, qemu_plugin_meminfo_t, uint64_t, void *)
|
|
|
|
+ */
|
|
|
|
+ [0 ... 2].typemask =
|
|
|
|
+ (dh_typemask(void, 0) |
|
|
|
|
+ dh_typemask(i32, 1) |
|
|
|
|
+ (__builtin_types_compatible_p(qemu_plugin_meminfo_t, uint32_t)
|
|
|
|
+ ? dh_typemask(i32, 2) : dh_typemask(s32, 2)) |
|
|
|
|
+ dh_typemask(i64, 3) |
|
|
|
|
+ dh_typemask(ptr, 4))
|
|
|
|
+ };
|
|
|
|
|
|
- dyn_cb = plugin_get_dyn_cb(arr);
|
|
|
|
|
|
+ struct qemu_plugin_dyn_cb *dyn_cb = plugin_get_dyn_cb(arr);
|
|
dyn_cb->userp = udata;
|
|
dyn_cb->userp = udata;
|
|
- /* Note flags are discarded as unused. */
|
|
|
|
dyn_cb->type = PLUGIN_CB_REGULAR;
|
|
dyn_cb->type = PLUGIN_CB_REGULAR;
|
|
dyn_cb->rw = rw;
|
|
dyn_cb->rw = rw;
|
|
dyn_cb->regular.f.vcpu_mem = cb;
|
|
dyn_cb->regular.f.vcpu_mem = cb;
|
|
|
|
+
|
|
|
|
+ assert((unsigned)flags < ARRAY_SIZE(info));
|
|
|
|
+ dyn_cb->regular.info = &info[flags];
|
|
}
|
|
}
|
|
|
|
|
|
/*
|
|
/*
|