From 37f4568a270bc9a51faeff7474aaaa650f3c8020 Mon Sep 17 00:00:00 2001 From: smt694 Date: Tue, 19 Mar 2024 10:59:01 +0800 Subject: [PATCH] don't read CSR in csrrw(i) with rd=0 fix write permission --- riscv/insns/csrrw.h | 5 ++++- riscv/insns/csrrwi.h | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/riscv/insns/csrrw.h b/riscv/insns/csrrw.h index e4c605bd81..2dd49fe9ff 100644 --- a/riscv/insns/csrrw.h +++ b/riscv/insns/csrrw.h @@ -1,5 +1,8 @@ int csr = validate_csr(insn.csr(), true); -reg_t old = p->get_csr(csr, insn, true); +reg_t old = (insn.rd() != 0) ? p->get_csr(csr, insn, true) : 0; // don't if rd = 0 +auto &csrmap = p->get_state()->csrmap; +// permission on write +csrmap.count(csr) ? csrmap[csr]->verify_permissions(insn, true) : throw trap_illegal_instruction(insn.bits()); p->put_csr(csr, RS1); WRITE_RD(sext_xlen(old)); serialize(); diff --git a/riscv/insns/csrrwi.h b/riscv/insns/csrrwi.h index 77fec1543e..a08dc932c5 100644 --- a/riscv/insns/csrrwi.h +++ b/riscv/insns/csrrwi.h @@ -1,5 +1,8 @@ int csr = validate_csr(insn.csr(), true); -reg_t old = p->get_csr(csr, insn, true); +reg_t old = (insn.rd() != 0) ? p->get_csr(csr, insn, true) : 0; // don't if rd = 0 +auto &csrmap = p->get_state()->csrmap; +// permission on write +csrmap.count(csr) ? csrmap[csr]->verify_permissions(insn, true) : throw trap_illegal_instruction(insn.bits()); p->put_csr(csr, insn.rs1()); WRITE_RD(sext_xlen(old)); serialize();