我正在使用RISCV 特权 1.7 指令集,第 8 页描述了 csrrw。
当处理器执行时:
csrrw a0,cycle,a0
- 它是否应该使用 CSR“循环”值更新“a0”寄存器,并在用户模式下写入时引发异常?
或者
- 它是否应该引发异常而不更新 CSR“循环”寄存器?
我正在使用RISCV 特权 1.7 指令集,第 8 页描述了 csrrw。
当处理器执行时:
csrrw a0,cycle,a0
或者
csrrw 的格式是:
csrrw rd,csr,rs1
所以,你正在尝试做
R[rd]=CSR; CSR=R[rs1]
this means
R[a0]=cycle; cycle=R[a0]
这有一个问题“循环”是只读的CSR。您可以改用 mcycle,mcycle 有一个随机值,但您可以覆盖它。
csrrw a0, mcycle, a0
RISC-V Privileged Architecture文档指定这cycle
是一个只读 CSR,因此对它的任何写入都应产生非法指令异常。
尝试在没有适当特权级别的情况下访问 CSR 或写入只读寄存器也会引发非法指令异常。
(强调我的,第 2.1 节 CSR 地址映射约定,第 5 页,RISC-V 指令集手册。第二卷:特权架构。1.12 草案)
如果由于写入只读 CSR 而引发非法指令异常,规范未指定目标寄存器会发生什么。
这意味着无论实现是否写入目标寄存器,只要它引发非法指令异常,它就符合规范。