public inbox for qemu-devel@nongnu.org
 help / color / mirror / Atom feed
* [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value()
@ 2026-03-25  2:42 Pierrick Bouvier
  2026-03-25  2:42 ` [PATCH 1/3] tcg: Pass host-endian values to plugin_gen_mem_callbacks_* Pierrick Bouvier
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25  2:42 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, Mahmoud Mandour, Alex Bennée,
	Pierrick Bouvier, Alexandre Iooss

This series fixes qemu_plugin_mem_get_value() endianness on non x64 hosts.
As well, it updates documentation to make clear that value returned is in
host-endian order. Finally, it fixes tests/tcg/plugins/mem.c.

Pierrick Bouvier (2):
  include/plugins/qemu-plugin.h: add note about endianness of value
    returned by qemu_plugin_mem_get_value
  tests/tcg/plugins/mem.c: fix endian swap in update_region_info

Richard Henderson (1):
  tcg: Pass host-endian values to plugin_gen_mem_callbacks_*

 include/plugins/qemu-plugin.h |  5 ++--
 tcg/tcg-op-ldst.c             | 52 ++++++++++++++++++-----------------
 tests/tcg/plugins/mem.c       | 12 ++++----
 3 files changed, 36 insertions(+), 33 deletions(-)

-- 
2.47.3



^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH 1/3] tcg: Pass host-endian values to plugin_gen_mem_callbacks_*
  2026-03-25  2:42 [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
@ 2026-03-25  2:42 ` Pierrick Bouvier
  2026-03-25  2:42 ` [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value Pierrick Bouvier
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25  2:42 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, Mahmoud Mandour, Alex Bennée,
	Pierrick Bouvier, Alexandre Iooss

From: Richard Henderson <richard.henderson@linaro.org>

If the host does not support swapped-endian loads and stores,
then we emulate those within the tcg expanders with explicit
bswap operations.

However, we were passing values to the plugin interface in
the middle of those bswap operations, which meant that we
would pass values of the wrong endianness to plugins when
running on hosts without swapped-endian loads and stores.

Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/3351
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Tested-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 tcg/tcg-op-ldst.c | 52 ++++++++++++++++++++++++-----------------------
 1 file changed, 27 insertions(+), 25 deletions(-)

diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
index 354d9968f92..22211ccb452 100644
--- a/tcg/tcg-op-ldst.c
+++ b/tcg/tcg-op-ldst.c
@@ -262,9 +262,6 @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
     addr_new = tci_extend_addr(addr);
     copy_addr = plugin_maybe_preserve_addr(addr);
     gen_ldst1(INDEX_op_qemu_ld, TCG_TYPE_I32, tcgv_i32_temp(val), addr_new, oi);
-    plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,
-                                 QEMU_PLUGIN_MEM_R);
-    maybe_free_addr(addr, addr_new);
 
     if ((orig_memop ^ memop) & MO_BSWAP) {
         switch (orig_memop & MO_SIZE) {
@@ -280,6 +277,10 @@ static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
             g_assert_not_reached();
         }
     }
+
+    plugin_gen_mem_callbacks_i32(val, copy_addr, addr, orig_oi,
+                                 QEMU_PLUGIN_MEM_R);
+    maybe_free_addr(addr, addr_new);
 }
 
 void tcg_gen_qemu_ld_i32_chk(TCGv_i32 val, TCGTemp *addr, TCGArg idx,
@@ -290,10 +291,10 @@ void tcg_gen_qemu_ld_i32_chk(TCGv_i32 val, TCGTemp *addr, TCGArg idx,
     tcg_gen_qemu_ld_i32_int(val, addr, idx, memop);
 }
 
-static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,
+static void tcg_gen_qemu_st_i32_int(TCGv_i32 orig_val, TCGTemp *addr,
                                     TCGArg idx, MemOp memop)
 {
-    TCGv_i32 swap = NULL;
+    TCGv_i32 val = orig_val;
     MemOpIdx orig_oi, oi;
     TCGTemp *addr_new;
 
@@ -302,29 +303,29 @@ static void tcg_gen_qemu_st_i32_int(TCGv_i32 val, TCGTemp *addr,
     orig_oi = oi = make_memop_idx(memop, idx);
 
     if ((memop & MO_BSWAP) && !tcg_target_has_memory_bswap(memop)) {
-        swap = tcg_temp_ebb_new_i32();
+        val = tcg_temp_ebb_new_i32();
         switch (memop & MO_SIZE) {
         case MO_16:
-            tcg_gen_bswap16_i32(swap, val, 0);
+            tcg_gen_bswap16_i32(val, orig_val, 0);
             break;
         case MO_32:
-            tcg_gen_bswap32_i32(swap, val);
+            tcg_gen_bswap32_i32(val, orig_val);
             break;
         default:
             g_assert_not_reached();
         }
-        val = swap;
         memop &= ~MO_BSWAP;
         oi = make_memop_idx(memop, idx);
     }
 
     addr_new = tci_extend_addr(addr);
     gen_ldst1(INDEX_op_qemu_st, TCG_TYPE_I32, tcgv_i32_temp(val), addr_new, oi);
-    plugin_gen_mem_callbacks_i32(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);
+    plugin_gen_mem_callbacks_i32(orig_val, NULL, addr, orig_oi,
+                                 QEMU_PLUGIN_MEM_W);
     maybe_free_addr(addr, addr_new);
 
-    if (swap) {
-        tcg_temp_free_i32(swap);
+    if (val != orig_val) {
+        tcg_temp_free_i32(val);
     }
 }
 
@@ -360,9 +361,6 @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr,
     addr_new = tci_extend_addr(addr);
     copy_addr = plugin_maybe_preserve_addr(addr);
     gen_ld_i64(val, addr_new, oi);
-    plugin_gen_mem_callbacks_i64(val, copy_addr, addr, orig_oi,
-                                 QEMU_PLUGIN_MEM_R);
-    maybe_free_addr(addr, addr_new);
 
     if ((orig_memop ^ memop) & MO_BSWAP) {
         int flags = (orig_memop & MO_SIGN
@@ -382,6 +380,10 @@ static void tcg_gen_qemu_ld_i64_int(TCGv_i64 val, TCGTemp *addr,
             g_assert_not_reached();
         }
     }
+
+    plugin_gen_mem_callbacks_i64(val, copy_addr, addr, orig_oi,
+                                 QEMU_PLUGIN_MEM_R);
+    maybe_free_addr(addr, addr_new);
 }
 
 void tcg_gen_qemu_ld_i64_chk(TCGv_i64 val, TCGTemp *addr, TCGArg idx,
@@ -392,10 +394,10 @@ void tcg_gen_qemu_ld_i64_chk(TCGv_i64 val, TCGTemp *addr, TCGArg idx,
     tcg_gen_qemu_ld_i64_int(val, addr, idx, memop);
 }
 
-static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr,
+static void tcg_gen_qemu_st_i64_int(TCGv_i64 orig_val, TCGTemp *addr,
                                     TCGArg idx, MemOp memop)
 {
-    TCGv_i64 swap = NULL;
+    TCGv_i64 val = orig_val;
     MemOpIdx orig_oi, oi;
     TCGTemp *addr_new;
 
@@ -404,32 +406,32 @@ static void tcg_gen_qemu_st_i64_int(TCGv_i64 val, TCGTemp *addr,
     orig_oi = oi = make_memop_idx(memop, idx);
 
     if ((memop & MO_BSWAP) && !tcg_target_has_memory_bswap(memop)) {
-        swap = tcg_temp_ebb_new_i64();
+        val = tcg_temp_ebb_new_i64();
         switch (memop & MO_SIZE) {
         case MO_16:
-            tcg_gen_bswap16_i64(swap, val, 0);
+            tcg_gen_bswap16_i64(val, orig_val, 0);
             break;
         case MO_32:
-            tcg_gen_bswap32_i64(swap, val, 0);
+            tcg_gen_bswap32_i64(val, orig_val, 0);
             break;
         case MO_64:
-            tcg_gen_bswap64_i64(swap, val);
+            tcg_gen_bswap64_i64(val, orig_val);
             break;
         default:
             g_assert_not_reached();
         }
-        val = swap;
         memop &= ~MO_BSWAP;
         oi = make_memop_idx(memop, idx);
     }
 
     addr_new = tci_extend_addr(addr);
     gen_st_i64(val, addr_new, oi);
-    plugin_gen_mem_callbacks_i64(val, NULL, addr, orig_oi, QEMU_PLUGIN_MEM_W);
+    plugin_gen_mem_callbacks_i64(orig_val, NULL, addr, orig_oi,
+                                 QEMU_PLUGIN_MEM_W);
     maybe_free_addr(addr, addr_new);
 
-    if (swap) {
-        tcg_temp_free_i64(swap);
+    if (val != orig_val) {
+        tcg_temp_free_i64(val);
     }
 }
 
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value
  2026-03-25  2:42 [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
  2026-03-25  2:42 ` [PATCH 1/3] tcg: Pass host-endian values to plugin_gen_mem_callbacks_* Pierrick Bouvier
@ 2026-03-25  2:42 ` Pierrick Bouvier
  2026-03-25 15:17   ` Alex Bennée
  2026-03-25  2:42 ` [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info Pierrick Bouvier
  2026-03-25 21:53 ` [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
  3 siblings, 1 reply; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25  2:42 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, Mahmoud Mandour, Alex Bennée,
	Pierrick Bouvier, Alexandre Iooss

Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 include/plugins/qemu-plugin.h | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
index 2ce7a7fb6c3..4eb1d2cd85c 100644
--- a/include/plugins/qemu-plugin.h
+++ b/include/plugins/qemu-plugin.h
@@ -374,7 +374,8 @@ enum qemu_plugin_mem_value_type {
  *
  * @type: the memory access size
  * @data: the value accessed during the memory operation (value after
- *        read/write)
+ *        read/write). It's directly stored following host endianness, so no
+ *        further swap is needed.
  */
 typedef struct {
     enum qemu_plugin_mem_value_type type;
@@ -682,7 +683,7 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
  * qemu_plugin_mem_get_value() - return last value loaded/stored
  * @info: opaque memory transaction handle
  *
- * Returns: memory value
+ * Returns: memory value in host-endian order (no further swap is necessary).
  */
 QEMU_PLUGIN_API
 qemu_plugin_mem_value qemu_plugin_mem_get_value(qemu_plugin_meminfo_t info);
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info
  2026-03-25  2:42 [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
  2026-03-25  2:42 ` [PATCH 1/3] tcg: Pass host-endian values to plugin_gen_mem_callbacks_* Pierrick Bouvier
  2026-03-25  2:42 ` [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value Pierrick Bouvier
@ 2026-03-25  2:42 ` Pierrick Bouvier
  2026-03-25 15:20   ` Alex Bennée
  2026-03-25 21:53 ` [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
  3 siblings, 1 reply; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25  2:42 UTC (permalink / raw)
  To: qemu-devel
  Cc: Richard Henderson, Mahmoud Mandour, Alex Bennée,
	Pierrick Bouvier, Alexandre Iooss

value returned by qemu_plugin_mem_get_value() is always in host-endian
order, so we need to convert TO target endianness and not FROM it.

Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 tests/tcg/plugins/mem.c | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/tests/tcg/plugins/mem.c b/tests/tcg/plugins/mem.c
index 1ee257f855b..6b0732dc0fd 100644
--- a/tests/tcg/plugins/mem.c
+++ b/tests/tcg/plugins/mem.c
@@ -154,20 +154,20 @@ static void update_region_info(uint64_t region, uint64_t offset,
         val_size = 1;
         break;
     case QEMU_PLUGIN_MEM_VALUE_U16:
-        swapped_value.data.u16 = be ? GUINT16_FROM_BE(value.data.u16) :
-            GUINT16_FROM_LE(value.data.u16);
+        swapped_value.data.u16 = be ? GUINT16_TO_BE(value.data.u16) :
+            GUINT16_TO_LE(value.data.u16);
         val_ptr = &swapped_value.data.u16;
         val_size = 2;
         break;
     case QEMU_PLUGIN_MEM_VALUE_U32:
-        swapped_value.data.u32 = be ? GUINT32_FROM_BE(value.data.u32) :
-            GUINT32_FROM_LE(value.data.u32);
+        swapped_value.data.u32 = be ? GUINT32_TO_BE(value.data.u32) :
+            GUINT32_TO_LE(value.data.u32);
         val_ptr = &swapped_value.data.u32;
         val_size = 4;
         break;
     case QEMU_PLUGIN_MEM_VALUE_U64:
-        swapped_value.data.u64 = be ? GUINT64_FROM_BE(value.data.u64) :
-            GUINT64_FROM_LE(value.data.u64);
+        swapped_value.data.u64 = be ? GUINT64_TO_BE(value.data.u64) :
+            GUINT64_TO_LE(value.data.u64);
         val_ptr = &swapped_value.data.u64;
         val_size = 8;
         break;
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value
  2026-03-25  2:42 ` [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value Pierrick Bouvier
@ 2026-03-25 15:17   ` Alex Bennée
  2026-03-25 15:23     ` Pierrick Bouvier
  0 siblings, 1 reply; 9+ messages in thread
From: Alex Bennée @ 2026-03-25 15:17 UTC (permalink / raw)
  To: Pierrick Bouvier
  Cc: qemu-devel, Richard Henderson, Mahmoud Mandour, Alexandre Iooss

Pierrick Bouvier <pierrick.bouvier@linaro.org> writes:

> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
> ---
>  include/plugins/qemu-plugin.h | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
> index 2ce7a7fb6c3..4eb1d2cd85c 100644
> --- a/include/plugins/qemu-plugin.h
> +++ b/include/plugins/qemu-plugin.h
> @@ -374,7 +374,8 @@ enum qemu_plugin_mem_value_type {
>   *
>   * @type: the memory access size
>   * @data: the value accessed during the memory operation (value after
> - *        read/write)
> + *        read/write). It's directly stored following host endianness, so no
> + *        further swap is needed.
>   */
>  typedef struct {
>      enum qemu_plugin_mem_value_type type;
> @@ -682,7 +683,7 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
>   * qemu_plugin_mem_get_value() - return last value loaded/stored
>   * @info: opaque memory transaction handle
>   *
> - * Returns: memory value
> + * Returns: memory value in host-endian order (no further swap is necessary).
>   */
>  QEMU_PLUGIN_API
>  qemu_plugin_mem_value qemu_plugin_mem_get_value(qemu_plugin_meminfo_t info);

I'd be tempted to fold this into the change that makes it happen in 1/3.

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info
  2026-03-25  2:42 ` [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info Pierrick Bouvier
@ 2026-03-25 15:20   ` Alex Bennée
  2026-03-25 15:25     ` Pierrick Bouvier
  0 siblings, 1 reply; 9+ messages in thread
From: Alex Bennée @ 2026-03-25 15:20 UTC (permalink / raw)
  To: Pierrick Bouvier
  Cc: qemu-devel, Richard Henderson, Mahmoud Mandour, Alexandre Iooss

Pierrick Bouvier <pierrick.bouvier@linaro.org> writes:

> value returned by qemu_plugin_mem_get_value() is always in host-endian
> order, so we need to convert TO target endianness and not FROM it.
>
> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>

Reviewed-by: Alex Bennée <alex.bennee@linaro.org>

> ---
>  tests/tcg/plugins/mem.c | 12 ++++++------
>  1 file changed, 6 insertions(+), 6 deletions(-)
>
> diff --git a/tests/tcg/plugins/mem.c b/tests/tcg/plugins/mem.c
> index 1ee257f855b..6b0732dc0fd 100644
> --- a/tests/tcg/plugins/mem.c
> +++ b/tests/tcg/plugins/mem.c
> @@ -154,20 +154,20 @@ static void update_region_info(uint64_t region, uint64_t offset,
>          val_size = 1;
>          break;
>      case QEMU_PLUGIN_MEM_VALUE_U16:
> -        swapped_value.data.u16 = be ? GUINT16_FROM_BE(value.data.u16) :
> -            GUINT16_FROM_LE(value.data.u16);
> +        swapped_value.data.u16 = be ? GUINT16_TO_BE(value.data.u16) :
> +            GUINT16_TO_LE(value.data.u16);
>          val_ptr = &swapped_value.data.u16;
>          val_size = 2;
>          break;
>      case QEMU_PLUGIN_MEM_VALUE_U32:
> -        swapped_value.data.u32 = be ? GUINT32_FROM_BE(value.data.u32) :
> -            GUINT32_FROM_LE(value.data.u32);
> +        swapped_value.data.u32 = be ? GUINT32_TO_BE(value.data.u32) :
> +            GUINT32_TO_LE(value.data.u32);
>          val_ptr = &swapped_value.data.u32;
>          val_size = 4;
>          break;
>      case QEMU_PLUGIN_MEM_VALUE_U64:
> -        swapped_value.data.u64 = be ? GUINT64_FROM_BE(value.data.u64) :
> -            GUINT64_FROM_LE(value.data.u64);
> +        swapped_value.data.u64 = be ? GUINT64_TO_BE(value.data.u64) :
> +            GUINT64_TO_LE(value.data.u64);
>          val_ptr = &swapped_value.data.u64;
>          val_size = 8;
>          break;

-- 
Alex Bennée
Virtualisation Tech Lead @ Linaro


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value
  2026-03-25 15:17   ` Alex Bennée
@ 2026-03-25 15:23     ` Pierrick Bouvier
  0 siblings, 0 replies; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25 15:23 UTC (permalink / raw)
  To: Alex Bennée
  Cc: qemu-devel, Richard Henderson, Mahmoud Mandour, Alexandre Iooss

On 3/25/26 8:17 AM, Alex Bennée wrote:
> Pierrick Bouvier <pierrick.bouvier@linaro.org> writes:
> 
>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
>> ---
>>   include/plugins/qemu-plugin.h | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h
>> index 2ce7a7fb6c3..4eb1d2cd85c 100644
>> --- a/include/plugins/qemu-plugin.h
>> +++ b/include/plugins/qemu-plugin.h
>> @@ -374,7 +374,8 @@ enum qemu_plugin_mem_value_type {
>>    *
>>    * @type: the memory access size
>>    * @data: the value accessed during the memory operation (value after
>> - *        read/write)
>> + *        read/write). It's directly stored following host endianness, so no
>> + *        further swap is needed.
>>    */
>>   typedef struct {
>>       enum qemu_plugin_mem_value_type type;
>> @@ -682,7 +683,7 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
>>    * qemu_plugin_mem_get_value() - return last value loaded/stored
>>    * @info: opaque memory transaction handle
>>    *
>> - * Returns: memory value
>> + * Returns: memory value in host-endian order (no further swap is necessary).
>>    */
>>   QEMU_PLUGIN_API
>>   qemu_plugin_mem_value qemu_plugin_mem_get_value(qemu_plugin_meminfo_t info);
> 
> I'd be tempted to fold this into the change that makes it happen in 1/3.
> 

It was already supposed to be the behavior (x64 host did the right thing 
by accident since it skips swap operation and rely on moveb), and other 
host architectures had a bug that went unnoticed until recently.

Regards,
Pierrick


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info
  2026-03-25 15:20   ` Alex Bennée
@ 2026-03-25 15:25     ` Pierrick Bouvier
  0 siblings, 0 replies; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25 15:25 UTC (permalink / raw)
  To: Alex Bennée
  Cc: qemu-devel, Richard Henderson, Mahmoud Mandour, Alexandre Iooss

On 3/25/26 8:20 AM, Alex Bennée wrote:
> Pierrick Bouvier <pierrick.bouvier@linaro.org> writes:
> 
>> value returned by qemu_plugin_mem_get_value() is always in host-endian
>> order, so we need to convert TO target endianness and not FROM it.
>>
>> Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
> 
> Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
> 
>> ---
>>   tests/tcg/plugins/mem.c | 12 ++++++------
>>   1 file changed, 6 insertions(+), 6 deletions(-)
>>

As a complement, GUINT*_FROM_* and GUINT*_TO_* do the same thing (they 
both swap value). The FROM/TO name simply acts as a documentation when 
reading the code. That's why it was working before as expected, even 
though it was sending the wrong hint for the reader.

Regards,
Pierrick


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value()
  2026-03-25  2:42 [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
                   ` (2 preceding siblings ...)
  2026-03-25  2:42 ` [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info Pierrick Bouvier
@ 2026-03-25 21:53 ` Pierrick Bouvier
  3 siblings, 0 replies; 9+ messages in thread
From: Pierrick Bouvier @ 2026-03-25 21:53 UTC (permalink / raw)
  To: qemu-devel, qemu-stable, Michael Tokarev
  Cc: Richard Henderson, Mahmoud Mandour, Alex Bennée,
	Alexandre Iooss

On 3/24/26 7:42 PM, Pierrick Bouvier wrote:
> This series fixes qemu_plugin_mem_get_value() endianness on non x64 hosts.
> As well, it updates documentation to make clear that value returned is in
> host-endian order. Finally, it fixes tests/tcg/plugins/mem.c.
> 
> Pierrick Bouvier (2):
>    include/plugins/qemu-plugin.h: add note about endianness of value
>      returned by qemu_plugin_mem_get_value
>    tests/tcg/plugins/mem.c: fix endian swap in update_region_info
> 
> Richard Henderson (1):
>    tcg: Pass host-endian values to plugin_gen_mem_callbacks_*
> 
>   include/plugins/qemu-plugin.h |  5 ++--
>   tcg/tcg-op-ldst.c             | 52 ++++++++++++++++++-----------------
>   tests/tcg/plugins/mem.c       | 12 ++++----
>   3 files changed, 36 insertions(+), 33 deletions(-)
> 

This series is a good candidate for stable also.

Thanks,
Pierrick


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-03-25 21:53 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-03-25  2:42 [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier
2026-03-25  2:42 ` [PATCH 1/3] tcg: Pass host-endian values to plugin_gen_mem_callbacks_* Pierrick Bouvier
2026-03-25  2:42 ` [PATCH 2/3] include/plugins/qemu-plugin.h: add note about endianness of value returned by qemu_plugin_mem_get_value Pierrick Bouvier
2026-03-25 15:17   ` Alex Bennée
2026-03-25 15:23     ` Pierrick Bouvier
2026-03-25  2:42 ` [PATCH 3/3] tests/tcg/plugins/mem.c: fix endian swap in update_region_info Pierrick Bouvier
2026-03-25 15:20   ` Alex Bennée
2026-03-25 15:25     ` Pierrick Bouvier
2026-03-25 21:53 ` [PATCH 0/3] plugins: fix endianness for qemu_plugin_mem_get_value() Pierrick Bouvier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox