On Sun, Sep 27, 2026 at 5:08 AM Richard Henderson
<[email protected]> wrote:
>
> Signed-off-by: Richard Henderson <[email protected]>
> ---
>  include/tcg/tcg-op-common.h  |   4 +-
>  include/tcg/tcg-op-mem.h     |   6 +-
>  include/tcg/tcg.h            |   2 +
>  include/tcg/tcg-op-def.h.inc |   1 +
>  tcg/tcg-op-ldst.c            | 164 ++++++++++++++---------------------
>  tcg/tcg-op.c                 |   4 +
>  6 files changed, 75 insertions(+), 106 deletions(-)
>
> diff --git a/include/tcg/tcg-op-common.h b/include/tcg/tcg-op-common.h
> index 583f6ebb2f5..fcbaae3def5 100644
> --- a/include/tcg/tcg-op-common.h
> +++ b/include/tcg/tcg-op-common.h
> @@ -177,11 +177,9 @@ void tcg_gen_st_i128(TCGv_i128 val, TCGv_ptr base, 
> tcg_target_long offset);
>
>  /* Local load/store bit ops */
>
> -void tcg_gen_qemu_ld_i32_chk(TCGv_i32, TCGTemp *, TCGArg, MemOp, TCGType);
> +void tcg_gen_qemu_ld_chk_i128(TCGv_i128, TCGTemp *, TCGArg, MemOp, TCGType);
>  void tcg_gen_qemu_st_i32_chk(TCGv_i32, TCGTemp *, TCGArg, MemOp, TCGType);
> -void tcg_gen_qemu_ld_i64_chk(TCGv_i64, TCGTemp *, TCGArg, MemOp, TCGType);
>  void tcg_gen_qemu_st_i64_chk(TCGv_i64, TCGTemp *, TCGArg, MemOp, TCGType);
> -void tcg_gen_qemu_ld_i128_chk(TCGv_i128, TCGTemp *, TCGArg, MemOp, TCGType);
>  void tcg_gen_qemu_st_i128_chk(TCGv_i128, TCGTemp *, TCGArg, MemOp, TCGType);
>
>  /* Atomic ops */
> diff --git a/include/tcg/tcg-op-mem.h b/include/tcg/tcg-op-mem.h
> index 29e7c02f256..76955d27c1f 100644
> --- a/include/tcg/tcg-op-mem.h
> +++ b/include/tcg/tcg-op-mem.h
> @@ -31,7 +31,7 @@ typedef TCGv_i64 TCGv_va;
>  QEMU_ARG_NONNULL static inline void
>  tcg_gen_qemu_ld_i32(TCGv_i32 v, TCGv_va a, TCGArg i, MemOp m)
>  {
> -    tcg_gen_qemu_ld_i32_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
> +    tcg_gen_qemu_ld_chk_i32(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
>  }
>
>  QEMU_ARG_NONNULL static inline void
> @@ -43,7 +43,7 @@ tcg_gen_qemu_st_i32(TCGv_i32 v, TCGv_va a, TCGArg i, MemOp 
> m)
>  QEMU_ARG_NONNULL static inline void
>  tcg_gen_qemu_ld_i64(TCGv_i64 v, TCGv_va a, TCGArg i, MemOp m)
>  {
> -    tcg_gen_qemu_ld_i64_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
> +    tcg_gen_qemu_ld_chk_i64(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
>  }
>
>  QEMU_ARG_NONNULL static inline void
> @@ -55,7 +55,7 @@ tcg_gen_qemu_st_i64(TCGv_i64 v, TCGv_va a, TCGArg i, MemOp 
> m)
>  QEMU_ARG_NONNULL static inline void
>  tcg_gen_qemu_ld_i128(TCGv_i128 v, TCGv_va a, TCGArg i, MemOp m)
>  {
> -    tcg_gen_qemu_ld_i128_chk(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
> +    tcg_gen_qemu_ld_chk_i128(v, tcgv_va_temp(a), i, m, TCG_TYPE_VA);
>  }
>
>  QEMU_ARG_NONNULL static inline void
> diff --git a/include/tcg/tcg.h b/include/tcg/tcg.h
> index 077a1b37021..fd719f9a36a 100644
> --- a/include/tcg/tcg.h
> +++ b/include/tcg/tcg.h
> @@ -293,6 +293,8 @@ typedef struct TCGTemp {
>      void *state_ptr;
>  } TCGTemp;
>
> +typedef TCGTemp *TCGTempPtr;
> +
>  typedef struct TCGContext TCGContext;
>
>  typedef struct TCGTempSet {
> diff --git a/include/tcg/tcg-op-def.h.inc b/include/tcg/tcg-op-def.h.inc
> index 556f7470cd6..e2da3ddef66 100644
> --- a/include/tcg/tcg-op-def.h.inc
> +++ b/include/tcg/tcg-op-def.h.inc
> @@ -53,6 +53,7 @@ DEF2(not, TCGV, TCGV)
>  DEF3(or, TCGV, TCGV, TCGV)
>  DEF3(ori, TCGV, TCGV, TINT)
>  DEF3(orc, TCGV, TCGV, TCGV)
> +DEF5(qemu_ld_chk, TCGV, TCGTempPtr, unsigned, MemOp, TCGType)
>  DEF3(rem, TCGV, TCGV, TCGV)
>  DEF3(remu, TCGV, TCGV, TCGV)
>  DEF2(revbit8, TCGV, TCGV)
> diff --git a/tcg/tcg-op-ldst.c b/tcg/tcg-op-ldst.c
> index 031c5ce926b..c48b8c0e3d1 100644
> --- a/tcg/tcg-op-ldst.c
> +++ b/tcg/tcg-op-ldst.c
> @@ -191,33 +191,37 @@ plugin_gen_mem_callbacks(TCGv_i64 copy_addr, TCGTemp 
> *orig_addr, MemOpIdx oi,
>  #endif
>
>  static void
> -plugin_gen_mem_callbacks_i32(TCGv_i32 val,
> +plugin_gen_mem_callbacks_tmp(TCGType type, TCGTemp *val,
>                               TCGv_i64 copy_addr, TCGTemp *orig_addr,
>                               MemOpIdx oi, enum qemu_plugin_mem_rw rw)
>  {
>  #ifdef CONFIG_PLUGIN
>      if (tcg_ctx->plugin_insn != NULL) {
> -        tcg_gen_st_i32(val, tcg_env,
> -                       offsetof(CPUState, neg.plugin_mem_value_low) -
> -                       sizeof(CPUState) + (HOST_BIG_ENDIAN * 4));
> +        tcg_gen_st(type, val, tcgv_ptr_temp(tcg_env),
> +                   offsetof(CPUState, neg.plugin_mem_value_low)
> +                   - sizeof(CPUState)
> +                   + (HOST_BIG_ENDIAN && type == TCG_TYPE_I32 ? 4 : 0));
>          plugin_gen_mem_callbacks(copy_addr, orig_addr, oi, rw);
>      }
>  #endif
>  }
>
> +static void
> +plugin_gen_mem_callbacks_i32(TCGv_i32 val,
> +                             TCGv_i64 copy_addr, TCGTemp *orig_addr,
> +                             MemOpIdx oi, enum qemu_plugin_mem_rw rw)
> +{
> +    plugin_gen_mem_callbacks_tmp(TCG_TYPE_I32, tcgv_i32_temp(val), copy_addr,
> +                                 orig_addr, oi, rw);
> +}
> +
>  static void
>  plugin_gen_mem_callbacks_i64(TCGv_i64 val,
>                               TCGv_i64 copy_addr, TCGTemp *orig_addr,
>                               MemOpIdx oi, enum qemu_plugin_mem_rw rw)
>  {
> -#ifdef CONFIG_PLUGIN
> -    if (tcg_ctx->plugin_insn != NULL) {
> -        tcg_gen_st_i64(val, tcg_env,
> -                       offsetof(CPUState, neg.plugin_mem_value_low) -
> -                       sizeof(CPUState));
> -        plugin_gen_mem_callbacks(copy_addr, orig_addr, oi, rw);
> -    }
> -#endif
> +    plugin_gen_mem_callbacks_tmp(TCG_TYPE_I64, tcgv_i64_temp(val), copy_addr,
> +                                 orig_addr, oi, rw);
>  }
>
>  static void
> @@ -238,8 +242,31 @@ plugin_gen_mem_callbacks_i128(TCGv_i128 val,
>  #endif
>  }
>
> -static void tcg_gen_qemu_ld_i32_int(TCGv_i32 val, TCGTemp *addr,
> -                                    TCGArg idx, MemOp memop)
> +static void tcg_gen_bswap(TCGType type, TCGTemp *dst,
> +                          TCGTemp *src, unsigned flags, MemOp memop)
> +{
> +    switch (memop & MO_SIZE) {
> +    case MO_16:
> +        tcg_gen_bswap16(type, src, dst, flags);

src and dst are swapped. The load path in this patch avoids this being
a problem because the same argument is passed for both src and dst,
but 098 has a path that ends up byte swapping an uninitialized value.

Reply via email to