[PATCH 5/5] target/riscv: enforce SSE precedence for ssp CSR access
| Newsgroups | org.nongnu.qemu-devel,org.nongnu.qemu-riscv |
|---|---|
| Message-ID | <d2fef5916c826b522d2b2293e210fdabbc7b200b.1787489230.git.wangyang25@otcaix.iscas.ac.cn> |
When menvcfg.SSE is clear, ssp access below M mode raises an illegal-instruction exception before virtual-instruction classification. Apply the henvcfg/senvcfg checks for VS/VU and preserve the user-only path. Resolves: https://gitlab.com/qemu-project/qemu/-/work_items/4226 Signed-off-by: wangyang <[email protected]> --- target/riscv/tcg/csr.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/target/riscv/tcg/csr.c b/target/riscv/tcg/csr.c index fd00538..17a6fc1 100644 --- a/target/riscv/tcg/csr.c +++ b/target/riscv/tcg/csr.c @@ -201,15 +201,34 @@ static RISCVException cfi_ss(CPURISCVState *env, int csrno) return RISCV_EXCP_NONE; } - /* if bcfi not active for current env, access to csr is illegal */ - if (!cpu_get_bcfien(env)) { #if !defined(CONFIG_USER_ONLY) - if (env->debugger) { - return RISCV_EXCP_NONE; - } else if (env->virt_enabled) { + if (env->debugger) { + return RISCV_EXCP_NONE; + } + + /* priv < M and menvcfg.SSE = 0 must raise illegal-instruction */ + if (!(env->menvcfg & MENVCFG_SSE)) { + return RISCV_EXCP_ILLEGAL_INST; + } + + if (env->virt_enabled) { + if (env->priv == PRV_S) { + if (env->henvcfg & HENVCFG_SSE) { + return RISCV_EXCP_NONE; + } + return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; + } + if (env->priv == PRV_U) { + if ((env->henvcfg & HENVCFG_SSE) && + (env->senvcfg & SENVCFG_SSE)) { + return RISCV_EXCP_NONE; + } return RISCV_EXCP_VIRT_INSTRUCTION_FAULT; } + } #endif + + if (!cpu_get_bcfien(env)) { return RISCV_EXCP_ILLEGAL_INST; } -- 2.55.0.windows.2