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.
