@samitouri / QOSamiQemu / commits / 5aed8ac67e

target/riscv: Fix size of pc, load_[val|res]

Fix to 64 bits in size and as these are mapped to TCG globals, be careful with host endianness when allocating globals. Casts are added to logging expressions to retain the correct size for TARGET_RISCV32. 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-4-anjo@rev.ng> Signed-off-by: Alistair Francis <alistair.francis@wdc.com>

Anton Johansson committed May 20, 2026 at 14:53 UTC 5aed8ac67e2dd49552178e9e4db7f8dd303c3d03
5 files changed +17 -15
target/riscv/cpu.c
+1 -1
@@ -585,7 +585,7 @@ static void riscv_cpu_dump_state(CPUState *cs, FILE *f, int flags)
585 qemu_fprintf(f, " %s %d\n", "V = ", env->virt_enabled);
586 }
587 #endif
588 - qemu_fprintf(f, " %s " TARGET_FMT_lx "\n", "pc ", env->pc);
588 + qemu_fprintf(f, " %s %" PRIx64 "\n", "pc ", env->pc);
589 #ifndef CONFIG_USER_ONLY
590 for (i = 0; i < ARRAY_SIZE(csr_ops); i++) {
591 int csrno = i;
target/riscv/cpu.h
+3 -3
@@ -226,9 +226,9 @@ struct CPUArchState {
226 uint8_t vxsat;
227 bool vill;
228
229 - target_ulong pc;
230 - target_ulong load_res;
231 - target_ulong load_val;
229 + uint64_t pc;
230 + uint64_t load_res;
231 + uint64_t load_val;
232
233 /* Floating-Point state */
234 uint64_t fpr[32]; /* assume both F and D extensions */
target/riscv/cpu_helper.c
+3 -3
@@ -2373,9 +2373,9 @@ void riscv_cpu_do_interrupt(CPUState *cs)
2373
2374 qemu_log_mask(CPU_LOG_INT,
2375 "%s: hart:%"PRIu64", async:%d, cause:"TARGET_FMT_lx", "
2376 - "epc:0x"TARGET_FMT_lx", tval:0x"TARGET_FMT_lx", desc=%s\n",
2377 - __func__, env->mhartid, async, cause, env->pc, tval,
2378 - riscv_cpu_get_trap_name(cause, async));
2376 + "epc:0x%"PRIx64", tval:0x"TARGET_FMT_lx", desc=%s\n",
2377 + __func__, env->mhartid, async, cause, env->pc,
2378 + tval, riscv_cpu_get_trap_name(cause, async));
2379
2380 mode = env->priv <= PRV_S && cause < 64 &&
2381 (((deleg >> cause) & 1) || s_injected || vs_injected) ? PRV_S : PRV_M;
target/riscv/machine.c
+3 -3
@@ -453,9 +453,9 @@ const VMStateDescription vmstate_riscv_cpu = {
453 VMSTATE_UINT64_ARRAY(env.fpr, RISCVCPU, 32),
454 VMSTATE_UINT8_ARRAY(env.miprio, RISCVCPU, 64),
455 VMSTATE_UINT8_ARRAY(env.siprio, RISCVCPU, 64),
456 - VMSTATE_UINTTL(env.pc, RISCVCPU),
457 - VMSTATE_UINTTL(env.load_res, RISCVCPU),
458 - VMSTATE_UINTTL(env.load_val, RISCVCPU),
456 + VMSTATE_UINT64(env.pc, RISCVCPU),
457 + VMSTATE_UINT64(env.load_res, RISCVCPU),
458 + VMSTATE_UINT64(env.load_val, RISCVCPU),
459 VMSTATE_UINTTL(env.frm, RISCVCPU),
460 VMSTATE_UINTTL(env.badaddr, RISCVCPU),
461 VMSTATE_UINTTL(env.guest_phys_fault_addr, RISCVCPU),
target/riscv/translate.c
+7 -5
@@ -1484,6 +1484,10 @@ void riscv_translate_init(void)
1484 /* 32 bits in size, no offset needed */
1485 size_t vl_offset = offsetof(CPURISCVState, vl);
1486 size_t vstart_offset = offsetof(CPURISCVState, vstart);
1487 + /* 64 bits in size mapped to TCGv, needs offset */
1488 + size_t pc_offset = offsetof(CPURISCVState, pc) + field_offset;
1489 + size_t res_offset = offsetof(CPURISCVState, load_res) + field_offset;
1490 + size_t val_offset = offsetof(CPURISCVState, load_val) + field_offset;
1491
1492 for (i = 1; i < 32; i++) {
1493 cpu_gpr[i] = tcg_global_mem_new(tcg_env,
@@ -1499,11 +1503,9 @@ void riscv_translate_init(void)
1503 offsetof(CPURISCVState, fpr[i]), riscv_fpr_regnames[i]);
1504 }
1505
1502 - cpu_pc = tcg_global_mem_new(tcg_env, offsetof(CPURISCVState, pc), "pc");
1506 + cpu_pc = tcg_global_mem_new(tcg_env, pc_offset, "pc");
1507 cpu_vl = tcg_global_mem_new_i32(tcg_env, vl_offset, "vl");
1508 cpu_vstart = tcg_global_mem_new_i32(tcg_env, vstart_offset, "vstart");
1505 - load_res = tcg_global_mem_new(tcg_env, offsetof(CPURISCVState, load_res),
1506 - "load_res");
1507 - load_val = tcg_global_mem_new(tcg_env, offsetof(CPURISCVState, load_val),
1508 - "load_val");
1509 + load_res = tcg_global_mem_new(tcg_env, res_offset, "load_res");
1510 + load_val = tcg_global_mem_new(tcg_env, val_offset, "load_val");
1511 }