网站建设的总体需求是什么,对建设网站未来发展的建议,wordpress双站 中英文,美化网站代码RV32/64 特权架构 - CSR寄存器 1 CSR地址空间2 CSR定义2.1 用户级2.2 监管级2.3 超级监管级2.4 机器级 3 CSR访问3.1 CSRRW3.2 CSRRS3.3 CSRRC3.4 CSRRWI3.5 CSRRSI3.6 CSRRCI 本文属于《
RISC-V指令集基础系列教程》之一#xff0c;欢迎查看其它文章。 1 CSR地址空间
RISC欢迎查看其它文章。 1 CSR地址空间
RISCV架构中定义了一些控制和状态寄存器control and status register简称CSR与32个物理寄存器不同物理寄存器可以认为是5位地址寻址的这些CSR是用12位地址进行寻址的因此理论上最多可以有4096个CSR寄存器并且地址空间是私有独立的不同于全局地址空间。
CSR地址空间定义如下 CSR地址的高4bits用于编码CSR在各个权级上的可读写性
[11:10]表示该寄存器是可读写0001或10还是只读11。[9:8]表示允许访问该寄存器的最低权级。 00用户级用户模式及以上权级用户、监管、机器可访问。 01监管级监管模式及以上权级监管、机器可访问。 10超级监管级扩展模式仅在虚拟化时使用用于访问虚拟化专用的CSR。 11机器级仅机器模式可访问。 从上图也可以看到根据[9:8]的值整个CSR地址空间被分为了4个部分。
除此之外上图还指定了哪些CSR地址是标准用途而哪些是自定义用途。 用于自定义的CSR地址不会在未来标准扩展中被重新定义。
2 CSR定义
我们知道CSR寄存器被划分为4个级别用户级、监管级、超级监管级、机器级。 接下来我们看看各个权级具体定义了哪些寄存器。
2.1 用户级
用户级CSR定义了两个部分的寄存器
Unprivileged Floating-Point CSRsUnprivileged Counter/Timers 以上Number列给出了该寄存器的12位地址。 具体寄存器含义见规范手册。
2.2 监管级
监管级CSR定义了五个部分的寄存器
Supervisor Trap SetupSupervisor ConfigurationSupervisor Trap HandlingSupervisor Protection and TranslationDebug/Trace Registers 具体寄存器含义见规范手册。
2.3 超级监管级
超级监管级CSR定义了七个部分的寄存器
Hypervisor Trap SetupHypervisor Trap HandlingHypervisor ConfigurationHypervisor Protection and TranslationDebug/Trace RegistersHypervisor Counter/Timer Virtualization RegistersVirtual Supervisor Registers 具体寄存器含义见规范手册。
2.4 机器级
机器级CSR定义了九个部分的寄存器
Machine Information RegistersMachine Trap SetupMachine Trap HandlingMachine ConfigurationMachine Memory ProtectionMachine Counter/TimersMachine Counter SetupDebug/Trace Registers (shared with Debug Mode)Debug Mode Registers 具体寄存器含义见规范手册。
3 CSR访问
针对CSR寄存器的读写有相应的特殊指令这些特殊指令都被定义在RV32I中如下所示 真正的指令只有CSRRW、CSRRS、CSRRC、CSRRWI、CSRRSI、CSRRCI这6条其他资料中的CSR指令均为伪指令。
CSR指令机器码中共有12位第20-31位用来指示被“读改写”的是哪一个CSR寄存器这里通常填写的就是前面讲过的CSR地址比如mtvec寄存器那就是0x305。
注意事项
试图访问一个不存在的CSR将造成一个非法指令异常illegal instruction exception试图在不当的权级下访问CSR或者尝试写入一个只读寄存器也都将造成非法指令异常可读写寄存器中也可能包含一些只读位此时忽略对只读位的写入。
3.1 CSRRW 指令形式csrrw rd, csr, rs1 指令功能CSR寄存器读后写。记csr值为t将rs1写入csr再将t写入rd。
t csr
csr rs1
rd t例如csrrw t0, mstatus, t0 将 mstatus 的值与 t0 的值交换。
3.2 CSRRS 指令形式csrrs rd, csr, rs1 指令功能CSR寄存器读后置位。记csr值为t将t和rs1的按位或结果写入csr再将t 写入rd。
t csr
csr t | rs1
rd t3.3 CSRRC 指令形式csrrc rd, csr, rs1 指令功能CSR寄存器读后清位。记csr值为t将rs1的反码和t按位与结果写入csr再将t写入rd。
t csr
csr t ∼rs1
rd t3.4 CSRRWI 指令形式csrrwi rd, csr, zimm[4:0] 指令功能CSR寄存器读后写立即数。将csr 的值复制到rd 中再将5 位立即数zimm 的零扩展结果写入csr。
rd csr
csr zimm3.5 CSRRSI 指令形式csrrsi rd, csr, zimm[4:0] 指令功能CSR寄存器读后置位立即数。记csr 的值为t将5 位立即数zimm 零扩展后和t 按位或结果写入csr再将t 写入rdcsr 中的第5 及更高的位不变。
t csr
csr t | zimm
rd t3.6 CSRRCI 指令形式csrrci rd, csr, zimm[4:0] 指令功能CSR寄存器读后清位立即数。记csr 的值为t将5 位立即数zimm 零扩展后的反码和t 按位与结果写入csr再将t 写入rdcsr 中的第5 及更高的位不变。
t csr
csr t ∼zimm
rd t此外需要注意
若目的通用寄存器为x0则不会执行读取操作若源通用寄存器为x0或立即数0也不会进行写入CSR操作。
基于以上6条指令和x0这样的特性衍生出若干CSR伪指令比如csrr、csrc、csrci、csrs、csrw等。 参考文档
《riscv-spec-20191213》《riscv-privileged-20211203》