From: Daniel Henrique Barboza Date: Thu, 14 May 2026 19:45:37 +0000 (-0300) Subject: target/riscv/csr.c: fix mstatus.UXL reserved value X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ddfd33f1965804fc4a718d8d46bc150525c2f9db;p=thirdparty%2Fqemu.git target/riscv/csr.c: fix mstatus.UXL reserved value By the priv spec the value "3" is marked as 'Reserved' for mstatus.UXL. Handle a mstatus.UXL = 3 write by writing the current 'xl' instead. Fixes: https://gitlab.com/qemu-project/qemu/-/work_items/3367 Signed-off-by: Daniel Henrique Barboza Acked-by: Alistair Francis Message-ID: <20260514194537.2416243-3-daniel.barboza@oss.qualcomm.com> Signed-off-by: Alistair Francis --- diff --git a/target/riscv/csr.c b/target/riscv/csr.c index 83ca354bf0..d004a4bfb4 100644 --- a/target/riscv/csr.c +++ b/target/riscv/csr.c @@ -2045,7 +2045,17 @@ static RISCVException write_mstatus(CPURISCVState *env, int csrno, if (xl != MXL_RV32 || env->debugger) { if ((val & MSTATUS64_UXL) != 0) { + uint64_t uxl = val & MSTATUS64_UXL >> 32; mask |= MSTATUS64_UXL; + + /* + * uxl = 3 is reserved so write the current xl instead. + * In case xl = MXL_RV128 (3) write MXL_RV64. + */ + if (uxl == 3) { + uxl = xl == MXL_RV128 ? MXL_RV64 : xl; + val = deposit64(val, 32, 2, uxl); + } } }