On Fri, 02 Jan 2026 23:47, Pierrick Bouvier <[email protected]> wrote:
This plugin uses endianness conversion primitives from QEMU headers. As
next commit will strongly isolate plugins code from those headers, those
primitives can't be used anymore.
glib.h provides such primitives:
https://docs.gtk.org/glib/conversion-macros.html#byte-order-conversion
Signed-off-by: Pierrick Bouvier <[email protected]>
---
Reviewed-by: Manos Pitsidianakis <[email protected]>
tests/tcg/plugins/mem.c | 59 ++++++++++++++++-------------------------
1 file changed, 23 insertions(+), 36 deletions(-)
diff --git a/tests/tcg/plugins/mem.c b/tests/tcg/plugins/mem.c
index 9649bce99ca..7d64e7018f2 100644
--- a/tests/tcg/plugins/mem.c
+++ b/tests/tcg/plugins/mem.c
@@ -12,16 +12,7 @@
#include <stdio.h>
#include <glib.h>
-/*
- * plugins should not include anything from QEMU aside from the
- * API header. However as this is a test plugin to exercise the
- * internals of QEMU and we want to avoid needless code duplication we
- * do so here. bswap.h is pretty self-contained although it needs a
- * few things provided by compiler.h.
- */
-#include <compiler.h>
#include <stdbool.h>
-#include <bswap.h>
#include <qemu-plugin.h>
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
@@ -152,56 +143,52 @@ static void update_region_info(uint64_t region, uint64_t
offset,
ri->reads++;
}
+ void *ri_data = &ri->data[offset];
switch (value.type) {
case QEMU_PLUGIN_MEM_VALUE_U8:
+ {
+ uint8_t val = value.data.u8;
+ uint8_t *p = ri_data;
if (is_store) {
- ri->data[offset] = value.data.u8;
- } else if (ri->data[offset] != value.data.u8) {
- unseen_data = true;
+ *p = val;
+ } else {
+ unseen_data = *p != val;
}
break;
+ }
case QEMU_PLUGIN_MEM_VALUE_U16:
{
- uint16_t *p = (uint16_t *) &ri->data[offset];
+ uint16_t val = be ? GUINT16_FROM_BE(value.data.u16) :
+ GUINT16_FROM_LE(value.data.u16);
+ uint16_t *p = ri_data;
if (is_store) {
- if (be) {
- stw_be_p(p, value.data.u16);
- } else {
- stw_le_p(p, value.data.u16);
- }
+ *p = val;
} else {
- uint16_t val = be ? lduw_be_p(p) : lduw_le_p(p);
- unseen_data = val != value.data.u16;
+ unseen_data = *p != val;
}
break;
}
case QEMU_PLUGIN_MEM_VALUE_U32:
{
- uint32_t *p = (uint32_t *) &ri->data[offset];
+ uint32_t val = be ? GUINT32_FROM_BE(value.data.u32) :
+ GUINT32_FROM_LE(value.data.u32);
+ uint32_t *p = ri_data;
if (is_store) {
- if (be) {
- stl_be_p(p, value.data.u32);
- } else {
- stl_le_p(p, value.data.u32);
- }
+ *p = val;
} else {
- uint32_t val = be ? ldl_be_p(p) : ldl_le_p(p);
- unseen_data = val != value.data.u32;
+ unseen_data = *p != val;
}
break;
}
case QEMU_PLUGIN_MEM_VALUE_U64:
{
- uint64_t *p = (uint64_t *) &ri->data[offset];
+ uint64_t val = be ? GUINT64_FROM_BE(value.data.u64) :
+ GUINT64_FROM_LE(value.data.u64);
+ uint64_t *p = ri_data;
if (is_store) {
- if (be) {
- stq_be_p(p, value.data.u64);
- } else {
- stq_le_p(p, value.data.u64);
- }
+ *p = val;
} else {
- uint64_t val = be ? ldq_be_p(p) : ldq_le_p(p);
- unseen_data = val != value.data.u64;
+ unseen_data = *p != val;
}
break;
}
--
2.47.3