* [PATCH] target/riscv: use SXL instead of MXL for read_sstatus
@ 2026-07-20 10:56 Abhigyan Kumar
0 siblings, 0 replies; only message in thread
From: Abhigyan Kumar @ 2026-07-20 10:56 UTC (permalink / raw)
To: qemu-devel
Cc: qemu-riscv, Alistair Francis, Weiwei Li, Daniel Henrique Barboza,
Liu Zhiwei, Chao Liu, Palmer Dabbelt, Abhigyan Kumar
According to the RISC-V spec, a 64-bit system can have M-mode in 64-bit
with S-mode being 32-bit (SXL bits or mstatus[35:34] being 1). In this
case, read_sstatus should use SXL.
QEMU doesn't allow changing the SXL bits in mstatus in M-mode. This was
because of the missing MSTATUS64_SXL mask in write_mstatus. Now, both
the SXL field in mstatus can be safely modified in M-mode and
read_sstatus correctly uses SXL not MXL.
Signed-off-by: Abhigyan Kumar <314abh@gmail.com>
---
target/riscv/tcg/csr.c | 9 +++++++--
1 file changed, 7 insertions(+), 2 deletions(-)
diff --git a/target/riscv/tcg/csr.c b/target/riscv/tcg/csr.c
index 36f2004bc..b67a5a301 100644
--- a/target/riscv/tcg/csr.c
+++ b/target/riscv/tcg/csr.c
@@ -2067,6 +2067,11 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno,
}
if (xl != MXL_RV32 || env->debugger) {
+ if ((val & MSTATUS64_SXL) != 0) {
+ mask |= MSTATUS64_SXL;
+ val = riscv_write_uxl(env, val, MSTATUS64_SXL);
+ }
+
if ((val & MSTATUS64_UXL) != 0) {
mask |= MSTATUS64_UXL;
val = riscv_write_uxl(env, val, MSTATUS64_UXL);
@@ -4014,8 +4019,8 @@ static RISCVException read_sstatus(CPURISCVState *env, int csrno,
if (riscv_cpu_cfg(env)->ext_ssdbltrp) {
mask |= SSTATUS_SDT;
}
- /* TODO: Use SXL not MXL. */
- *val = add_status_sd(riscv_cpu_mxl(env), env->mstatus & mask);
+
+ *val = add_status_sd(riscv_cpu_sxl(env), env->mstatus & mask);
return RISCV_EXCP_NONE;
}
--
2.55.0
^ permalink raw reply related [flat|nested] only message in thread
only message in thread, other threads:[~2026-07-20 10:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-20 10:56 [PATCH] target/riscv: use SXL instead of MXL for read_sstatus Abhigyan Kumar
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.