On Wed, Oct 15, 2025 at 6:39 AM Anton Johansson via <[email protected]> wrote: > > As ssp holds a pointer, fix to 64 bits in size and make sure stores from > TCG use the correct size to avoid problems on big endian hosts. > > Note, the cpu/ssp VMSTATE version is bumped, breaking migration from > older versions. > > Signed-off-by: Anton Johansson <[email protected]> > Reviewed-by: Pierrick Bouvier <[email protected]>
Acked-by: Alistair Francis <[email protected]> Alistair > --- > target/riscv/cpu.h | 2 +- > target/riscv/machine.c | 6 +++--- > target/riscv/insn_trans/trans_rvzicfiss.c.inc | 18 +++++++++++++----- > 3 files changed, 17 insertions(+), 9 deletions(-) > > diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h > index d7a41e6db5..2a71393118 100644 > --- a/target/riscv/cpu.h > +++ b/target/riscv/cpu.h > @@ -255,7 +255,7 @@ struct CPUArchState { > /* elp state for zicfilp extension */ > bool elp; > /* shadow stack register for zicfiss extension */ > - target_ulong ssp; > + uint64_t ssp; > /* env place holder for extra word 2 during unwind */ > target_ulong excp_uw2; > /* sw check code for sw check exception */ > diff --git a/target/riscv/machine.c b/target/riscv/machine.c > index 1cf744c5f0..c55794c554 100644 > --- a/target/riscv/machine.c > +++ b/target/riscv/machine.c > @@ -390,11 +390,11 @@ static bool ssp_needed(void *opaque) > > static const VMStateDescription vmstate_ssp = { > .name = "cpu/ssp", > - .version_id = 1, > - .minimum_version_id = 1, > + .version_id = 2, > + .minimum_version_id = 2, > .needed = ssp_needed, > .fields = (const VMStateField[]) { > - VMSTATE_UINTTL(env.ssp, RISCVCPU), > + VMSTATE_UINT64(env.ssp, RISCVCPU), > VMSTATE_END_OF_LIST() > } > }; > diff --git a/target/riscv/insn_trans/trans_rvzicfiss.c.inc > b/target/riscv/insn_trans/trans_rvzicfiss.c.inc > index f4a1c12ca0..fa1489037d 100644 > --- a/target/riscv/insn_trans/trans_rvzicfiss.c.inc > +++ b/target/riscv/insn_trans/trans_rvzicfiss.c.inc > @@ -32,7 +32,9 @@ static bool trans_sspopchk(DisasContext *ctx, arg_sspopchk > *a) > TCGLabel *skip = gen_new_label(); > uint32_t tmp = (get_xl(ctx) == MXL_RV64) ? 8 : 4; > TCGv data = tcg_temp_new(); > - tcg_gen_ld_tl(addr, tcg_env, offsetof(CPURISCVState, ssp)); > + TCGv_i64 wide_addr = tcg_temp_new_i64(); > + tcg_gen_ld_i64(wide_addr, tcg_env, offsetof(CPURISCVState, ssp)); > + tcg_gen_trunc_i64_tl(addr, wide_addr); > decode_save_opc(ctx, RISCV_UW2_ALWAYS_STORE_AMO); > tcg_gen_qemu_ld_tl(data, addr, SS_MMU_INDEX(ctx), > mxl_memop(ctx) | MO_ALIGN); > @@ -45,7 +47,8 @@ static bool trans_sspopchk(DisasContext *ctx, arg_sspopchk > *a) > tcg_constant_i32(RISCV_EXCP_SW_CHECK)); > gen_set_label(skip); > tcg_gen_addi_tl(addr, addr, tmp); > - tcg_gen_st_tl(addr, tcg_env, offsetof(CPURISCVState, ssp)); > + tcg_gen_ext_tl_i64(wide_addr, addr); > + tcg_gen_st_i64(wide_addr, tcg_env, offsetof(CPURISCVState, ssp)); > > return true; > } > @@ -59,12 +62,15 @@ static bool trans_sspush(DisasContext *ctx, arg_sspush *a) > TCGv addr = tcg_temp_new(); > int tmp = (get_xl(ctx) == MXL_RV64) ? -8 : -4; > TCGv data = get_gpr(ctx, a->rs2, EXT_NONE); > + TCGv_i64 wide_addr = tcg_temp_new_i64(); > decode_save_opc(ctx, RISCV_UW2_ALWAYS_STORE_AMO); > - tcg_gen_ld_tl(addr, tcg_env, offsetof(CPURISCVState, ssp)); > + tcg_gen_ld_i64(wide_addr, tcg_env, offsetof(CPURISCVState, ssp)); > + tcg_gen_trunc_i64_tl(addr, wide_addr); > tcg_gen_addi_tl(addr, addr, tmp); > tcg_gen_qemu_st_tl(data, addr, SS_MMU_INDEX(ctx), > mxl_memop(ctx) | MO_ALIGN); > - tcg_gen_st_tl(addr, tcg_env, offsetof(CPURISCVState, ssp)); > + tcg_gen_ext_tl_i64(wide_addr, addr); > + tcg_gen_st_i64(wide_addr, tcg_env, offsetof(CPURISCVState, ssp)); > > return true; > } > @@ -76,7 +82,9 @@ static bool trans_ssrdp(DisasContext *ctx, arg_ssrdp *a) > } > > TCGv dest = dest_gpr(ctx, a->rd); > - tcg_gen_ld_tl(dest, tcg_env, offsetof(CPURISCVState, ssp)); > + TCGv_i64 wide_addr = tcg_temp_new_i64(); > + tcg_gen_ld_i64(wide_addr, tcg_env, offsetof(CPURISCVState, ssp)); > + tcg_gen_trunc_i64_tl(dest, wide_addr); > gen_set_gpr(ctx, a->rd, dest); > > return true; > -- > 2.51.0 > >
