* [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc
@ 2025-04-25 15:23 Richard Henderson
2025-04-25 15:23 ` [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn Richard Henderson
` (8 more replies)
0 siblings, 9 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
As discussed, the use of GETPC() within write_misa is wrong.
I've done just enough plumbing to get the helper return address
piped down to write_misa, so that we can make use of unwind data.
AFAIK, nothing in check-tcg or check-functional would test this.
It shouldn't be too hard to write a test akin to issue1060.S,
but I'm going to leave that to someone else.
r~
Richard Henderson (7):
target/riscv: Pass ra to riscv_csr_write_fn
target/riscv: Pass ra to riscv_csrrw_do64
target/riscv: Pass ra to riscv_csrrw_do128
target/riscv: Pass ra to riscv_csrrw
target/riscv: Pass ra to riscv_csrrw_i128
target/riscv: Move insn_len to internals.h
target/riscv: Fix write_misa vs aligned next_pc
target/riscv/cpu.h | 15 ++-
target/riscv/internals.h | 5 +
hw/riscv/riscv_hart.c | 2 +-
target/riscv/csr.c | 278 +++++++++++++++++++++------------------
target/riscv/op_helper.c | 13 +-
target/riscv/translate.c | 5 -
6 files changed, 169 insertions(+), 149 deletions(-)
--
2.43.0
^ permalink raw reply [flat|nested] 28+ messages in thread
* [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:28 ` Philippe Mathieu-Daudé
2025-04-28 22:33 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64 Richard Henderson
` (7 subsequent siblings)
8 siblings, 2 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/cpu.h | 3 +-
target/riscv/csr.c | 226 +++++++++++++++++++++++----------------------
2 files changed, 118 insertions(+), 111 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 167909c89b..4d41a66d72 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -841,7 +841,8 @@ typedef RISCVException (*riscv_csr_predicate_fn)(CPURISCVState *env,
typedef RISCVException (*riscv_csr_read_fn)(CPURISCVState *env, int csrno,
target_ulong *ret_value);
typedef RISCVException (*riscv_csr_write_fn)(CPURISCVState *env, int csrno,
- target_ulong new_value);
+ target_ulong new_value,
+ uintptr_t ra);
typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
target_ulong *ret_value,
target_ulong new_value,
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index c52c87faae..6f1f69eba6 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -830,13 +830,15 @@ static RISCVException seed(CPURISCVState *env, int csrno)
}
/* zicfiss CSR_SSP read and write */
-static int read_ssp(CPURISCVState *env, int csrno, target_ulong *val)
+static RISCVException read_ssp(CPURISCVState *env, int csrno,
+ target_ulong *val)
{
*val = env->ssp;
return RISCV_EXCP_NONE;
}
-static int write_ssp(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_ssp(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
env->ssp = val;
return RISCV_EXCP_NONE;
@@ -851,7 +853,7 @@ static RISCVException read_fflags(CPURISCVState *env, int csrno,
}
static RISCVException write_fflags(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
if (riscv_has_ext(env, RVF)) {
@@ -870,7 +872,7 @@ static RISCVException read_frm(CPURISCVState *env, int csrno,
}
static RISCVException write_frm(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
if (riscv_has_ext(env, RVF)) {
@@ -890,7 +892,7 @@ static RISCVException read_fcsr(CPURISCVState *env, int csrno,
}
static RISCVException write_fcsr(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
if (riscv_has_ext(env, RVF)) {
@@ -942,7 +944,7 @@ static RISCVException read_vxrm(CPURISCVState *env, int csrno,
}
static RISCVException write_vxrm(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
env->mstatus |= MSTATUS_VS;
@@ -959,7 +961,7 @@ static RISCVException read_vxsat(CPURISCVState *env, int csrno,
}
static RISCVException write_vxsat(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
env->mstatus |= MSTATUS_VS;
@@ -976,7 +978,7 @@ static RISCVException read_vstart(CPURISCVState *env, int csrno,
}
static RISCVException write_vstart(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
env->mstatus |= MSTATUS_VS;
@@ -997,7 +999,7 @@ static RISCVException read_vcsr(CPURISCVState *env, int csrno,
}
static RISCVException write_vcsr(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
#if !defined(CONFIG_USER_ONLY)
env->mstatus |= MSTATUS_VS;
@@ -1055,7 +1057,7 @@ static RISCVException read_mcyclecfg(CPURISCVState *env, int csrno,
}
static RISCVException write_mcyclecfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t inh_avail_mask;
@@ -1084,7 +1086,7 @@ static RISCVException read_mcyclecfgh(CPURISCVState *env, int csrno,
}
static RISCVException write_mcyclecfgh(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
target_ulong inh_avail_mask = (target_ulong)(~MHPMEVENTH_FILTER_MASK |
MCYCLECFGH_BIT_MINH);
@@ -1109,7 +1111,7 @@ static RISCVException read_minstretcfg(CPURISCVState *env, int csrno,
}
static RISCVException write_minstretcfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t inh_avail_mask;
@@ -1136,7 +1138,7 @@ static RISCVException read_minstretcfgh(CPURISCVState *env, int csrno,
}
static RISCVException write_minstretcfgh(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
target_ulong inh_avail_mask = (target_ulong)(~MHPMEVENTH_FILTER_MASK |
MINSTRETCFGH_BIT_MINH);
@@ -1163,7 +1165,7 @@ static RISCVException read_mhpmevent(CPURISCVState *env, int csrno,
}
static RISCVException write_mhpmevent(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
int evt_index = csrno - CSR_MCOUNTINHIBIT;
uint64_t mhpmevt_val = val;
@@ -1201,7 +1203,7 @@ static RISCVException read_mhpmeventh(CPURISCVState *env, int csrno,
}
static RISCVException write_mhpmeventh(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
int evt_index = csrno - CSR_MHPMEVENT3H + 3;
uint64_t mhpmevth_val;
@@ -1343,14 +1345,16 @@ static RISCVException riscv_pmu_write_ctrh(CPURISCVState *env, target_ulong val,
return RISCV_EXCP_NONE;
}
-static int write_mhpmcounter(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_mhpmcounter(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
int ctr_idx = csrno - CSR_MCYCLE;
return riscv_pmu_write_ctr(env, val, ctr_idx);
}
-static int write_mhpmcounterh(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_mhpmcounterh(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
int ctr_idx = csrno - CSR_MCYCLEH;
@@ -1661,7 +1665,7 @@ static RISCVException read_vstimecmph(CPURISCVState *env, int csrno,
}
static RISCVException write_vstimecmp(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (riscv_cpu_mxl(env) == MXL_RV32) {
env->vstimecmp = deposit64(env->vstimecmp, 0, 32, (uint64_t)val);
@@ -1676,7 +1680,7 @@ static RISCVException write_vstimecmp(CPURISCVState *env, int csrno,
}
static RISCVException write_vstimecmph(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->vstimecmp = deposit64(env->vstimecmp, 32, 32, (uint64_t)val);
riscv_timer_write_timecmp(env, env->vstimer, env->vstimecmp,
@@ -1710,13 +1714,13 @@ static RISCVException read_stimecmph(CPURISCVState *env, int csrno,
}
static RISCVException write_stimecmp(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (env->virt_enabled) {
if (env->hvictl & HVICTL_VTI) {
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
}
- return write_vstimecmp(env, csrno, val);
+ return write_vstimecmp(env, csrno, val, ra);
}
if (riscv_cpu_mxl(env) == MXL_RV32) {
@@ -1731,13 +1735,13 @@ static RISCVException write_stimecmp(CPURISCVState *env, int csrno,
}
static RISCVException write_stimecmph(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (env->virt_enabled) {
if (env->hvictl & HVICTL_VTI) {
return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
}
- return write_vstimecmph(env, csrno, val);
+ return write_vstimecmph(env, csrno, val, ra);
}
env->stimecmp = deposit64(env->stimecmp, 32, 32, (uint64_t)val);
@@ -1842,7 +1846,7 @@ static RISCVException read_zero(CPURISCVState *env, int csrno,
}
static RISCVException write_ignore(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
return RISCV_EXCP_NONE;
}
@@ -1963,7 +1967,7 @@ static target_ulong legalize_mpp(CPURISCVState *env, target_ulong old_mpp,
}
static RISCVException write_mstatus(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t mstatus = env->mstatus;
uint64_t mask = 0;
@@ -2042,7 +2046,7 @@ static RISCVException read_mstatush(CPURISCVState *env, int csrno,
}
static RISCVException write_mstatush(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t valh = (uint64_t)val << 32;
uint64_t mask = riscv_has_ext(env, RVH) ? MSTATUS_MPV | MSTATUS_GVA : 0;
@@ -2096,7 +2100,7 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
}
static RISCVException write_misa(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
RISCVCPU *cpu = env_archcpu(env);
uint32_t orig_misa_ext = env->misa_ext;
@@ -2160,7 +2164,7 @@ static RISCVException read_medeleg(CPURISCVState *env, int csrno,
}
static RISCVException write_medeleg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->medeleg = (env->medeleg & ~DELEGABLE_EXCPS) | (val & DELEGABLE_EXCPS);
return RISCV_EXCP_NONE;
@@ -2955,7 +2959,7 @@ static RISCVException read_mtvec(CPURISCVState *env, int csrno,
}
static RISCVException write_mtvec(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
/* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
if ((val & 3) < 2) {
@@ -2974,7 +2978,7 @@ static RISCVException read_mcountinhibit(CPURISCVState *env, int csrno,
}
static RISCVException write_mcountinhibit(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
int cidx;
PMUCTRState *counter;
@@ -3049,10 +3053,9 @@ static RISCVException read_scountinhibit(CPURISCVState *env, int csrno,
}
static RISCVException write_scountinhibit(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
- write_mcountinhibit(env, csrno, val & env->mcounteren);
- return RISCV_EXCP_NONE;
+ return write_mcountinhibit(env, csrno, val & env->mcounteren, ra);
}
static RISCVException read_mcounteren(CPURISCVState *env, int csrno,
@@ -3063,7 +3066,7 @@ static RISCVException read_mcounteren(CPURISCVState *env, int csrno,
}
static RISCVException write_mcounteren(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
RISCVCPU *cpu = env_archcpu(env);
@@ -3097,7 +3100,7 @@ static RISCVException read_mscratch(CPURISCVState *env, int csrno,
}
static RISCVException write_mscratch(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->mscratch = val;
return RISCV_EXCP_NONE;
@@ -3111,7 +3114,7 @@ static RISCVException read_mepc(CPURISCVState *env, int csrno,
}
static RISCVException write_mepc(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->mepc = val;
return RISCV_EXCP_NONE;
@@ -3125,7 +3128,7 @@ static RISCVException read_mcause(CPURISCVState *env, int csrno,
}
static RISCVException write_mcause(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->mcause = val;
return RISCV_EXCP_NONE;
@@ -3139,7 +3142,7 @@ static RISCVException read_mtval(CPURISCVState *env, int csrno,
}
static RISCVException write_mtval(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->mtval = val;
return RISCV_EXCP_NONE;
@@ -3154,9 +3157,9 @@ static RISCVException read_menvcfg(CPURISCVState *env, int csrno,
}
static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
- target_ulong val);
+ target_ulong val, uintptr_t ra);
static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
uint64_t mask = MENVCFG_FIOM | MENVCFG_CBIE | MENVCFG_CBCFE |
@@ -3188,9 +3191,7 @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
}
}
env->menvcfg = (env->menvcfg & ~mask) | (val & mask);
- write_henvcfg(env, CSR_HENVCFG, env->henvcfg);
-
- return RISCV_EXCP_NONE;
+ return write_henvcfg(env, CSR_HENVCFG, env->henvcfg, ra);
}
static RISCVException read_menvcfgh(CPURISCVState *env, int csrno,
@@ -3201,9 +3202,9 @@ static RISCVException read_menvcfgh(CPURISCVState *env, int csrno,
}
static RISCVException write_henvcfgh(CPURISCVState *env, int csrno,
- target_ulong val);
+ target_ulong val, uintptr_t ra);
static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
uint64_t mask = (cfg->ext_svpbmt ? MENVCFG_PBMTE : 0) |
@@ -3218,9 +3219,7 @@ static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
}
env->menvcfg = (env->menvcfg & ~mask) | (valh & mask);
- write_henvcfgh(env, CSR_HENVCFGH, env->henvcfg >> 32);
-
- return RISCV_EXCP_NONE;
+ return write_henvcfgh(env, CSR_HENVCFGH, env->henvcfg >> 32, ra);
}
static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
@@ -3238,7 +3237,7 @@ static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
}
static RISCVException write_senvcfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t mask = SENVCFG_FIOM | SENVCFG_CBIE | SENVCFG_CBCFE | SENVCFG_CBZE;
RISCVException ret;
@@ -3295,7 +3294,7 @@ static RISCVException read_henvcfg(CPURISCVState *env, int csrno,
}
static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t mask = HENVCFG_FIOM | HENVCFG_CBIE | HENVCFG_CBCFE | HENVCFG_CBZE;
RISCVException ret;
@@ -3350,7 +3349,7 @@ static RISCVException read_henvcfgh(CPURISCVState *env, int csrno,
}
static RISCVException write_henvcfgh(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t mask = env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE |
HENVCFG_ADUE | HENVCFG_DTE);
@@ -3388,7 +3387,7 @@ static RISCVException write_mstateen(CPURISCVState *env, int csrno,
}
static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
if (!riscv_has_ext(env, RVF)) {
@@ -3420,7 +3419,7 @@ static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
}
static RISCVException write_mstateen_1_3(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
return write_mstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
}
@@ -3447,7 +3446,7 @@ static RISCVException write_mstateenh(CPURISCVState *env, int csrno,
}
static RISCVException write_mstateen0h(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
@@ -3463,7 +3462,7 @@ static RISCVException write_mstateen0h(CPURISCVState *env, int csrno,
}
static RISCVException write_mstateenh_1_3(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
return write_mstateenh(env, csrno, SMSTATEEN_STATEEN, new_val);
}
@@ -3492,7 +3491,7 @@ static RISCVException write_hstateen(CPURISCVState *env, int csrno,
}
static RISCVException write_hstateen0(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
@@ -3521,7 +3520,7 @@ static RISCVException write_hstateen0(CPURISCVState *env, int csrno,
}
static RISCVException write_hstateen_1_3(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
return write_hstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
}
@@ -3552,7 +3551,7 @@ static RISCVException write_hstateenh(CPURISCVState *env, int csrno,
}
static RISCVException write_hstateen0h(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
@@ -3564,7 +3563,7 @@ static RISCVException write_hstateen0h(CPURISCVState *env, int csrno,
}
static RISCVException write_hstateenh_1_3(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
return write_hstateenh(env, csrno, SMSTATEEN_STATEEN, new_val);
}
@@ -3603,7 +3602,7 @@ static RISCVException write_sstateen(CPURISCVState *env, int csrno,
}
static RISCVException write_sstateen0(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
@@ -3615,7 +3614,7 @@ static RISCVException write_sstateen0(CPURISCVState *env, int csrno,
}
static RISCVException write_sstateen_1_3(CPURISCVState *env, int csrno,
- target_ulong new_val)
+ target_ulong new_val, uintptr_t ra)
{
return write_sstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
}
@@ -3866,7 +3865,7 @@ static RISCVException read_sstatus(CPURISCVState *env, int csrno,
}
static RISCVException write_sstatus(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
target_ulong mask = (sstatus_v1_10_mask);
@@ -3883,7 +3882,7 @@ static RISCVException write_sstatus(CPURISCVState *env, int csrno,
mask |= SSTATUS_SDT;
}
target_ulong newval = (env->mstatus & ~mask) | (val & mask);
- return write_mstatus(env, CSR_MSTATUS, newval);
+ return write_mstatus(env, CSR_MSTATUS, newval, ra);
}
static RISCVException rmw_vsie64(CPURISCVState *env, int csrno,
@@ -4035,7 +4034,7 @@ static RISCVException read_stvec(CPURISCVState *env, int csrno,
}
static RISCVException write_stvec(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
/* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
if ((val & 3) < 2) {
@@ -4054,7 +4053,7 @@ static RISCVException read_scounteren(CPURISCVState *env, int csrno,
}
static RISCVException write_scounteren(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
RISCVCPU *cpu = env_archcpu(env);
@@ -4088,7 +4087,7 @@ static RISCVException read_sscratch(CPURISCVState *env, int csrno,
}
static RISCVException write_sscratch(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->sscratch = val;
return RISCV_EXCP_NONE;
@@ -4102,7 +4101,7 @@ static RISCVException read_sepc(CPURISCVState *env, int csrno,
}
static RISCVException write_sepc(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->sepc = val;
return RISCV_EXCP_NONE;
@@ -4116,7 +4115,7 @@ static RISCVException read_scause(CPURISCVState *env, int csrno,
}
static RISCVException write_scause(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->scause = val;
return RISCV_EXCP_NONE;
@@ -4130,7 +4129,7 @@ static RISCVException read_stval(CPURISCVState *env, int csrno,
}
static RISCVException write_stval(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->stval = val;
return RISCV_EXCP_NONE;
@@ -4270,7 +4269,7 @@ static RISCVException read_satp(CPURISCVState *env, int csrno,
}
static RISCVException write_satp(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (!riscv_cpu_cfg(env)->mmu) {
return RISCV_EXCP_NONE;
@@ -4492,7 +4491,7 @@ static RISCVException read_hstatus(CPURISCVState *env, int csrno,
}
static RISCVException write_hstatus(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t mask = (target_ulong)-1;
if (!env_archcpu(env)->cfg.ext_svukte) {
@@ -4524,7 +4523,7 @@ static RISCVException read_hedeleg(CPURISCVState *env, int csrno,
}
static RISCVException write_hedeleg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->hedeleg = val & vs_delegable_excps;
return RISCV_EXCP_NONE;
@@ -4545,7 +4544,7 @@ static RISCVException read_hedelegh(CPURISCVState *env, int csrno,
}
static RISCVException write_hedelegh(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
RISCVException ret;
ret = smstateen_acc_ok(env, 0, SMSTATEEN0_P1P13);
@@ -4808,7 +4807,7 @@ static RISCVException read_hcounteren(CPURISCVState *env, int csrno,
}
static RISCVException write_hcounteren(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
RISCVCPU *cpu = env_archcpu(env);
@@ -4828,7 +4827,7 @@ static RISCVException read_hgeie(CPURISCVState *env, int csrno,
}
static RISCVException write_hgeie(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
/* Only GEILEN:1 bits implemented and BIT0 is never implemented */
val &= ((((target_ulong)1) << env->geilen) - 1) << 1;
@@ -4847,7 +4846,7 @@ static RISCVException read_htval(CPURISCVState *env, int csrno,
}
static RISCVException write_htval(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->htval = val;
return RISCV_EXCP_NONE;
@@ -4861,7 +4860,7 @@ static RISCVException read_htinst(CPURISCVState *env, int csrno,
}
static RISCVException write_htinst(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
return RISCV_EXCP_NONE;
}
@@ -4883,7 +4882,7 @@ static RISCVException read_hgatp(CPURISCVState *env, int csrno,
}
static RISCVException write_hgatp(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->hgatp = legalize_xatp(env, env->hgatp, val);
return RISCV_EXCP_NONE;
@@ -4901,7 +4900,7 @@ static RISCVException read_htimedelta(CPURISCVState *env, int csrno,
}
static RISCVException write_htimedelta(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (!env->rdtime_fn) {
return RISCV_EXCP_ILLEGAL_INST;
@@ -4933,7 +4932,7 @@ static RISCVException read_htimedeltah(CPURISCVState *env, int csrno,
}
static RISCVException write_htimedeltah(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (!env->rdtime_fn) {
return RISCV_EXCP_ILLEGAL_INST;
@@ -4957,7 +4956,7 @@ static RISCVException read_hvictl(CPURISCVState *env, int csrno,
}
static RISCVException write_hvictl(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->hvictl = val & HVICTL_VALID_MASK;
return RISCV_EXCP_NONE;
@@ -5022,7 +5021,7 @@ static RISCVException read_hviprio1(CPURISCVState *env, int csrno,
}
static RISCVException write_hviprio1(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
return write_hvipriox(env, 0, env->hviprio, val);
}
@@ -5034,7 +5033,7 @@ static RISCVException read_hviprio1h(CPURISCVState *env, int csrno,
}
static RISCVException write_hviprio1h(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
return write_hvipriox(env, 4, env->hviprio, val);
}
@@ -5046,7 +5045,7 @@ static RISCVException read_hviprio2(CPURISCVState *env, int csrno,
}
static RISCVException write_hviprio2(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
return write_hvipriox(env, 8, env->hviprio, val);
}
@@ -5058,7 +5057,7 @@ static RISCVException read_hviprio2h(CPURISCVState *env, int csrno,
}
static RISCVException write_hviprio2h(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
return write_hvipriox(env, 12, env->hviprio, val);
}
@@ -5072,7 +5071,7 @@ static RISCVException read_vsstatus(CPURISCVState *env, int csrno,
}
static RISCVException write_vsstatus(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint64_t mask = (target_ulong)-1;
if ((val & VSSTATUS64_UXL) == 0) {
@@ -5097,7 +5096,7 @@ static RISCVException read_vstvec(CPURISCVState *env, int csrno,
}
static RISCVException write_vstvec(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
/* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
if ((val & 3) < 2) {
@@ -5116,7 +5115,7 @@ static RISCVException read_vsscratch(CPURISCVState *env, int csrno,
}
static RISCVException write_vsscratch(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->vsscratch = val;
return RISCV_EXCP_NONE;
@@ -5130,7 +5129,7 @@ static RISCVException read_vsepc(CPURISCVState *env, int csrno,
}
static RISCVException write_vsepc(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->vsepc = val;
return RISCV_EXCP_NONE;
@@ -5144,7 +5143,7 @@ static RISCVException read_vscause(CPURISCVState *env, int csrno,
}
static RISCVException write_vscause(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->vscause = val;
return RISCV_EXCP_NONE;
@@ -5158,7 +5157,7 @@ static RISCVException read_vstval(CPURISCVState *env, int csrno,
}
static RISCVException write_vstval(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->vstval = val;
return RISCV_EXCP_NONE;
@@ -5172,7 +5171,7 @@ static RISCVException read_vsatp(CPURISCVState *env, int csrno,
}
static RISCVException write_vsatp(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->vsatp = legalize_xatp(env, env->vsatp, val);
return RISCV_EXCP_NONE;
@@ -5186,7 +5185,7 @@ static RISCVException read_mtval2(CPURISCVState *env, int csrno,
}
static RISCVException write_mtval2(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->mtval2 = val;
return RISCV_EXCP_NONE;
@@ -5200,7 +5199,7 @@ static RISCVException read_mtinst(CPURISCVState *env, int csrno,
}
static RISCVException write_mtinst(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->mtinst = val;
return RISCV_EXCP_NONE;
@@ -5215,7 +5214,7 @@ static RISCVException read_mseccfg(CPURISCVState *env, int csrno,
}
static RISCVException write_mseccfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
mseccfg_csr_write(env, val);
return RISCV_EXCP_NONE;
@@ -5231,7 +5230,7 @@ static RISCVException read_pmpcfg(CPURISCVState *env, int csrno,
}
static RISCVException write_pmpcfg(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
uint32_t reg_index = csrno - CSR_PMPCFG0;
@@ -5247,7 +5246,7 @@ static RISCVException read_pmpaddr(CPURISCVState *env, int csrno,
}
static RISCVException write_pmpaddr(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
pmpaddr_csr_write(env, csrno - CSR_PMPADDR0, val);
return RISCV_EXCP_NONE;
@@ -5261,7 +5260,7 @@ static RISCVException read_tselect(CPURISCVState *env, int csrno,
}
static RISCVException write_tselect(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
tselect_csr_write(env, val);
return RISCV_EXCP_NONE;
@@ -5285,7 +5284,7 @@ static RISCVException read_tdata(CPURISCVState *env, int csrno,
}
static RISCVException write_tdata(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
if (!tdata_available(env, csrno - CSR_TDATA1)) {
return RISCV_EXCP_ILLEGAL_INST;
@@ -5310,7 +5309,7 @@ static RISCVException read_mcontext(CPURISCVState *env, int csrno,
}
static RISCVException write_mcontext(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
bool rv32 = riscv_cpu_mxl(env) == MXL_RV32 ? true : false;
int32_t mask;
@@ -5334,43 +5333,50 @@ static RISCVException read_mnscratch(CPURISCVState *env, int csrno,
return RISCV_EXCP_NONE;
}
-static int write_mnscratch(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_mnscratch(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
env->mnscratch = val;
return RISCV_EXCP_NONE;
}
-static int read_mnepc(CPURISCVState *env, int csrno, target_ulong *val)
+static RISCVException read_mnepc(CPURISCVState *env, int csrno,
+ target_ulong *val)
{
*val = env->mnepc;
return RISCV_EXCP_NONE;
}
-static int write_mnepc(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_mnepc(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
env->mnepc = val;
return RISCV_EXCP_NONE;
}
-static int read_mncause(CPURISCVState *env, int csrno, target_ulong *val)
+static RISCVException read_mncause(CPURISCVState *env, int csrno,
+ target_ulong *val)
{
*val = env->mncause;
return RISCV_EXCP_NONE;
}
-static int write_mncause(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_mncause(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
env->mncause = val;
return RISCV_EXCP_NONE;
}
-static int read_mnstatus(CPURISCVState *env, int csrno, target_ulong *val)
+static RISCVException read_mnstatus(CPURISCVState *env, int csrno,
+ target_ulong *val)
{
*val = env->mnstatus;
return RISCV_EXCP_NONE;
}
-static int write_mnstatus(CPURISCVState *env, int csrno, target_ulong val)
+static RISCVException write_mnstatus(CPURISCVState *env, int csrno,
+ target_ulong val, uintptr_t ra)
{
target_ulong mask = (MNSTATUS_NMIE | MNSTATUS_MNPP);
@@ -5540,7 +5546,7 @@ static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
if (write_mask) {
new_value = (old_value & ~write_mask) | (new_value & write_mask);
if (csr_ops[csrno].write) {
- ret = csr_ops[csrno].write(env, csrno, new_value);
+ ret = csr_ops[csrno].write(env, csrno, new_value, 0);
if (ret != RISCV_EXCP_NONE) {
return ret;
}
@@ -5603,7 +5609,7 @@ static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
}
} else if (csr_ops[csrno].write) {
/* avoids having to write wrappers for all registers */
- ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value));
+ ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value), 0);
if (ret != RISCV_EXCP_NONE) {
return ret;
}
@@ -5714,7 +5720,7 @@ static RISCVException read_jvt(CPURISCVState *env, int csrno,
}
static RISCVException write_jvt(CPURISCVState *env, int csrno,
- target_ulong val)
+ target_ulong val, uintptr_t ra)
{
env->jvt = val;
return RISCV_EXCP_NONE;
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
2025-04-25 15:23 ` [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:29 ` Philippe Mathieu-Daudé
2025-04-28 22:34 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128 Richard Henderson
` (6 subsequent siblings)
8 siblings, 2 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/csr.c | 15 +++++++--------
1 file changed, 7 insertions(+), 8 deletions(-)
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index 6f1f69eba6..e9c2f95b6e 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -5516,7 +5516,8 @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
target_ulong *ret_value,
target_ulong new_value,
- target_ulong write_mask)
+ target_ulong write_mask,
+ uintptr_t ra)
{
RISCVException ret;
target_ulong old_value = 0;
@@ -5546,7 +5547,7 @@ static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
if (write_mask) {
new_value = (old_value & ~write_mask) | (new_value & write_mask);
if (csr_ops[csrno].write) {
- ret = csr_ops[csrno].write(env, csrno, new_value, 0);
+ ret = csr_ops[csrno].write(env, csrno, new_value, ra);
if (ret != RISCV_EXCP_NONE) {
return ret;
}
@@ -5569,7 +5570,7 @@ RISCVException riscv_csrr(CPURISCVState *env, int csrno,
return ret;
}
- return riscv_csrrw_do64(env, csrno, ret_value, 0, 0);
+ return riscv_csrrw_do64(env, csrno, ret_value, 0, 0, 0);
}
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
@@ -5581,7 +5582,7 @@ RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
return ret;
}
- return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask);
+ return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, 0);
}
static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
@@ -5647,9 +5648,7 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
* accesses
*/
target_ulong old_value;
- ret = riscv_csrrw_do64(env, csrno, &old_value,
- (target_ulong)0,
- (target_ulong)0);
+ ret = riscv_csrrw_do64(env, csrno, &old_value, 0, 0, 0);
if (ret == RISCV_EXCP_NONE && ret_value) {
*ret_value = int128_make64(old_value);
}
@@ -5681,7 +5680,7 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
target_ulong old_value;
ret = riscv_csrrw_do64(env, csrno, &old_value,
int128_getlo(new_value),
- int128_getlo(write_mask));
+ int128_getlo(write_mask), 0);
if (ret == RISCV_EXCP_NONE && ret_value) {
*ret_value = int128_make64(old_value);
}
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
2025-04-25 15:23 ` [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn Richard Henderson
2025-04-25 15:23 ` [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64 Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:29 ` Philippe Mathieu-Daudé
2025-04-28 22:34 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw Richard Henderson
` (5 subsequent siblings)
8 siblings, 2 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/csr.c | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index e9c2f95b6e..d62d1aaaee 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -5588,7 +5588,7 @@ RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
Int128 *ret_value,
Int128 new_value,
- Int128 write_mask)
+ Int128 write_mask, uintptr_t ra)
{
RISCVException ret;
Int128 old_value;
@@ -5610,7 +5610,7 @@ static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
}
} else if (csr_ops[csrno].write) {
/* avoids having to write wrappers for all registers */
- ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value), 0);
+ ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value), ra);
if (ret != RISCV_EXCP_NONE) {
return ret;
}
@@ -5637,7 +5637,7 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
if (csr_ops[csrno].read128) {
return riscv_csrrw_do128(env, csrno, ret_value,
- int128_zero(), int128_zero());
+ int128_zero(), int128_zero(), 0);
}
/*
@@ -5667,7 +5667,8 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
}
if (csr_ops[csrno].read128) {
- return riscv_csrrw_do128(env, csrno, ret_value, new_value, write_mask);
+ return riscv_csrrw_do128(env, csrno, ret_value,
+ new_value, write_mask, 0);
}
/*
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (2 preceding siblings ...)
2025-04-25 15:23 ` [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128 Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:31 ` Philippe Mathieu-Daudé
2025-04-28 22:36 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128 Richard Henderson
` (4 subsequent siblings)
8 siblings, 2 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/cpu.h | 8 ++++----
hw/riscv/riscv_hart.c | 2 +-
target/riscv/csr.c | 8 ++++----
target/riscv/op_helper.c | 4 ++--
4 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 4d41a66d72..2c0524d0be 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -816,8 +816,8 @@ RISCVException riscv_csrr(CPURISCVState *env, int csrno,
target_ulong *ret_value);
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
- target_ulong *ret_value,
- target_ulong new_value, target_ulong write_mask);
+ target_ulong *ret_value, target_ulong new_value,
+ target_ulong write_mask, uintptr_t ra);
RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
target_ulong *ret_value,
target_ulong new_value,
@@ -826,13 +826,13 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
static inline void riscv_csr_write(CPURISCVState *env, int csrno,
target_ulong val)
{
- riscv_csrrw(env, csrno, NULL, val, MAKE_64BIT_MASK(0, TARGET_LONG_BITS));
+ riscv_csrrw(env, csrno, NULL, val, MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
}
static inline target_ulong riscv_csr_read(CPURISCVState *env, int csrno)
{
target_ulong val = 0;
- riscv_csrrw(env, csrno, &val, 0, 0);
+ riscv_csrrw(env, csrno, &val, 0, 0, 0);
return val;
}
diff --git a/hw/riscv/riscv_hart.c b/hw/riscv/riscv_hart.c
index a55d156668..2ebbf41b18 100644
--- a/hw/riscv/riscv_hart.c
+++ b/hw/riscv/riscv_hart.c
@@ -72,7 +72,7 @@ static void csr_call(char *cmd, uint64_t cpu_num, int csrno, uint64_t *val)
ret = riscv_csrr(env, csrno, (target_ulong *)val);
} else if (strcmp(cmd, "set_csr") == 0) {
ret = riscv_csrrw(env, csrno, NULL, *(target_ulong *)val,
- MAKE_64BIT_MASK(0, TARGET_LONG_BITS));
+ MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
}
g_assert(ret == RISCV_EXCP_NONE);
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index d62d1aaaee..097640e25d 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -5574,15 +5574,15 @@ RISCVException riscv_csrr(CPURISCVState *env, int csrno,
}
RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
- target_ulong *ret_value,
- target_ulong new_value, target_ulong write_mask)
+ target_ulong *ret_value, target_ulong new_value,
+ target_ulong write_mask, uintptr_t ra)
{
RISCVException ret = riscv_csrrw_check(env, csrno, true);
if (ret != RISCV_EXCP_NONE) {
return ret;
}
- return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, 0);
+ return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, ra);
}
static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
@@ -5704,7 +5704,7 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
if (!write_mask) {
ret = riscv_csrr(env, csrno, ret_value);
} else {
- ret = riscv_csrrw(env, csrno, ret_value, new_value, write_mask);
+ ret = riscv_csrrw(env, csrno, ret_value, new_value, write_mask, 0);
}
#if !defined(CONFIG_USER_ONLY)
env->debugger = false;
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
index 5b0db2c45a..aee16e2e3a 100644
--- a/target/riscv/op_helper.c
+++ b/target/riscv/op_helper.c
@@ -71,7 +71,7 @@ target_ulong helper_csrr(CPURISCVState *env, int csr)
void helper_csrw(CPURISCVState *env, int csr, target_ulong src)
{
target_ulong mask = env->xl == MXL_RV32 ? UINT32_MAX : (target_ulong)-1;
- RISCVException ret = riscv_csrrw(env, csr, NULL, src, mask);
+ RISCVException ret = riscv_csrrw(env, csr, NULL, src, mask, GETPC());
if (ret != RISCV_EXCP_NONE) {
riscv_raise_exception(env, ret, GETPC());
@@ -82,7 +82,7 @@ target_ulong helper_csrrw(CPURISCVState *env, int csr,
target_ulong src, target_ulong write_mask)
{
target_ulong val = 0;
- RISCVException ret = riscv_csrrw(env, csr, &val, src, write_mask);
+ RISCVException ret = riscv_csrrw(env, csr, &val, src, write_mask, GETPC());
if (ret != RISCV_EXCP_NONE) {
riscv_raise_exception(env, ret, GETPC());
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (3 preceding siblings ...)
2025-04-25 15:23 ` [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:32 ` Philippe Mathieu-Daudé
2025-04-28 22:37 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 6/7] target/riscv: Move insn_len to internals.h Richard Henderson
` (3 subsequent siblings)
8 siblings, 2 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/cpu.h | 4 ++--
target/riscv/csr.c | 8 ++++----
target/riscv/op_helper.c | 9 +++++----
3 files changed, 11 insertions(+), 10 deletions(-)
diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
index 2c0524d0be..8b84793b15 100644
--- a/target/riscv/cpu.h
+++ b/target/riscv/cpu.h
@@ -851,8 +851,8 @@ typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
Int128 *ret_value);
RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
- Int128 *ret_value,
- Int128 new_value, Int128 write_mask);
+ Int128 *ret_value, Int128 new_value,
+ Int128 write_mask, uintptr_t ra);
typedef RISCVException (*riscv_csr_read128_fn)(CPURISCVState *env, int csrno,
Int128 *ret_value);
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index 097640e25d..a663f527a4 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -5656,8 +5656,8 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
}
RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
- Int128 *ret_value,
- Int128 new_value, Int128 write_mask)
+ Int128 *ret_value, Int128 new_value,
+ Int128 write_mask, uintptr_t ra)
{
RISCVException ret;
@@ -5668,7 +5668,7 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
if (csr_ops[csrno].read128) {
return riscv_csrrw_do128(env, csrno, ret_value,
- new_value, write_mask, 0);
+ new_value, write_mask, ra);
}
/*
@@ -5681,7 +5681,7 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
target_ulong old_value;
ret = riscv_csrrw_do64(env, csrno, &old_value,
int128_getlo(new_value),
- int128_getlo(write_mask), 0);
+ int128_getlo(write_mask), ra);
if (ret == RISCV_EXCP_NONE && ret_value) {
*ret_value = int128_make64(old_value);
}
diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
index aee16e2e3a..e3770a2655 100644
--- a/target/riscv/op_helper.c
+++ b/target/riscv/op_helper.c
@@ -108,7 +108,7 @@ void helper_csrw_i128(CPURISCVState *env, int csr,
{
RISCVException ret = riscv_csrrw_i128(env, csr, NULL,
int128_make128(srcl, srch),
- UINT128_MAX);
+ UINT128_MAX, GETPC());
if (ret != RISCV_EXCP_NONE) {
riscv_raise_exception(env, ret, GETPC());
@@ -116,13 +116,14 @@ void helper_csrw_i128(CPURISCVState *env, int csr,
}
target_ulong helper_csrrw_i128(CPURISCVState *env, int csr,
- target_ulong srcl, target_ulong srch,
- target_ulong maskl, target_ulong maskh)
+ target_ulong srcl, target_ulong srch,
+ target_ulong maskl, target_ulong maskh)
{
Int128 rv = int128_zero();
RISCVException ret = riscv_csrrw_i128(env, csr, &rv,
int128_make128(srcl, srch),
- int128_make128(maskl, maskh));
+ int128_make128(maskl, maskh),
+ GETPC());
if (ret != RISCV_EXCP_NONE) {
riscv_raise_exception(env, ret, GETPC());
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 6/7] target/riscv: Move insn_len to internals.h
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (4 preceding siblings ...)
2025-04-25 15:23 ` [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128 Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
2025-04-28 22:37 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (2 subsequent siblings)
8 siblings, 2 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/internals.h | 5 +++++
target/riscv/translate.c | 5 -----
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/target/riscv/internals.h b/target/riscv/internals.h
index 213aff31d8..4570bd50be 100644
--- a/target/riscv/internals.h
+++ b/target/riscv/internals.h
@@ -201,4 +201,9 @@ static inline target_ulong adjust_addr_virt(CPURISCVState *env,
return adjust_addr_body(env, addr, true);
}
+static inline int insn_len(uint16_t first_word)
+{
+ return (first_word & 3) == 3 ? 4 : 2;
+}
+
#endif
diff --git a/target/riscv/translate.c b/target/riscv/translate.c
index cef61b5b29..9836ab8c20 100644
--- a/target/riscv/translate.c
+++ b/target/riscv/translate.c
@@ -1210,11 +1210,6 @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
/* The specification allows for longer insns, but not supported by qemu. */
#define MAX_INSN_LEN 4
-static inline int insn_len(uint16_t first_word)
-{
- return (first_word & 3) == 3 ? 4 : 2;
-}
-
const RISCVDecoder decoder_table[] = {
{ always_true_p, decode_insn32 },
{ has_xthead_p, decode_xthead},
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (5 preceding siblings ...)
2025-04-25 15:23 ` [PATCH 6/7] target/riscv: Move insn_len to internals.h Richard Henderson
@ 2025-04-25 15:23 ` Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
` (3 more replies)
2025-04-26 8:25 ` [PATCH 0/7] " Daniel Henrique Barboza
2025-04-28 22:46 ` Alistair Francis
8 siblings, 4 replies; 28+ messages in thread
From: Richard Henderson @ 2025-04-25 15:23 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
Do not examine a random host return address, but
properly compute the next pc for the guest cpu.
Fixes: f18637cd611 ("RISC-V: Add misa runtime write support")
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
target/riscv/csr.c | 22 +++++++++++++++++-----
1 file changed, 17 insertions(+), 5 deletions(-)
diff --git a/target/riscv/csr.c b/target/riscv/csr.c
index a663f527a4..85f9b4c3d2 100644
--- a/target/riscv/csr.c
+++ b/target/riscv/csr.c
@@ -30,6 +30,8 @@
#include "exec/icount.h"
#include "qemu/guest-random.h"
#include "qapi/error.h"
+#include "tcg/insn-start-words.h"
+#include "internals.h"
#include <stdbool.h>
/* CSR function table public API */
@@ -2099,6 +2101,19 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
return RISCV_EXCP_NONE;
}
+static target_ulong get_next_pc(CPURISCVState *env, uintptr_t ra)
+{
+ uint64_t data[TARGET_INSN_START_WORDS];
+
+ /* Outside of a running cpu, env contains the next pc. */
+ if (ra == 0 || !cpu_unwind_state_data(env_cpu(env), ra, data)) {
+ return env->pc;
+ }
+
+ /* Within unwind data, [0] is pc and [1] is the opcode. */
+ return data[0] + insn_len(data[1]);
+}
+
static RISCVException write_misa(CPURISCVState *env, int csrno,
target_ulong val, uintptr_t ra)
{
@@ -2114,11 +2129,8 @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
/* Mask extensions that are not supported by this hart */
val &= env->misa_ext_mask;
- /*
- * Suppress 'C' if next instruction is not aligned
- * TODO: this should check next_pc
- */
- if ((val & RVC) && (GETPC() & ~3) != 0) {
+ /* Suppress 'C' if next instruction is not aligned. */
+ if ((val & RVC) && (get_next_pc(env, ra) & ~3) != 0) {
val &= ~RVC;
}
--
2.43.0
^ permalink raw reply related [flat|nested] 28+ messages in thread
* Re: [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn
2025-04-25 15:23 ` [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn Richard Henderson
@ 2025-04-25 22:28 ` Philippe Mathieu-Daudé
2025-04-28 22:33 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:28 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/cpu.h | 3 +-
> target/riscv/csr.c | 226 +++++++++++++++++++++++----------------------
> 2 files changed, 118 insertions(+), 111 deletions(-)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 167909c89b..4d41a66d72 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -841,7 +841,8 @@ typedef RISCVException (*riscv_csr_predicate_fn)(CPURISCVState *env,
> typedef RISCVException (*riscv_csr_read_fn)(CPURISCVState *env, int csrno,
> target_ulong *ret_value);
> typedef RISCVException (*riscv_csr_write_fn)(CPURISCVState *env, int csrno,
> - target_ulong new_value);
> + target_ulong new_value,
> + uintptr_t ra);
> typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
> target_ulong *ret_value,
> target_ulong new_value,
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index c52c87faae..6f1f69eba6 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -830,13 +830,15 @@ static RISCVException seed(CPURISCVState *env, int csrno)
> }
>
> /* zicfiss CSR_SSP read and write */
> -static int read_ssp(CPURISCVState *env, int csrno, target_ulong *val)
> +static RISCVException read_ssp(CPURISCVState *env, int csrno,
> + target_ulong *val)
> {
> *val = env->ssp;
> return RISCV_EXCP_NONE;
> }
>
> -static int write_ssp(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_ssp(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
I like the RISCVException type correction.
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64
2025-04-25 15:23 ` [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64 Richard Henderson
@ 2025-04-25 22:29 ` Philippe Mathieu-Daudé
2025-04-28 22:34 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:29 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/csr.c | 15 +++++++--------
> 1 file changed, 7 insertions(+), 8 deletions(-)
> @@ -5647,9 +5648,7 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
> * accesses
> */
> target_ulong old_value;
> - ret = riscv_csrrw_do64(env, csrno, &old_value,
> - (target_ulong)0,
> - (target_ulong)0);
> + ret = riscv_csrrw_do64(env, csrno, &old_value, 0, 0, 0);
:)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128
2025-04-25 15:23 ` [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128 Richard Henderson
@ 2025-04-25 22:29 ` Philippe Mathieu-Daudé
2025-04-28 22:34 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:29 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/csr.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw
2025-04-25 15:23 ` [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw Richard Henderson
@ 2025-04-25 22:31 ` Philippe Mathieu-Daudé
2025-04-28 22:36 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:31 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/cpu.h | 8 ++++----
> hw/riscv/riscv_hart.c | 2 +-
> target/riscv/csr.c | 8 ++++----
> target/riscv/op_helper.c | 4 ++--
> 4 files changed, 11 insertions(+), 11 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128
2025-04-25 15:23 ` [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128 Richard Henderson
@ 2025-04-25 22:32 ` Philippe Mathieu-Daudé
2025-04-28 22:37 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:32 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/cpu.h | 4 ++--
> target/riscv/csr.c | 8 ++++----
> target/riscv/op_helper.c | 9 +++++----
> 3 files changed, 11 insertions(+), 10 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 6/7] target/riscv: Move insn_len to internals.h
2025-04-25 15:23 ` [PATCH 6/7] target/riscv: Move insn_len to internals.h Richard Henderson
@ 2025-04-25 22:33 ` Philippe Mathieu-Daudé
2025-04-28 22:37 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:33 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/internals.h | 5 +++++
> target/riscv/translate.c | 5 -----
> 2 files changed, 5 insertions(+), 5 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
@ 2025-04-25 22:33 ` Philippe Mathieu-Daudé
2025-04-28 22:39 ` Alistair Francis
` (2 subsequent siblings)
3 siblings, 0 replies; 28+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-04-25 22:33 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza
On 25/4/25 17:23, Richard Henderson wrote:
> Do not examine a random host return address, but
> properly compute the next pc for the guest cpu.
>
> Fixes: f18637cd611 ("RISC-V: Add misa runtime write support")
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/csr.c | 22 +++++++++++++++++-----
> 1 file changed, 17 insertions(+), 5 deletions(-)
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (6 preceding siblings ...)
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
@ 2025-04-26 8:25 ` Daniel Henrique Barboza
2025-04-28 22:46 ` Alistair Francis
8 siblings, 0 replies; 28+ messages in thread
From: Daniel Henrique Barboza @ 2025-04-26 8:25 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis
On 4/25/25 12:23 PM, Richard Henderson wrote:
> As discussed, the use of GETPC() within write_misa is wrong.
> I've done just enough plumbing to get the helper return address
> piped down to write_misa, so that we can make use of unwind data.
>
> AFAIK, nothing in check-tcg or check-functional would test this.
> It shouldn't be too hard to write a test akin to issue1060.S,
> but I'm going to leave that to someone else.
All patches:
Reviewed-by: Daniel Henrique Barboza <dbarboza@ventanamicro.com>
>
>
> r~
>
>
> Richard Henderson (7):
> target/riscv: Pass ra to riscv_csr_write_fn
> target/riscv: Pass ra to riscv_csrrw_do64
> target/riscv: Pass ra to riscv_csrrw_do128
> target/riscv: Pass ra to riscv_csrrw
> target/riscv: Pass ra to riscv_csrrw_i128
> target/riscv: Move insn_len to internals.h
> target/riscv: Fix write_misa vs aligned next_pc
>
> target/riscv/cpu.h | 15 ++-
> target/riscv/internals.h | 5 +
> hw/riscv/riscv_hart.c | 2 +-
> target/riscv/csr.c | 278 +++++++++++++++++++++------------------
> target/riscv/op_helper.c | 13 +-
> target/riscv/translate.c | 5 -
> 6 files changed, 169 insertions(+), 149 deletions(-)
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn
2025-04-25 15:23 ` [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn Richard Henderson
2025-04-25 22:28 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:33 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:33 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:24 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.h | 3 +-
> target/riscv/csr.c | 226 +++++++++++++++++++++++----------------------
> 2 files changed, 118 insertions(+), 111 deletions(-)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 167909c89b..4d41a66d72 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -841,7 +841,8 @@ typedef RISCVException (*riscv_csr_predicate_fn)(CPURISCVState *env,
> typedef RISCVException (*riscv_csr_read_fn)(CPURISCVState *env, int csrno,
> target_ulong *ret_value);
> typedef RISCVException (*riscv_csr_write_fn)(CPURISCVState *env, int csrno,
> - target_ulong new_value);
> + target_ulong new_value,
> + uintptr_t ra);
> typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
> target_ulong *ret_value,
> target_ulong new_value,
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index c52c87faae..6f1f69eba6 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -830,13 +830,15 @@ static RISCVException seed(CPURISCVState *env, int csrno)
> }
>
> /* zicfiss CSR_SSP read and write */
> -static int read_ssp(CPURISCVState *env, int csrno, target_ulong *val)
> +static RISCVException read_ssp(CPURISCVState *env, int csrno,
> + target_ulong *val)
> {
> *val = env->ssp;
> return RISCV_EXCP_NONE;
> }
>
> -static int write_ssp(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_ssp(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> env->ssp = val;
> return RISCV_EXCP_NONE;
> @@ -851,7 +853,7 @@ static RISCVException read_fflags(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_fflags(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> if (riscv_has_ext(env, RVF)) {
> @@ -870,7 +872,7 @@ static RISCVException read_frm(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_frm(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> if (riscv_has_ext(env, RVF)) {
> @@ -890,7 +892,7 @@ static RISCVException read_fcsr(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_fcsr(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> if (riscv_has_ext(env, RVF)) {
> @@ -942,7 +944,7 @@ static RISCVException read_vxrm(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vxrm(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> env->mstatus |= MSTATUS_VS;
> @@ -959,7 +961,7 @@ static RISCVException read_vxsat(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vxsat(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> env->mstatus |= MSTATUS_VS;
> @@ -976,7 +978,7 @@ static RISCVException read_vstart(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vstart(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> env->mstatus |= MSTATUS_VS;
> @@ -997,7 +999,7 @@ static RISCVException read_vcsr(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vcsr(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> #if !defined(CONFIG_USER_ONLY)
> env->mstatus |= MSTATUS_VS;
> @@ -1055,7 +1057,7 @@ static RISCVException read_mcyclecfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mcyclecfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t inh_avail_mask;
>
> @@ -1084,7 +1086,7 @@ static RISCVException read_mcyclecfgh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mcyclecfgh(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> target_ulong inh_avail_mask = (target_ulong)(~MHPMEVENTH_FILTER_MASK |
> MCYCLECFGH_BIT_MINH);
> @@ -1109,7 +1111,7 @@ static RISCVException read_minstretcfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_minstretcfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t inh_avail_mask;
>
> @@ -1136,7 +1138,7 @@ static RISCVException read_minstretcfgh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_minstretcfgh(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> target_ulong inh_avail_mask = (target_ulong)(~MHPMEVENTH_FILTER_MASK |
> MINSTRETCFGH_BIT_MINH);
> @@ -1163,7 +1165,7 @@ static RISCVException read_mhpmevent(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mhpmevent(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> int evt_index = csrno - CSR_MCOUNTINHIBIT;
> uint64_t mhpmevt_val = val;
> @@ -1201,7 +1203,7 @@ static RISCVException read_mhpmeventh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mhpmeventh(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> int evt_index = csrno - CSR_MHPMEVENT3H + 3;
> uint64_t mhpmevth_val;
> @@ -1343,14 +1345,16 @@ static RISCVException riscv_pmu_write_ctrh(CPURISCVState *env, target_ulong val,
> return RISCV_EXCP_NONE;
> }
>
> -static int write_mhpmcounter(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_mhpmcounter(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> int ctr_idx = csrno - CSR_MCYCLE;
>
> return riscv_pmu_write_ctr(env, val, ctr_idx);
> }
>
> -static int write_mhpmcounterh(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_mhpmcounterh(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> int ctr_idx = csrno - CSR_MCYCLEH;
>
> @@ -1661,7 +1665,7 @@ static RISCVException read_vstimecmph(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vstimecmp(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (riscv_cpu_mxl(env) == MXL_RV32) {
> env->vstimecmp = deposit64(env->vstimecmp, 0, 32, (uint64_t)val);
> @@ -1676,7 +1680,7 @@ static RISCVException write_vstimecmp(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vstimecmph(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->vstimecmp = deposit64(env->vstimecmp, 32, 32, (uint64_t)val);
> riscv_timer_write_timecmp(env, env->vstimer, env->vstimecmp,
> @@ -1710,13 +1714,13 @@ static RISCVException read_stimecmph(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_stimecmp(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (env->virt_enabled) {
> if (env->hvictl & HVICTL_VTI) {
> return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
> }
> - return write_vstimecmp(env, csrno, val);
> + return write_vstimecmp(env, csrno, val, ra);
> }
>
> if (riscv_cpu_mxl(env) == MXL_RV32) {
> @@ -1731,13 +1735,13 @@ static RISCVException write_stimecmp(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_stimecmph(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (env->virt_enabled) {
> if (env->hvictl & HVICTL_VTI) {
> return RISCV_EXCP_VIRT_INSTRUCTION_FAULT;
> }
> - return write_vstimecmph(env, csrno, val);
> + return write_vstimecmph(env, csrno, val, ra);
> }
>
> env->stimecmp = deposit64(env->stimecmp, 32, 32, (uint64_t)val);
> @@ -1842,7 +1846,7 @@ static RISCVException read_zero(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_ignore(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> return RISCV_EXCP_NONE;
> }
> @@ -1963,7 +1967,7 @@ static target_ulong legalize_mpp(CPURISCVState *env, target_ulong old_mpp,
> }
>
> static RISCVException write_mstatus(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t mstatus = env->mstatus;
> uint64_t mask = 0;
> @@ -2042,7 +2046,7 @@ static RISCVException read_mstatush(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mstatush(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t valh = (uint64_t)val << 32;
> uint64_t mask = riscv_has_ext(env, RVH) ? MSTATUS_MPV | MSTATUS_GVA : 0;
> @@ -2096,7 +2100,7 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_misa(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> RISCVCPU *cpu = env_archcpu(env);
> uint32_t orig_misa_ext = env->misa_ext;
> @@ -2160,7 +2164,7 @@ static RISCVException read_medeleg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_medeleg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->medeleg = (env->medeleg & ~DELEGABLE_EXCPS) | (val & DELEGABLE_EXCPS);
> return RISCV_EXCP_NONE;
> @@ -2955,7 +2959,7 @@ static RISCVException read_mtvec(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mtvec(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
> if ((val & 3) < 2) {
> @@ -2974,7 +2978,7 @@ static RISCVException read_mcountinhibit(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mcountinhibit(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> int cidx;
> PMUCTRState *counter;
> @@ -3049,10 +3053,9 @@ static RISCVException read_scountinhibit(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_scountinhibit(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> - write_mcountinhibit(env, csrno, val & env->mcounteren);
> - return RISCV_EXCP_NONE;
> + return write_mcountinhibit(env, csrno, val & env->mcounteren, ra);
> }
>
> static RISCVException read_mcounteren(CPURISCVState *env, int csrno,
> @@ -3063,7 +3066,7 @@ static RISCVException read_mcounteren(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mcounteren(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> RISCVCPU *cpu = env_archcpu(env);
>
> @@ -3097,7 +3100,7 @@ static RISCVException read_mscratch(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mscratch(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->mscratch = val;
> return RISCV_EXCP_NONE;
> @@ -3111,7 +3114,7 @@ static RISCVException read_mepc(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mepc(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->mepc = val;
> return RISCV_EXCP_NONE;
> @@ -3125,7 +3128,7 @@ static RISCVException read_mcause(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mcause(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->mcause = val;
> return RISCV_EXCP_NONE;
> @@ -3139,7 +3142,7 @@ static RISCVException read_mtval(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mtval(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->mtval = val;
> return RISCV_EXCP_NONE;
> @@ -3154,9 +3157,9 @@ static RISCVException read_menvcfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
> - target_ulong val);
> + target_ulong val, uintptr_t ra);
> static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
> uint64_t mask = MENVCFG_FIOM | MENVCFG_CBIE | MENVCFG_CBCFE |
> @@ -3188,9 +3191,7 @@ static RISCVException write_menvcfg(CPURISCVState *env, int csrno,
> }
> }
> env->menvcfg = (env->menvcfg & ~mask) | (val & mask);
> - write_henvcfg(env, CSR_HENVCFG, env->henvcfg);
> -
> - return RISCV_EXCP_NONE;
> + return write_henvcfg(env, CSR_HENVCFG, env->henvcfg, ra);
> }
>
> static RISCVException read_menvcfgh(CPURISCVState *env, int csrno,
> @@ -3201,9 +3202,9 @@ static RISCVException read_menvcfgh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_henvcfgh(CPURISCVState *env, int csrno,
> - target_ulong val);
> + target_ulong val, uintptr_t ra);
> static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> const RISCVCPUConfig *cfg = riscv_cpu_cfg(env);
> uint64_t mask = (cfg->ext_svpbmt ? MENVCFG_PBMTE : 0) |
> @@ -3218,9 +3219,7 @@ static RISCVException write_menvcfgh(CPURISCVState *env, int csrno,
> }
>
> env->menvcfg = (env->menvcfg & ~mask) | (valh & mask);
> - write_henvcfgh(env, CSR_HENVCFGH, env->henvcfg >> 32);
> -
> - return RISCV_EXCP_NONE;
> + return write_henvcfgh(env, CSR_HENVCFGH, env->henvcfg >> 32, ra);
> }
>
> static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
> @@ -3238,7 +3237,7 @@ static RISCVException read_senvcfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_senvcfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t mask = SENVCFG_FIOM | SENVCFG_CBIE | SENVCFG_CBCFE | SENVCFG_CBZE;
> RISCVException ret;
> @@ -3295,7 +3294,7 @@ static RISCVException read_henvcfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_henvcfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t mask = HENVCFG_FIOM | HENVCFG_CBIE | HENVCFG_CBCFE | HENVCFG_CBZE;
> RISCVException ret;
> @@ -3350,7 +3349,7 @@ static RISCVException read_henvcfgh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_henvcfgh(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t mask = env->menvcfg & (HENVCFG_PBMTE | HENVCFG_STCE |
> HENVCFG_ADUE | HENVCFG_DTE);
> @@ -3388,7 +3387,7 @@ static RISCVException write_mstateen(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
> if (!riscv_has_ext(env, RVF)) {
> @@ -3420,7 +3419,7 @@ static RISCVException write_mstateen0(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mstateen_1_3(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> return write_mstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
> }
> @@ -3447,7 +3446,7 @@ static RISCVException write_mstateenh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mstateen0h(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
>
> @@ -3463,7 +3462,7 @@ static RISCVException write_mstateen0h(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mstateenh_1_3(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> return write_mstateenh(env, csrno, SMSTATEEN_STATEEN, new_val);
> }
> @@ -3492,7 +3491,7 @@ static RISCVException write_hstateen(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hstateen0(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
>
> @@ -3521,7 +3520,7 @@ static RISCVException write_hstateen0(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hstateen_1_3(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> return write_hstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
> }
> @@ -3552,7 +3551,7 @@ static RISCVException write_hstateenh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hstateen0h(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
>
> @@ -3564,7 +3563,7 @@ static RISCVException write_hstateen0h(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hstateenh_1_3(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> return write_hstateenh(env, csrno, SMSTATEEN_STATEEN, new_val);
> }
> @@ -3603,7 +3602,7 @@ static RISCVException write_sstateen(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_sstateen0(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> uint64_t wr_mask = SMSTATEEN_STATEEN | SMSTATEEN0_HSENVCFG;
>
> @@ -3615,7 +3614,7 @@ static RISCVException write_sstateen0(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_sstateen_1_3(CPURISCVState *env, int csrno,
> - target_ulong new_val)
> + target_ulong new_val, uintptr_t ra)
> {
> return write_sstateen(env, csrno, SMSTATEEN_STATEEN, new_val);
> }
> @@ -3866,7 +3865,7 @@ static RISCVException read_sstatus(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_sstatus(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> target_ulong mask = (sstatus_v1_10_mask);
>
> @@ -3883,7 +3882,7 @@ static RISCVException write_sstatus(CPURISCVState *env, int csrno,
> mask |= SSTATUS_SDT;
> }
> target_ulong newval = (env->mstatus & ~mask) | (val & mask);
> - return write_mstatus(env, CSR_MSTATUS, newval);
> + return write_mstatus(env, CSR_MSTATUS, newval, ra);
> }
>
> static RISCVException rmw_vsie64(CPURISCVState *env, int csrno,
> @@ -4035,7 +4034,7 @@ static RISCVException read_stvec(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_stvec(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
> if ((val & 3) < 2) {
> @@ -4054,7 +4053,7 @@ static RISCVException read_scounteren(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_scounteren(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> RISCVCPU *cpu = env_archcpu(env);
>
> @@ -4088,7 +4087,7 @@ static RISCVException read_sscratch(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_sscratch(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->sscratch = val;
> return RISCV_EXCP_NONE;
> @@ -4102,7 +4101,7 @@ static RISCVException read_sepc(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_sepc(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->sepc = val;
> return RISCV_EXCP_NONE;
> @@ -4116,7 +4115,7 @@ static RISCVException read_scause(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_scause(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->scause = val;
> return RISCV_EXCP_NONE;
> @@ -4130,7 +4129,7 @@ static RISCVException read_stval(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_stval(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->stval = val;
> return RISCV_EXCP_NONE;
> @@ -4270,7 +4269,7 @@ static RISCVException read_satp(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_satp(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (!riscv_cpu_cfg(env)->mmu) {
> return RISCV_EXCP_NONE;
> @@ -4492,7 +4491,7 @@ static RISCVException read_hstatus(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hstatus(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t mask = (target_ulong)-1;
> if (!env_archcpu(env)->cfg.ext_svukte) {
> @@ -4524,7 +4523,7 @@ static RISCVException read_hedeleg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hedeleg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->hedeleg = val & vs_delegable_excps;
> return RISCV_EXCP_NONE;
> @@ -4545,7 +4544,7 @@ static RISCVException read_hedelegh(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hedelegh(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> RISCVException ret;
> ret = smstateen_acc_ok(env, 0, SMSTATEEN0_P1P13);
> @@ -4808,7 +4807,7 @@ static RISCVException read_hcounteren(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hcounteren(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> RISCVCPU *cpu = env_archcpu(env);
>
> @@ -4828,7 +4827,7 @@ static RISCVException read_hgeie(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hgeie(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> /* Only GEILEN:1 bits implemented and BIT0 is never implemented */
> val &= ((((target_ulong)1) << env->geilen) - 1) << 1;
> @@ -4847,7 +4846,7 @@ static RISCVException read_htval(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_htval(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->htval = val;
> return RISCV_EXCP_NONE;
> @@ -4861,7 +4860,7 @@ static RISCVException read_htinst(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_htinst(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> return RISCV_EXCP_NONE;
> }
> @@ -4883,7 +4882,7 @@ static RISCVException read_hgatp(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hgatp(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->hgatp = legalize_xatp(env, env->hgatp, val);
> return RISCV_EXCP_NONE;
> @@ -4901,7 +4900,7 @@ static RISCVException read_htimedelta(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_htimedelta(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (!env->rdtime_fn) {
> return RISCV_EXCP_ILLEGAL_INST;
> @@ -4933,7 +4932,7 @@ static RISCVException read_htimedeltah(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_htimedeltah(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (!env->rdtime_fn) {
> return RISCV_EXCP_ILLEGAL_INST;
> @@ -4957,7 +4956,7 @@ static RISCVException read_hvictl(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hvictl(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->hvictl = val & HVICTL_VALID_MASK;
> return RISCV_EXCP_NONE;
> @@ -5022,7 +5021,7 @@ static RISCVException read_hviprio1(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hviprio1(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> return write_hvipriox(env, 0, env->hviprio, val);
> }
> @@ -5034,7 +5033,7 @@ static RISCVException read_hviprio1h(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hviprio1h(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> return write_hvipriox(env, 4, env->hviprio, val);
> }
> @@ -5046,7 +5045,7 @@ static RISCVException read_hviprio2(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hviprio2(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> return write_hvipriox(env, 8, env->hviprio, val);
> }
> @@ -5058,7 +5057,7 @@ static RISCVException read_hviprio2h(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_hviprio2h(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> return write_hvipriox(env, 12, env->hviprio, val);
> }
> @@ -5072,7 +5071,7 @@ static RISCVException read_vsstatus(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vsstatus(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint64_t mask = (target_ulong)-1;
> if ((val & VSSTATUS64_UXL) == 0) {
> @@ -5097,7 +5096,7 @@ static RISCVException read_vstvec(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vstvec(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> /* bits [1:0] encode mode; 0 = direct, 1 = vectored, 2 >= reserved */
> if ((val & 3) < 2) {
> @@ -5116,7 +5115,7 @@ static RISCVException read_vsscratch(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vsscratch(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->vsscratch = val;
> return RISCV_EXCP_NONE;
> @@ -5130,7 +5129,7 @@ static RISCVException read_vsepc(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vsepc(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->vsepc = val;
> return RISCV_EXCP_NONE;
> @@ -5144,7 +5143,7 @@ static RISCVException read_vscause(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vscause(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->vscause = val;
> return RISCV_EXCP_NONE;
> @@ -5158,7 +5157,7 @@ static RISCVException read_vstval(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vstval(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->vstval = val;
> return RISCV_EXCP_NONE;
> @@ -5172,7 +5171,7 @@ static RISCVException read_vsatp(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_vsatp(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->vsatp = legalize_xatp(env, env->vsatp, val);
> return RISCV_EXCP_NONE;
> @@ -5186,7 +5185,7 @@ static RISCVException read_mtval2(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mtval2(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->mtval2 = val;
> return RISCV_EXCP_NONE;
> @@ -5200,7 +5199,7 @@ static RISCVException read_mtinst(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mtinst(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->mtinst = val;
> return RISCV_EXCP_NONE;
> @@ -5215,7 +5214,7 @@ static RISCVException read_mseccfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mseccfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> mseccfg_csr_write(env, val);
> return RISCV_EXCP_NONE;
> @@ -5231,7 +5230,7 @@ static RISCVException read_pmpcfg(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_pmpcfg(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> uint32_t reg_index = csrno - CSR_PMPCFG0;
>
> @@ -5247,7 +5246,7 @@ static RISCVException read_pmpaddr(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_pmpaddr(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> pmpaddr_csr_write(env, csrno - CSR_PMPADDR0, val);
> return RISCV_EXCP_NONE;
> @@ -5261,7 +5260,7 @@ static RISCVException read_tselect(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_tselect(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> tselect_csr_write(env, val);
> return RISCV_EXCP_NONE;
> @@ -5285,7 +5284,7 @@ static RISCVException read_tdata(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_tdata(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> if (!tdata_available(env, csrno - CSR_TDATA1)) {
> return RISCV_EXCP_ILLEGAL_INST;
> @@ -5310,7 +5309,7 @@ static RISCVException read_mcontext(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_mcontext(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> bool rv32 = riscv_cpu_mxl(env) == MXL_RV32 ? true : false;
> int32_t mask;
> @@ -5334,43 +5333,50 @@ static RISCVException read_mnscratch(CPURISCVState *env, int csrno,
> return RISCV_EXCP_NONE;
> }
>
> -static int write_mnscratch(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_mnscratch(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> env->mnscratch = val;
> return RISCV_EXCP_NONE;
> }
>
> -static int read_mnepc(CPURISCVState *env, int csrno, target_ulong *val)
> +static RISCVException read_mnepc(CPURISCVState *env, int csrno,
> + target_ulong *val)
> {
> *val = env->mnepc;
> return RISCV_EXCP_NONE;
> }
>
> -static int write_mnepc(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_mnepc(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> env->mnepc = val;
> return RISCV_EXCP_NONE;
> }
>
> -static int read_mncause(CPURISCVState *env, int csrno, target_ulong *val)
> +static RISCVException read_mncause(CPURISCVState *env, int csrno,
> + target_ulong *val)
> {
> *val = env->mncause;
> return RISCV_EXCP_NONE;
> }
>
> -static int write_mncause(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_mncause(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> env->mncause = val;
> return RISCV_EXCP_NONE;
> }
>
> -static int read_mnstatus(CPURISCVState *env, int csrno, target_ulong *val)
> +static RISCVException read_mnstatus(CPURISCVState *env, int csrno,
> + target_ulong *val)
> {
> *val = env->mnstatus;
> return RISCV_EXCP_NONE;
> }
>
> -static int write_mnstatus(CPURISCVState *env, int csrno, target_ulong val)
> +static RISCVException write_mnstatus(CPURISCVState *env, int csrno,
> + target_ulong val, uintptr_t ra)
> {
> target_ulong mask = (MNSTATUS_NMIE | MNSTATUS_MNPP);
>
> @@ -5540,7 +5546,7 @@ static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
> if (write_mask) {
> new_value = (old_value & ~write_mask) | (new_value & write_mask);
> if (csr_ops[csrno].write) {
> - ret = csr_ops[csrno].write(env, csrno, new_value);
> + ret = csr_ops[csrno].write(env, csrno, new_value, 0);
> if (ret != RISCV_EXCP_NONE) {
> return ret;
> }
> @@ -5603,7 +5609,7 @@ static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
> }
> } else if (csr_ops[csrno].write) {
> /* avoids having to write wrappers for all registers */
> - ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value));
> + ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value), 0);
> if (ret != RISCV_EXCP_NONE) {
> return ret;
> }
> @@ -5714,7 +5720,7 @@ static RISCVException read_jvt(CPURISCVState *env, int csrno,
> }
>
> static RISCVException write_jvt(CPURISCVState *env, int csrno,
> - target_ulong val)
> + target_ulong val, uintptr_t ra)
> {
> env->jvt = val;
> return RISCV_EXCP_NONE;
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64
2025-04-25 15:23 ` [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64 Richard Henderson
2025-04-25 22:29 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:34 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:34 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:25 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/csr.c | 15 +++++++--------
> 1 file changed, 7 insertions(+), 8 deletions(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index 6f1f69eba6..e9c2f95b6e 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -5516,7 +5516,8 @@ static inline RISCVException riscv_csrrw_check(CPURISCVState *env,
> static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
> target_ulong *ret_value,
> target_ulong new_value,
> - target_ulong write_mask)
> + target_ulong write_mask,
> + uintptr_t ra)
> {
> RISCVException ret;
> target_ulong old_value = 0;
> @@ -5546,7 +5547,7 @@ static RISCVException riscv_csrrw_do64(CPURISCVState *env, int csrno,
> if (write_mask) {
> new_value = (old_value & ~write_mask) | (new_value & write_mask);
> if (csr_ops[csrno].write) {
> - ret = csr_ops[csrno].write(env, csrno, new_value, 0);
> + ret = csr_ops[csrno].write(env, csrno, new_value, ra);
> if (ret != RISCV_EXCP_NONE) {
> return ret;
> }
> @@ -5569,7 +5570,7 @@ RISCVException riscv_csrr(CPURISCVState *env, int csrno,
> return ret;
> }
>
> - return riscv_csrrw_do64(env, csrno, ret_value, 0, 0);
> + return riscv_csrrw_do64(env, csrno, ret_value, 0, 0, 0);
> }
>
> RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
> @@ -5581,7 +5582,7 @@ RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
> return ret;
> }
>
> - return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask);
> + return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, 0);
> }
>
> static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
> @@ -5647,9 +5648,7 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
> * accesses
> */
> target_ulong old_value;
> - ret = riscv_csrrw_do64(env, csrno, &old_value,
> - (target_ulong)0,
> - (target_ulong)0);
> + ret = riscv_csrrw_do64(env, csrno, &old_value, 0, 0, 0);
> if (ret == RISCV_EXCP_NONE && ret_value) {
> *ret_value = int128_make64(old_value);
> }
> @@ -5681,7 +5680,7 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
> target_ulong old_value;
> ret = riscv_csrrw_do64(env, csrno, &old_value,
> int128_getlo(new_value),
> - int128_getlo(write_mask));
> + int128_getlo(write_mask), 0);
> if (ret == RISCV_EXCP_NONE && ret_value) {
> *ret_value = int128_make64(old_value);
> }
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128
2025-04-25 15:23 ` [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128 Richard Henderson
2025-04-25 22:29 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:34 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:34 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:24 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/csr.c | 9 +++++----
> 1 file changed, 5 insertions(+), 4 deletions(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index e9c2f95b6e..d62d1aaaee 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -5588,7 +5588,7 @@ RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
> static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
> Int128 *ret_value,
> Int128 new_value,
> - Int128 write_mask)
> + Int128 write_mask, uintptr_t ra)
> {
> RISCVException ret;
> Int128 old_value;
> @@ -5610,7 +5610,7 @@ static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
> }
> } else if (csr_ops[csrno].write) {
> /* avoids having to write wrappers for all registers */
> - ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value), 0);
> + ret = csr_ops[csrno].write(env, csrno, int128_getlo(new_value), ra);
> if (ret != RISCV_EXCP_NONE) {
> return ret;
> }
> @@ -5637,7 +5637,7 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
>
> if (csr_ops[csrno].read128) {
> return riscv_csrrw_do128(env, csrno, ret_value,
> - int128_zero(), int128_zero());
> + int128_zero(), int128_zero(), 0);
> }
>
> /*
> @@ -5667,7 +5667,8 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
> }
>
> if (csr_ops[csrno].read128) {
> - return riscv_csrrw_do128(env, csrno, ret_value, new_value, write_mask);
> + return riscv_csrrw_do128(env, csrno, ret_value,
> + new_value, write_mask, 0);
> }
>
> /*
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw
2025-04-25 15:23 ` [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw Richard Henderson
2025-04-25 22:31 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:36 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:36 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:26 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.h | 8 ++++----
> hw/riscv/riscv_hart.c | 2 +-
> target/riscv/csr.c | 8 ++++----
> target/riscv/op_helper.c | 4 ++--
> 4 files changed, 11 insertions(+), 11 deletions(-)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 4d41a66d72..2c0524d0be 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -816,8 +816,8 @@ RISCVException riscv_csrr(CPURISCVState *env, int csrno,
> target_ulong *ret_value);
>
> RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
> - target_ulong *ret_value,
> - target_ulong new_value, target_ulong write_mask);
> + target_ulong *ret_value, target_ulong new_value,
> + target_ulong write_mask, uintptr_t ra);
> RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
> target_ulong *ret_value,
> target_ulong new_value,
> @@ -826,13 +826,13 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
> static inline void riscv_csr_write(CPURISCVState *env, int csrno,
> target_ulong val)
> {
> - riscv_csrrw(env, csrno, NULL, val, MAKE_64BIT_MASK(0, TARGET_LONG_BITS));
> + riscv_csrrw(env, csrno, NULL, val, MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
> }
>
> static inline target_ulong riscv_csr_read(CPURISCVState *env, int csrno)
> {
> target_ulong val = 0;
> - riscv_csrrw(env, csrno, &val, 0, 0);
> + riscv_csrrw(env, csrno, &val, 0, 0, 0);
> return val;
> }
>
> diff --git a/hw/riscv/riscv_hart.c b/hw/riscv/riscv_hart.c
> index a55d156668..2ebbf41b18 100644
> --- a/hw/riscv/riscv_hart.c
> +++ b/hw/riscv/riscv_hart.c
> @@ -72,7 +72,7 @@ static void csr_call(char *cmd, uint64_t cpu_num, int csrno, uint64_t *val)
> ret = riscv_csrr(env, csrno, (target_ulong *)val);
> } else if (strcmp(cmd, "set_csr") == 0) {
> ret = riscv_csrrw(env, csrno, NULL, *(target_ulong *)val,
> - MAKE_64BIT_MASK(0, TARGET_LONG_BITS));
> + MAKE_64BIT_MASK(0, TARGET_LONG_BITS), 0);
> }
>
> g_assert(ret == RISCV_EXCP_NONE);
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index d62d1aaaee..097640e25d 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -5574,15 +5574,15 @@ RISCVException riscv_csrr(CPURISCVState *env, int csrno,
> }
>
> RISCVException riscv_csrrw(CPURISCVState *env, int csrno,
> - target_ulong *ret_value,
> - target_ulong new_value, target_ulong write_mask)
> + target_ulong *ret_value, target_ulong new_value,
> + target_ulong write_mask, uintptr_t ra)
> {
> RISCVException ret = riscv_csrrw_check(env, csrno, true);
> if (ret != RISCV_EXCP_NONE) {
> return ret;
> }
>
> - return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, 0);
> + return riscv_csrrw_do64(env, csrno, ret_value, new_value, write_mask, ra);
> }
>
> static RISCVException riscv_csrrw_do128(CPURISCVState *env, int csrno,
> @@ -5704,7 +5704,7 @@ RISCVException riscv_csrrw_debug(CPURISCVState *env, int csrno,
> if (!write_mask) {
> ret = riscv_csrr(env, csrno, ret_value);
> } else {
> - ret = riscv_csrrw(env, csrno, ret_value, new_value, write_mask);
> + ret = riscv_csrrw(env, csrno, ret_value, new_value, write_mask, 0);
> }
> #if !defined(CONFIG_USER_ONLY)
> env->debugger = false;
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index 5b0db2c45a..aee16e2e3a 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -71,7 +71,7 @@ target_ulong helper_csrr(CPURISCVState *env, int csr)
> void helper_csrw(CPURISCVState *env, int csr, target_ulong src)
> {
> target_ulong mask = env->xl == MXL_RV32 ? UINT32_MAX : (target_ulong)-1;
> - RISCVException ret = riscv_csrrw(env, csr, NULL, src, mask);
> + RISCVException ret = riscv_csrrw(env, csr, NULL, src, mask, GETPC());
>
> if (ret != RISCV_EXCP_NONE) {
> riscv_raise_exception(env, ret, GETPC());
> @@ -82,7 +82,7 @@ target_ulong helper_csrrw(CPURISCVState *env, int csr,
> target_ulong src, target_ulong write_mask)
> {
> target_ulong val = 0;
> - RISCVException ret = riscv_csrrw(env, csr, &val, src, write_mask);
> + RISCVException ret = riscv_csrrw(env, csr, &val, src, write_mask, GETPC());
>
> if (ret != RISCV_EXCP_NONE) {
> riscv_raise_exception(env, ret, GETPC());
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128
2025-04-25 15:23 ` [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128 Richard Henderson
2025-04-25 22:32 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:37 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:37 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:23 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/cpu.h | 4 ++--
> target/riscv/csr.c | 8 ++++----
> target/riscv/op_helper.c | 9 +++++----
> 3 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/target/riscv/cpu.h b/target/riscv/cpu.h
> index 2c0524d0be..8b84793b15 100644
> --- a/target/riscv/cpu.h
> +++ b/target/riscv/cpu.h
> @@ -851,8 +851,8 @@ typedef RISCVException (*riscv_csr_op_fn)(CPURISCVState *env, int csrno,
> RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
> Int128 *ret_value);
> RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
> - Int128 *ret_value,
> - Int128 new_value, Int128 write_mask);
> + Int128 *ret_value, Int128 new_value,
> + Int128 write_mask, uintptr_t ra);
>
> typedef RISCVException (*riscv_csr_read128_fn)(CPURISCVState *env, int csrno,
> Int128 *ret_value);
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index 097640e25d..a663f527a4 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -5656,8 +5656,8 @@ RISCVException riscv_csrr_i128(CPURISCVState *env, int csrno,
> }
>
> RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
> - Int128 *ret_value,
> - Int128 new_value, Int128 write_mask)
> + Int128 *ret_value, Int128 new_value,
> + Int128 write_mask, uintptr_t ra)
> {
> RISCVException ret;
>
> @@ -5668,7 +5668,7 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
>
> if (csr_ops[csrno].read128) {
> return riscv_csrrw_do128(env, csrno, ret_value,
> - new_value, write_mask, 0);
> + new_value, write_mask, ra);
> }
>
> /*
> @@ -5681,7 +5681,7 @@ RISCVException riscv_csrrw_i128(CPURISCVState *env, int csrno,
> target_ulong old_value;
> ret = riscv_csrrw_do64(env, csrno, &old_value,
> int128_getlo(new_value),
> - int128_getlo(write_mask), 0);
> + int128_getlo(write_mask), ra);
> if (ret == RISCV_EXCP_NONE && ret_value) {
> *ret_value = int128_make64(old_value);
> }
> diff --git a/target/riscv/op_helper.c b/target/riscv/op_helper.c
> index aee16e2e3a..e3770a2655 100644
> --- a/target/riscv/op_helper.c
> +++ b/target/riscv/op_helper.c
> @@ -108,7 +108,7 @@ void helper_csrw_i128(CPURISCVState *env, int csr,
> {
> RISCVException ret = riscv_csrrw_i128(env, csr, NULL,
> int128_make128(srcl, srch),
> - UINT128_MAX);
> + UINT128_MAX, GETPC());
>
> if (ret != RISCV_EXCP_NONE) {
> riscv_raise_exception(env, ret, GETPC());
> @@ -116,13 +116,14 @@ void helper_csrw_i128(CPURISCVState *env, int csr,
> }
>
> target_ulong helper_csrrw_i128(CPURISCVState *env, int csr,
> - target_ulong srcl, target_ulong srch,
> - target_ulong maskl, target_ulong maskh)
> + target_ulong srcl, target_ulong srch,
> + target_ulong maskl, target_ulong maskh)
> {
> Int128 rv = int128_zero();
> RISCVException ret = riscv_csrrw_i128(env, csr, &rv,
> int128_make128(srcl, srch),
> - int128_make128(maskl, maskh));
> + int128_make128(maskl, maskh),
> + GETPC());
>
> if (ret != RISCV_EXCP_NONE) {
> riscv_raise_exception(env, ret, GETPC());
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 6/7] target/riscv: Move insn_len to internals.h
2025-04-25 15:23 ` [PATCH 6/7] target/riscv: Move insn_len to internals.h Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:37 ` Alistair Francis
1 sibling, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:37 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:24 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/internals.h | 5 +++++
> target/riscv/translate.c | 5 -----
> 2 files changed, 5 insertions(+), 5 deletions(-)
>
> diff --git a/target/riscv/internals.h b/target/riscv/internals.h
> index 213aff31d8..4570bd50be 100644
> --- a/target/riscv/internals.h
> +++ b/target/riscv/internals.h
> @@ -201,4 +201,9 @@ static inline target_ulong adjust_addr_virt(CPURISCVState *env,
> return adjust_addr_body(env, addr, true);
> }
>
> +static inline int insn_len(uint16_t first_word)
> +{
> + return (first_word & 3) == 3 ? 4 : 2;
> +}
> +
> #endif
> diff --git a/target/riscv/translate.c b/target/riscv/translate.c
> index cef61b5b29..9836ab8c20 100644
> --- a/target/riscv/translate.c
> +++ b/target/riscv/translate.c
> @@ -1210,11 +1210,6 @@ static uint32_t opcode_at(DisasContextBase *dcbase, target_ulong pc)
> /* The specification allows for longer insns, but not supported by qemu. */
> #define MAX_INSN_LEN 4
>
> -static inline int insn_len(uint16_t first_word)
> -{
> - return (first_word & 3) == 3 ? 4 : 2;
> -}
> -
> const RISCVDecoder decoder_table[] = {
> { always_true_p, decode_insn32 },
> { has_xthead_p, decode_xthead},
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
@ 2025-04-28 22:39 ` Alistair Francis
2025-04-29 14:33 ` Richard Henderson
2025-05-14 21:33 ` Daniel Henrique Barboza
3 siblings, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:39 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:26 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> Do not examine a random host return address, but
> properly compute the next pc for the guest cpu.
>
> Fixes: f18637cd611 ("RISC-V: Add misa runtime write support")
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
Alistair
> ---
> target/riscv/csr.c | 22 +++++++++++++++++-----
> 1 file changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index a663f527a4..85f9b4c3d2 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -30,6 +30,8 @@
> #include "exec/icount.h"
> #include "qemu/guest-random.h"
> #include "qapi/error.h"
> +#include "tcg/insn-start-words.h"
> +#include "internals.h"
> #include <stdbool.h>
>
> /* CSR function table public API */
> @@ -2099,6 +2101,19 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
> return RISCV_EXCP_NONE;
> }
>
> +static target_ulong get_next_pc(CPURISCVState *env, uintptr_t ra)
> +{
> + uint64_t data[TARGET_INSN_START_WORDS];
> +
> + /* Outside of a running cpu, env contains the next pc. */
> + if (ra == 0 || !cpu_unwind_state_data(env_cpu(env), ra, data)) {
> + return env->pc;
> + }
> +
> + /* Within unwind data, [0] is pc and [1] is the opcode. */
> + return data[0] + insn_len(data[1]);
> +}
> +
> static RISCVException write_misa(CPURISCVState *env, int csrno,
> target_ulong val, uintptr_t ra)
> {
> @@ -2114,11 +2129,8 @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
> /* Mask extensions that are not supported by this hart */
> val &= env->misa_ext_mask;
>
> - /*
> - * Suppress 'C' if next instruction is not aligned
> - * TODO: this should check next_pc
> - */
> - if ((val & RVC) && (GETPC() & ~3) != 0) {
> + /* Suppress 'C' if next instruction is not aligned. */
> + if ((val & RVC) && (get_next_pc(env, ra) & ~3) != 0) {
> val &= ~RVC;
> }
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (7 preceding siblings ...)
2025-04-26 8:25 ` [PATCH 0/7] " Daniel Henrique Barboza
@ 2025-04-28 22:46 ` Alistair Francis
8 siblings, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-28 22:46 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Sat, Apr 26, 2025 at 1:25 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> As discussed, the use of GETPC() within write_misa is wrong.
> I've done just enough plumbing to get the helper return address
> piped down to write_misa, so that we can make use of unwind data.
Thanks Richard!
>
> AFAIK, nothing in check-tcg or check-functional would test this.
> It shouldn't be too hard to write a test akin to issue1060.S,
> but I'm going to leave that to someone else.
>
>
> r~
>
>
> Richard Henderson (7):
> target/riscv: Pass ra to riscv_csr_write_fn
> target/riscv: Pass ra to riscv_csrrw_do64
> target/riscv: Pass ra to riscv_csrrw_do128
> target/riscv: Pass ra to riscv_csrrw
> target/riscv: Pass ra to riscv_csrrw_i128
> target/riscv: Move insn_len to internals.h
> target/riscv: Fix write_misa vs aligned next_pc
Applied to riscv-to-apply.next
Alistair
>
> target/riscv/cpu.h | 15 ++-
> target/riscv/internals.h | 5 +
> hw/riscv/riscv_hart.c | 2 +-
> target/riscv/csr.c | 278 +++++++++++++++++++++------------------
> target/riscv/op_helper.c | 13 +-
> target/riscv/translate.c | 5 -
> 6 files changed, 169 insertions(+), 149 deletions(-)
>
> --
> 2.43.0
>
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
2025-04-28 22:39 ` Alistair Francis
@ 2025-04-29 14:33 ` Richard Henderson
2025-04-30 22:44 ` Alistair Francis
2025-05-14 21:33 ` Daniel Henrique Barboza
3 siblings, 1 reply; 28+ messages in thread
From: Richard Henderson @ 2025-04-29 14:33 UTC (permalink / raw)
To: qemu-devel; +Cc: qemu-riscv, alistair.francis, dbarboza, Alistair Francis
On 4/25/25 08:23, Richard Henderson wrote:
> - if ((val & RVC) && (GETPC() & ~3) != 0) {
> + /* Suppress 'C' if next instruction is not aligned. */
> + if ((val & RVC) && (get_next_pc(env, ra) & ~3) != 0) {
Bah. I preserved a second bug here: not "& ~3" but "& 3".
r~
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-29 14:33 ` Richard Henderson
@ 2025-04-30 22:44 ` Alistair Francis
0 siblings, 0 replies; 28+ messages in thread
From: Alistair Francis @ 2025-04-30 22:44 UTC (permalink / raw)
To: Richard Henderson; +Cc: qemu-devel, qemu-riscv, alistair.francis, dbarboza
On Wed, Apr 30, 2025 at 12:34 AM Richard Henderson
<richard.henderson@linaro.org> wrote:
>
> On 4/25/25 08:23, Richard Henderson wrote:
> > - if ((val & RVC) && (GETPC() & ~3) != 0) {
> > + /* Suppress 'C' if next instruction is not aligned. */
> > + if ((val & RVC) && (get_next_pc(env, ra) & ~3) != 0) {
>
> Bah. I preserved a second bug here: not "& ~3" but "& 3".
Good catch
I squashed this fix into the patch
Alistair
>
>
> r~
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
` (2 preceding siblings ...)
2025-04-29 14:33 ` Richard Henderson
@ 2025-05-14 21:33 ` Daniel Henrique Barboza
2025-05-15 8:10 ` Richard Henderson
3 siblings, 1 reply; 28+ messages in thread
From: Daniel Henrique Barboza @ 2025-05-14 21:33 UTC (permalink / raw)
To: Richard Henderson, qemu-devel; +Cc: qemu-riscv, alistair.francis
Richard,
On 4/25/25 12:23 PM, Richard Henderson wrote:
> Do not examine a random host return address, but
> properly compute the next pc for the guest cpu.
>
> Fixes: f18637cd611 ("RISC-V: Add misa runtime write support")
> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
> ---
> target/riscv/csr.c | 22 +++++++++++++++++-----
> 1 file changed, 17 insertions(+), 5 deletions(-)
>
> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
> index a663f527a4..85f9b4c3d2 100644
> --- a/target/riscv/csr.c
> +++ b/target/riscv/csr.c
> @@ -30,6 +30,8 @@
> #include "exec/icount.h"
> #include "qemu/guest-random.h"
> #include "qapi/error.h"
> +#include "tcg/insn-start-words.h"
> +#include "internals.h"
> #include <stdbool.h>
>
> /* CSR function table public API */
> @@ -2099,6 +2101,19 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
> return RISCV_EXCP_NONE;
> }
>
> +static target_ulong get_next_pc(CPURISCVState *env, uintptr_t ra)
> +{
> + uint64_t data[TARGET_INSN_START_WORDS];
Isn't this 'INSN_START_WORDS'? I'm seeing code in i386 that is similar
to what we're doing here and it's using INSN_START_WORDS:
====
static inline target_ulong get_memio_eip(CPUX86State *env)
{
#ifdef CONFIG_TCG
uint64_t data[INSN_START_WORDS];
CPUState *cs = env_cpu(env);
if (!cpu_unwind_state_data(cs, cs->mem_io_pc, data)) {
return env->eip;
}
/* Per x86_restore_state_to_opc. */
if (tcg_cflags_has(cs, CF_PCREL)) {
return (env->eip & TARGET_PAGE_MASK) | data[0];
} else {
return data[0] - env->segs[R_CS].base;
}
#else
qemu_build_not_reached();
#endif
}
====
I'm asking because the build in Alistair's branch is failing with this error:
../target/riscv/csr.c: In function ‘get_next_pc’:
../target/riscv/csr.c:2106:19: error: ‘TARGET_INSN_START_WORDS’ undeclared (first use in this function); did you mean ‘TCG_INSN_START_WORDS’?
2106 | uint64_t data[TARGET_INSN_START_WORDS];
| ^~~~~~~~~~~~~~~~~~~~~~~
| TCG_INSN_START_WORDS
../target/riscv/csr.c:2106:19: note: each undeclared identifier is reported only once for each function it appears in
../target/riscv/csr.c:2106:14: error: unused variable ‘data’ [-Werror=unused-variable]
2106 | uint64_t data[TARGET_INSN_START_WORDS];
| ^~~~
../target/riscv/csr.c:2115:1: error: control reaches end of non-void function [-Werror=return-type]
2115 | }
| ^
cc1: all warnings being treated as errors
[2206/3000] Compiling C object libqemu-riscv
Changing TARGET_INSN_START_WORDS to INSN_START_WORDS fixes the build issue.
Thanks,
Daniel
> +
> + /* Outside of a running cpu, env contains the next pc. */
> + if (ra == 0 || !cpu_unwind_state_data(env_cpu(env), ra, data)) {
> + return env->pc;
> + }
> +
> + /* Within unwind data, [0] is pc and [1] is the opcode. */
> + return data[0] + insn_len(data[1]);
> +}
> +
> static RISCVException write_misa(CPURISCVState *env, int csrno,
> target_ulong val, uintptr_t ra)
> {
> @@ -2114,11 +2129,8 @@ static RISCVException write_misa(CPURISCVState *env, int csrno,
> /* Mask extensions that are not supported by this hart */
> val &= env->misa_ext_mask;
>
> - /*
> - * Suppress 'C' if next instruction is not aligned
> - * TODO: this should check next_pc
> - */
> - if ((val & RVC) && (GETPC() & ~3) != 0) {
> + /* Suppress 'C' if next instruction is not aligned. */
> + if ((val & RVC) && (get_next_pc(env, ra) & ~3) != 0) {
> val &= ~RVC;
> }
>
^ permalink raw reply [flat|nested] 28+ messages in thread
* Re: [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc
2025-05-14 21:33 ` Daniel Henrique Barboza
@ 2025-05-15 8:10 ` Richard Henderson
0 siblings, 0 replies; 28+ messages in thread
From: Richard Henderson @ 2025-05-15 8:10 UTC (permalink / raw)
To: Daniel Henrique Barboza, qemu-devel; +Cc: qemu-riscv, alistair.francis
On 5/14/25 22:33, Daniel Henrique Barboza wrote:
> Richard,
>
> On 4/25/25 12:23 PM, Richard Henderson wrote:
>> Do not examine a random host return address, but
>> properly compute the next pc for the guest cpu.
>>
>> Fixes: f18637cd611 ("RISC-V: Add misa runtime write support")
>> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
>> ---
>> target/riscv/csr.c | 22 +++++++++++++++++-----
>> 1 file changed, 17 insertions(+), 5 deletions(-)
>>
>> diff --git a/target/riscv/csr.c b/target/riscv/csr.c
>> index a663f527a4..85f9b4c3d2 100644
>> --- a/target/riscv/csr.c
>> +++ b/target/riscv/csr.c
>> @@ -30,6 +30,8 @@
>> #include "exec/icount.h"
>> #include "qemu/guest-random.h"
>> #include "qapi/error.h"
>> +#include "tcg/insn-start-words.h"
>> +#include "internals.h"
>> #include <stdbool.h>
>> /* CSR function table public API */
>> @@ -2099,6 +2101,19 @@ static RISCVException read_misa(CPURISCVState *env, int csrno,
>> return RISCV_EXCP_NONE;
>> }
>> +static target_ulong get_next_pc(CPURISCVState *env, uintptr_t ra)
>> +{
>> + uint64_t data[TARGET_INSN_START_WORDS];
>
> Isn't this 'INSN_START_WORDS'? I'm seeing code in i386 that is similar
> to what we're doing here and it's using INSN_START_WORDS:
Yes, though INSN_START_WORDS is a very recent change.
Probably the week after I posted this patch set. :-)
r~
^ permalink raw reply [flat|nested] 28+ messages in thread
end of thread, other threads:[~2025-05-15 8:13 UTC | newest]
Thread overview: 28+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-04-25 15:23 [PATCH 0/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
2025-04-25 15:23 ` [PATCH 1/7] target/riscv: Pass ra to riscv_csr_write_fn Richard Henderson
2025-04-25 22:28 ` Philippe Mathieu-Daudé
2025-04-28 22:33 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 2/7] target/riscv: Pass ra to riscv_csrrw_do64 Richard Henderson
2025-04-25 22:29 ` Philippe Mathieu-Daudé
2025-04-28 22:34 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 3/7] target/riscv: Pass ra to riscv_csrrw_do128 Richard Henderson
2025-04-25 22:29 ` Philippe Mathieu-Daudé
2025-04-28 22:34 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 4/7] target/riscv: Pass ra to riscv_csrrw Richard Henderson
2025-04-25 22:31 ` Philippe Mathieu-Daudé
2025-04-28 22:36 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 5/7] target/riscv: Pass ra to riscv_csrrw_i128 Richard Henderson
2025-04-25 22:32 ` Philippe Mathieu-Daudé
2025-04-28 22:37 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 6/7] target/riscv: Move insn_len to internals.h Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
2025-04-28 22:37 ` Alistair Francis
2025-04-25 15:23 ` [PATCH 7/7] target/riscv: Fix write_misa vs aligned next_pc Richard Henderson
2025-04-25 22:33 ` Philippe Mathieu-Daudé
2025-04-28 22:39 ` Alistair Francis
2025-04-29 14:33 ` Richard Henderson
2025-04-30 22:44 ` Alistair Francis
2025-05-14 21:33 ` Daniel Henrique Barboza
2025-05-15 8:10 ` Richard Henderson
2025-04-26 8:25 ` [PATCH 0/7] " Daniel Henrique Barboza
2025-04-28 22:46 ` Alistair Francis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).