On Fri, 02 Jan 2026 23:47, Pierrick Bouvier <pierrick.bouvier@linaro.org> 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 <pierrick.bouvier@linaro.org>
>---
Reviewed-by: Manos Pitsidianakis <manos.pitsidianakis@linaro.org>
> 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
>