@samitouri / QOSamiQemu / commits / f2287c7020

target/riscv: Fix size of badaddr and bins

Fix these fields to 64 bits as they cannot be made smaller. Also make sure stores to these fields from TCG are 64 bits in size to avoid incorrect values on big endian hosts. Signed-off-by: Anton Johansson <anjo@rev.ng> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Acked-by: Alistair Francis <alistair.francis@wdc.com> Message-ID: <20260520125406.28693-6-anjo@rev.ng> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Anton Johansson committed May 20, 2026 at 14:53 UTC f2287c7020f36e2f13622d9635a968d6f6fb507d
4 files changed +8 -6
target/riscv/cpu.h
+2 -2
@@ -235,8 +235,8 @@ struct CPUArchState {
235 uint8_t frm;
236 float_status fp_status;
237
238 - target_ulong badaddr;
239 - target_ulong bins;
238 + uint64_t badaddr;
239 + uint64_t bins;
240
241 target_ulong guest_phys_fault_addr;
242
target/riscv/insn_trans/trans_privileged.c.inc
+1 -1
@@ -68,7 +68,7 @@ static bool trans_ebreak(DisasContext *ctx, arg_ebreak *a)
68 if (pre == 0x01f01013 && ebreak == 0x00100073 && post == 0x40705013) {
69 generate_exception(ctx, RISCV_EXCP_SEMIHOST);
70 } else {
71 - tcg_gen_st_tl(tcg_constant_tl(ebreak_addr), tcg_env,
71 + tcg_gen_st_i64(tcg_constant_i64(ebreak_addr), tcg_env,
72 offsetof(CPURISCVState, badaddr));
73 generate_exception(ctx, RISCV_EXCP_BREAKPOINT);
74 }
target/riscv/machine.c
+1 -1
@@ -457,7 +457,7 @@ const VMStateDescription vmstate_riscv_cpu = {
457 VMSTATE_UINT64(env.load_res, RISCVCPU),
458 VMSTATE_UINT64(env.load_val, RISCVCPU),
459 VMSTATE_UINT8(env.frm, RISCVCPU),
460 - VMSTATE_UINTTL(env.badaddr, RISCVCPU),
460 + VMSTATE_UINT64(env.badaddr, RISCVCPU),
461 VMSTATE_UINTTL(env.guest_phys_fault_addr, RISCVCPU),
462 VMSTATE_UINTTL(env.priv_ver, RISCVCPU),
463 VMSTATE_UINTTL(env.vext_ver, RISCVCPU),
target/riscv/translate.c
+4 -2
@@ -273,7 +273,7 @@ static void generate_exception(DisasContext *ctx, RISCVException excp)
273
274 static void gen_exception_illegal(DisasContext *ctx)
275 {
276 - tcg_gen_st_i32(tcg_constant_i32(ctx->opcode), tcg_env,
276 + tcg_gen_st_i64(tcg_constant_i64(ctx->opcode), tcg_env,
277 offsetof(CPURISCVState, bins));
278 if (ctx->virt_inst_excp) {
279 generate_exception(ctx, RISCV_EXCP_VIRT_INSTRUCTION_FAULT);
@@ -284,7 +284,9 @@ static void gen_exception_illegal(DisasContext *ctx)
284
285 static void gen_exception_inst_addr_mis(DisasContext *ctx, TCGv target)
286 {
287 - tcg_gen_st_tl(target, tcg_env, offsetof(CPURISCVState, badaddr));
287 + TCGv_i64 ext = tcg_temp_new_i64();
288 + tcg_gen_extu_tl_i64(ext, target);
289 + tcg_gen_st_i64(ext, tcg_env, offsetof(CPURISCVState, badaddr));
290 generate_exception(ctx, RISCV_EXCP_INST_ADDR_MIS);
291 }
292