riscv 特权指令
特权级别概述
RISC-V特权级别分为四个主要等级:
- U-mode(User Mode):用户模式,执行普通应用程序代码。
- S-mode(Supervisor Mode):管理模式,执行操作系统代码。
- M-mode(Machine Mode):机器模式,最高特权级别,主要用于引导和管理硬件资源。
- H-mode(Hypervisor Mode):虚拟化管理模式,用于管理虚拟机(可选)。
CSR 地址映射转换
[11:10] | [9:8] | [7:4] | Hex | Use and Accessibility |
---|---|---|---|---|
Unprivileged and User-Level CSRs | ||||
00 | 00 | XXXX | 0x000-0x0FF | Standard read/write |
01 | 00 | XXXX | 0x400-0x4FF | Standard read/write |
10 | 00 | XXXX | 0x800-0x8FF | Custom read/write |
11 | 00 | 0XXX | 0xC00-0xC7F | Standard read-only |
11 | 00 | 10XX | 0xC80-0xCBF | Standard read-only |
11 | 00 | 11XX | 0xCC0-0xCFF | Custom read-only |
Supervisor-Level CSRs | ||||
00 | 01 | XXXX | 0x100-0x1FF | Standard read/write |
01 | 01 | 0XXX | 0x500-0x57F | Standard read/write |
01 | 01 | 10XX | 0x580-0x5BF | Standard read/write |
01 | 01 | 11XX | 0x5C0-0x5FF | Custom read/write |
10 | 01 | 0XXX | 0x900-0x97F | Standard read/write |
10 | 01 | 10XX | 0x980-0x9BF | Standard read/write |
10 | 01 | 11XX | 0x9C0-0x9FF | Custom read/write |
11 | 01 | 0XXX | 0xD00-0xD7F | Standard read-only |
11 | 01 | 10XX | 0xD80-0xDBF | Standard read-only |
11 | 01 | 11XX | 0xDC0-0xDFF | Custom read-only |
Hypervisor and VS CSRs | ||||
00 | 10 | XXXX | 0x200-0x2FF | Standard read/write |
01 | 10 | 0XXX | 0x600-0x67F | Standard read/write |
01 | 10 | 10XX | 0x680-0x6BF | Standard read/write |
01 | 10 | 11XX | 0x6C0-0x6FF | Custom read/write |
10 | 10 | 0XXX | 0xA00-0xA7F | Standard read/write |
10 | 10 | 10XX | 0xA80-0xABF | Standard read/write |
10 | 10 | 11XX | 0xAC0-0xAFF | Custom read/write |
11 | 10 | 0XXX | 0xE00-0xE7F | Standard read/write |
11 | 10 | 10XX | 0xE80-0xEBF | Standard read/write |
11 | 10 | 11XX | 0xEC0-0xEFF | Custom read/write |
Machine-Level CSRs | ||||
00 | 11 | XXXX | 0x300-0x3FF | Standard read/write |
01 | 11 | 0XXX | 0x700-0x77F | Standard read/write |
01 | 11 | 100X | 0x780-0x79F | Standard read/write |
01 | 11 | 1010 | 0x7A0-0x7AF | Standard read/write debug CSRs |
01 | 11 | 1011 | 0x7B0-0x7BF | Debug-mode-only CSRs |
01 | 11 | 11XX | 0x7C0-0x7FF | Custom read/write |
10 | 11 | 0XXX | 0xB00-0xB7F | Standard read/write |
10 | 11 | 10XX | 0xB80-0xBBF | Standard read/write |
10 | 11 | 11XX | 0xBC0-0xBFF | Custom read/write |
11 | 11 | 0XXX | 0xF00-0xF7F | Standard read/write |
11 | 11 | 10XX | 0xF80-0xFBF | Standard read/write |
11 | 11 | 11XX | 0xFC0-0xFFF | Custom read/write |
标准 RISC-V ISA 为最多 4,096 个 CSR 预留了 12 位编码空间 (csr[11:0])。按照惯例,CSR 地址的高 4 位 (csr[11:8]) 用于根据特权级别对 CSR 的读写可访问性进行编码,前两位 (csr[11:8])指示寄存器是读/写( 00 、 01 或 10 )还是只读( 11 ) 。接下来的两位 (csr[9:8]) 编码可以访问 CSR 的最低特权级别。
机器模式标准读写 CSR 0x7A0 - 0x7BF 保留供调试系统使用。在这些 CSR 中, 0x7A0 - 0x7AF 可在机器模式下访问,而 0x7B0 - 0x7BF 仅在调试模式下可见。实现应该在机器模式访问后一组寄存器时引发非法指令异常。
寄存器分类
- WPRI(Reserved Writes Preserve Values, Reads Ignore Values ): 一些完整的读/写字段被保留以供将来使用。软件应忽略从这些字段读取的值,并且在将值写入同一寄存器的其他字段时应保留这些字段中保存的值。为了向前兼容,不提供这些字段的实现必须将它们设置为只读零。这些字段在寄存器描述中标记为 WPRI。
- WLRL(Write/Read Only Legal Values): 一些读/写 CSR 字段仅指定可能位编码的子集的行为,并保留其他位编码。软件不应向此类字段写入除合法值以外的任何内容,并且不应假设读取将返回合法值,除非最后一次写入具有合法值,或者自其他操作(例如重置)以来尚未写入寄存器将寄存器设置为合法值。这些字段在寄存器描述中标记为 WLRL。
- WARL(Write Any Values, Reads Legal Values): 某些读/写 CSR 字段仅针对位编码的子集进行定义,但允许写入任何值,同时保证每次读取时都返回合法值。假设写入 CSR 没有其他副作用,则可以通过尝试写入所需设置然后读取以查看该值是否保留来确定支持的值的范围。这些字段在寄存器描述中标记为 WARL。
通用csr寄存器
编号 | 权限 | 名称 | 描述 |
---|---|---|---|
非特权浮点控制状态寄存器 | |||
0x001 0x002 0x003 | URW URW URW | fflags frm fcsr | 浮点累积异常 浮点动态舍入模式 浮点控制和状态寄存器 ( frm +fflags ) |
非特权计数器/定时器 | |||
0xC00 0xC01 0xC02 0xC03 0xC04 0xC1F 0xC80 0xC81 0xC82 0xC83 0xC84 0xC9F | URO URO URO URO URO URO URO URO URO URO URO URO | cycle time instret hpmcounter3 hpmcounter4 ⋮ hpmcounter31 cycleh timeh instreth hpmcounter3h hpmcounter4h ⋮ hpmcounter31h | RDCYCLE 指令的循环计数器 RDTIME 指令的定时器 RDINSTRET 指令的已退休指令计数器 性能监控计数器 性能监控计数器 性能监控计数器 cycle 的高 32 位,仅适用于 RV32 time 的高 32 位,仅适用于 RV32 instret 的高 32 位,仅适用于 RV32 hpmcounter3 的高 32 位,仅适用于 RV32 hpmcounter4 的高 32 位,仅适用于 RV32 hpmcounter31 的高 32 位,仅适用于 RV32 |
管理程序的寄存器
编号 | 权限 | 名称 | 描述 |
---|---|---|---|
虚拟机陷阱设置 | |||
0x600 0x602 0x603 0x604 0x606 0x607 0x612 | HRW HRW HRW HRW HRW HRW HRW | hstatus hedeleg hideleg hie hcounteren hgeie hedelegh | 虚拟机状态寄存器 虚拟机异常委托寄存器 虚拟机中断委托寄存器 虚拟机中断使能寄存器 虚拟机计数器使能 虚拟机客体外部中断使能寄存器 hedeleg 的高 32 位,仅适用于 RV32 |
虚拟机陷阱处理 | |||
0x643 0x644 0x645 0x64A 0xE12 | HRW HRW HRW HRW HRO | htval hip hvip htinst hgeip | 虚拟机错误客体物理地址 虚拟机中断挂起 虚拟机虚拟中断挂起 虚拟机陷阱指令(转换后) 虚拟机客体外部中断挂起 |
虚拟机配置 | |||
0x60A 0x61A | HRW HRM | henvcfg henvcfgh | 虚拟机环境配置寄存器 henvcfg 的高 32 位,仅适用于 RV32 |
虚拟机保护和翻译 | |||
0x680 | HRW | hgatp | 虚拟机客体地址翻译和保护 |
调试/跟踪寄存器 | |||
0x6A8 | HRW | hcontext | 虚拟机模式上下文寄存器 |
虚拟机计数器/定时器虚拟化寄存器 | |||
0x605 0x615 | HRW HRW | htimedelta htimedeltah | VS/VU 模式定时器的增量 htimedelta 的高 32 位,仅适用于 RV32 |
虚拟机状态使能寄存器 | |||
0x60C 0x60D 0x60E 0x60F 0x61C 0x61D 0x61E 0x61F | HRW HRW HRW HRW HRW HRW HRW HRW | hstateen0 hstateen1 hstateen2 hstateen3 hstateen0h hstateen1h hstateen2h hstateen3h | 虚拟机状态使能 0 寄存器 虚拟机状态使能 1 寄存器 虚拟机状态使能 2 寄存器 虚拟机状态使能 3 寄存器 虚拟机状态使能 0 寄存器的高 32 位,仅适用于 RV32 虚拟机状态使能 1 寄存器的高 32 位,仅适用于 RV32 虚拟机状态使能 2 寄存器的高 32 位,仅适用于 RV32 虚拟机状态使能 3 寄存器的高 32 位,仅适用于 RV32 |
虚拟监督寄存器 | |||
0x200 0x204 0x205 0x240 0x241 0x242 0x243 0x244 0x280 | HRW HRW HRW HRW HRW HRW HRW HRW HRW | vsstatus vsie vstvec vsscratch vsepc vscause vstval vsip vsatp | 虚拟监督状态寄存器 虚拟监督中断使能寄存器 虚拟监督陷阱处理器基地址 虚拟监督暂存寄存器 虚拟监督异常程序计数器 虚拟监督陷阱原因 虚拟监督错误地址或指令 虚拟监督中断挂起 虚拟监督地址翻译和保护 |
S-mode寄存器
编号 | 权限 | 名称 | 描述 |
---|---|---|---|
Supervisor Trap Setup | |||
0x100 0x104 0x105 0x106 | SRW SRW SRW SRW | sstatus sie stvec scounteren | 监督状态寄存器 监督中断使能寄存器 监督陷阱处理器基地址 监督计数器使能 |
Supervisor Configuration | |||
0x10A | SRW | senvcfg | 监督环境配置寄存器 |
Supervisor Counter Setup | |||
0x120 | SRW | scountinhibit | 监督计数器禁止寄存器 |
Supervisor Trap Handling | |||
0x140 0x141 0x142 0x143 0x144 0xDA0 | SRW SRW SRW SRW SRW SRO | sscratch sepc scause stval sip scountovf | 监督陷阱处理器的暂存寄存器 监督异常程序计数器 监督陷阱原因 监督错误地址或指令 监督中断挂起 监督计数溢出 |
Supervisor Protection and Translation | |||
0x180 | SRW | satp | 监督地址翻译和保护 |
Debug/Trace Registers | |||
0x5A8 | SRW | scontext | 监督模式上下文寄存器 |
Supervisor State Enable Registers | |||
0x10C 0x10D 0x10E 0x10F | SRW SRW SRW SRW | sstateen0 sstateen1 sstateen2 sstateen3 | 监督状态使能 0 寄存器 监督状态使能 1 寄存器 监督状态使能 2 寄存器 监督状态使能 3 寄存器 |
M-mode寄存器
编号 | 权限 | 名称 | 描述 |
---|---|---|---|
机器信息寄存器 | |||
0xF11 0xF12 0xF13 0xF14 0xF15 | MRO MRO MRO MRO MRO | mvendorid marchid mimpid mhartid mconfigptr | 供应商 ID 架构 ID 实现 ID 硬件线程 ID 指向配置数据结构的指针 |
机器陷阱设置 | |||
0x300 0x301 0x302 0x303 0x304 0x305 0x306 0x310 0x312 | MRW MRW MRW MRW MRW MRW MRW MRW MRW | mstatus misa medeleg mideleg mie mtvec mcounteren mstatush medelegh | 机器状态寄存器 ISA 和扩展 机器异常委托寄存器 机器中断委托寄存器 机器中断使能寄存器 机器陷阱处理器基地址 机器计数器使能 附加机器状态寄存器,仅适用于 RV32 medeleg 的高 32 位,仅适用于 RV32 |
机器陷阱处理 | |||
0x340 0x341 0x342 0x343 0x344 0x34A 0x34B | MRW MRW MRW MRW MRW MRW MRW | mscratch mepc mcause mtval mip mtinst mtval2 | 机器陷阱处理器的暂存寄存器 机器异常程序计数器 机器陷阱原因 机器错误地址或指令 机器中断挂起 机器陷阱指令(转换后) 机器错误的客体物理地址 |
机器配置 | |||
0x30A 0x31A 0x747 0x757 | MRW MRW MRW MRW | menvcfg menvcfgh mseccfg mseccfgh | 机器环境配置寄存器 menvcfg 的高 32 位,仅适用于 RV32 机器安全配置寄存器 mseccfg 的高 32 位,仅适用于 RV32 |
机器内存保护 | |||
0x3A0 0x3A1 0x3A2 0x3A3 0x3AE 0x3AF 0x3B0 0x3B1 0x3EF | MRW MRW MRW MRW MRW MRW MRW MRW MRW | pmpcfg0 pmpcfg1 pmpcfg2 pmpcfg3 ⋯ pmpcfg14 pmpcfg15 pmpaddr0 pmpaddr1 ⋯ pmpaddr63 | 物理内存保护配置 物理内存保护配置,仅适用于 RV32 物理内存保护配置 物理内存保护配置,仅适用于 RV32 物理内存保护配置 物理内存保护配置,仅适用于 RV32 物理内存保护地址寄存器 物理内存保护地址寄存器 物理内存保护地址寄存器 |
机器状态使能寄存器 | |||
0x30C 0x30D 0x30E 0x30F 0x31C 0x31D 0x31E 0x31F | MRW MRW MRW MRW MRW MRW MRW MRW | mstateen0 mstateen1 mstateen2 mstateen3 mstateen0h mstateen1h mstateen2h mstateen3h | 机器状态使能 0 寄存器 机器状态使能 1 寄存器 机器状态使能 2 寄存器 机器状态使能 3 寄存器 机器状态使能 0 寄存器的高 32 位,仅适用于 RV32 机器状态使能 1 寄存器的高 32 位,仅适用于 RV32 机器状态使能 2 寄存器的高 32 位,仅适用于 RV32 机器状态使能 3 寄存器的高 32 位,仅适用于 RV32 |
编号 | 权限 | 名称 | 描述 |
---|---|---|---|
机器不可屏蔽中断处理 | |||
0x740 0x741 0x742 0x744 | MRW MRW MRW MRW | mnscratch mnepc mncause mnstatus | 可恢复的 NMI 暂存寄存器 可恢复的 NMI 程序计数器 可恢复的 NMI 原因 可恢复的 NMI 状态 |
机器计数器/定时器 | |||
0xB00 0xB02 0xB03 0xB04 0xB1F 0xB80 0xB82 0xB83 0xB84 0xB9F | MRW MRW MRW MRW MRW MRW MRW MRW MRW MRW | mcycle minstret mhpmcounter3 mhpmcounter4 ⋮ mhpmcounter31 mcycleh minstreth mhpmcounter3h mhpmcounter4h ⋮ mhpmcounter31h | 机器循环计数器 机器已退休指令计数器 机器性能监控计数器 机器性能监控计数器 机器性能监控计数器 mcycle 的高 32 位,仅适用于 RV32 minstret 的高 32 位,仅适用于 RV32 mhpmcounter3 的高 32 位,仅适用于 RV32 mhpmcounter4 的高 32 位,仅适用于 RV32 mhpmcounter31 的高 32 位,仅适用于 RV32 |
机器计数器设置 | |||
0x320 0x323 0x324 0x33F 0x723 0x724 0x73F | MRW MRW MRW MRW MRW MRW MRW | mcountinhibit mhpmevent3 mhpmevent4 ⋮ mhpmevent31 mhpmevent3h mhpmevent4h ⋮ mhpmevent31h | 机器计数器禁止寄存器 机器性能监控事件选择器 机器性能监控事件选择器 机器性能监控事件选择器 mhpmevent3 的高 32 位,仅适用于 RV32 mhpmevent4 的高 32 位,仅适用于 RV32 mhpmevent31 的高 32 位,仅适用于 RV32 |
调试/跟踪寄存器(与调试模式共享) | |||
0x7A0 0x7A1 0x7A2 0x7A3 0x7A8 | MRW MRW MRW MRW MRW | tselect tdata1 tdata2 tdata3 mcontext | 调试/跟踪触发器选择寄存器 第一个调试/跟踪触发器数据寄存器 第二个调试/跟踪触发器数据寄存器 第三个调试/跟踪触发器数据寄存器 机器模式上下文寄存器 |
调试模式寄存器 | |||
0x7B0 0x7B1 0x7B2 0x7B3 | DRW DRW DRW DRW | dcsr dpc dscratch0 dscratch1 | 调试控制和状态寄存器 调试程序计数器 调试暂存寄存器 0 调试暂存寄存器 1 |
M-mode寄存器
misa(Machine ISA Register)
- MXL: 标识XLEN
MXL | XLEM |
---|---|
1 | 32 |
2 | 64 |
3 | 128 |
- extensions: 支持的拓展
Bit | Character | Description |
---|---|---|
0 | A | Atomic extension |
1 | B | B extension |
2 | C | Compressed extension |
3 | D | Double-precision floating-point extension |
4 | E | RV32E/64E base ISA |
5 | F | Single-precision floating-point extension |
6 | G | Reserved |
7 | H | Hypervisor extension |
8 | I | RV32I/64I/128I base ISA |
9 | J | Reserved |
10 | K | Reserved |
11 | L | Reserved |
12 | M | Integer Multiply/Divide extension |
13 | N | Tentatively reserved for User-Level Interrupts extension |
14 | O | Reserved |
15 | P | Tentatively reserved for Packed-SIMD extension |
16 | Q | Quad-precision floating-point extension |
17 | R | Reserved |
18 | S | Supervisor mode implemented |
19 | T | Reserved |
20 | U | User mode implemented |
21 | V | Vector extension |
22 | W | Reserved |
23 | X | Non-standard extensions present |
24 | Y | Reserved |
25 | Z | Reserved |
如果存在任何非标准扩展,则将设置“X”位。
当“B”位为 1 时,实现支持 Zba、Zbb 和 Zbs 扩展提供的指令。当“B”位为 0 时,表示该实现可能不支持 Zba、Zbb 或 Zbs 扩展中的一项或多项。
mvendorid(Machine Vendor ID Register)
mvendorid CSR 是一个 32 位只读寄存器,提供内核提供商的 JEDEC 制造商 ID。该寄存器在任何实现中都必须可读,但可以返回值 0 以指示该字段未实现或者这是非商业实现。
marchid(Machine Architecture ID Register)
marchid CSR 是一个 MXLEN 位只读寄存器,用于编码 hart 的基本微架构。该寄存器在任何实现中都必须可读,但可以返回 0 值以指示该字段未实现。 mvendorid 和 marchid 的组合应唯一标识所实现的 hart 微体系结构的类型。
mimpid(Machine Implementation ID Register)
mimpid CSR 提供处理器实现版本的唯一编码。该寄存器在任何实现中都必须可读,但可以返回 0 值以指示该字段未实现。实现值应反映 RISC-V 处理器本身的设计,而不是任何周围系统的设计。
mhartid(Hart ID Register)
mhartid CSR 是一个 MXLEN 位只读寄存器,包含运行代码的硬件线程的整数 ID。该寄存器在任何实现中都必须可读。在多处理器系统中,Hart ID 不一定是连续编号的,但至少有一个 Hart 的 Hart ID 必须为零。 Hart ID 在执行环境中必须是唯一的。
mstatus,mstatush(Machine Status Registers)
mstatus 寄存器是一个 MXLEN 位读/写寄存器,其格式如图 7(RV32)和图 8(RV64)所示。 mstatus 寄存器跟踪并控制hart的当前操作状态。 mstatus 的受限视图在 S 级 ISA 中显示为 sstatus 寄存器。
mstatus在RV32中
mstatus在RV64中
mstatush在RV32
全局中断使能位 MIE 和 SIE 分别为 M 模式和 S 模式提供。这些位主要用于保证当前特权模式下中断处理程序的原子性。
为了支持嵌套陷阱,每个可以响应中断的特权模式 x 都有一个中断使能位和特权模式的两级堆栈。 xPIE 保存陷阱之前有效的中断使能位的值,xPP 保存之前的特权模式。 xPP 字段只能保存最多 x 的特权模式,因此 MPP 是两位宽,SPP 是一位宽。当陷阱从特权模式 y 进入特权模式 x 时,xPIE 被设置为 xIE 的值; xIE设置为0; xPP 设置为 y。
mtvec(Machine Trap-Vector Base-Address Register)
mtvec 寄存器是一个 MXLEN 位 WARL 读/写寄存器,用于保存陷阱向量配置,由向量基地址 (BASE) 和向量模式 (MODE) 组成。
MODE | Name | 描述 |
---|---|---|
0 | Direct | 所有进入机器模式的陷阱都会导致 pc 设置为 BASE 字段中的地址。 |
1 | Vectored | 所有进入机器模式的同步异常都会导致 pc 设置为 BASE 字段中的地址,而中断则导致 pc 设置为 BASE 字段中的地址。 BASE 字段加上中断原因编号的四倍。 |
>=2 | — | Reserved |
medeleg, mideleg(Machine Trap Delegation Registers)
默认情况下,任何特权级别的所有陷阱都在机器模式下处理,尽管机器模式处理程序可以使用 MRET 指令将陷阱重定向回适当的级别。为了提高性能,实现可以在 medeleg 和 mideleg 中提供单独的读/写位,以指示某些异常和中断应由较低特权级别直接处理。机器异常委托寄存器( medeleg )是一个64位读/写寄存器。机器中断委托寄存器( mideleg )是一个MXLEN位读/写寄存器。
当陷阱被委托给 S 模式时, scause 寄存器将写入陷阱原因; sepc 寄存器写入捕获陷阱的指令的虚拟地址; stval 寄存器写入异常特定数据; mstatus 的SPP字段是用陷阱发生时的活动特权模式写入的; mstatus 的SPIE字段写入陷阱时SIE字段的值; mstatus 的SIE字段被清零。 mcause 、 mepc 和 mtval 寄存器以及 mstatus 的 MPP 和 MPIE 字段不会被写入。
当 XLEN=32 时, medelegh 是一个 32 位读/写寄存器,别名 medeleg 的位 63:32。当XLEN=64时,寄存器 medelegh 不存在。
medeleg
mideleg
mip,mie(Machine Interrupt Registers)
mip 寄存器是包含待处理中断信息的 MXLEN 位读/写寄存器,而 mie 是包含中断使能位的相应 MXLEN 位读/写寄存器。中断原因编号 i 与 mip 和 mie 中的位 i 相对应。位 15:0 仅分配给标准中断原因,而位 16 及以上指定供平台使用。
mip
mie
如果满足以下所有条件,则中断 i 将陷入 M 模式(导致特权模式更改为 M 模式):
- 当前特权模式为 M
- mstatus 和 mie 中均被设置
- 如果寄存器 mideleg 存在,则 mideleg 中的位 i 不会被设置。
寄存器 mip 和 mie 的标准部分(位15:0)
mip[15:0]
mie[15:0]
位 mip .MEIP 和 mie .MEIE 是机器级外部中断的中断待处理位和中断使能位。 MEIP 在 mip 中是只读的,并由特定于平台的中断控制器设置和清除。
位 mip .MTIP 和 mie .MTIE 是机器定时器中断的中断待处理位和中断使能位。 MTIP 在 mip 中是只读的,并通过写入内存映射机器模式定时器比较寄存器来清除。
位 mip .MSIP 和 mie .MSIE 是机器级软件中断的中断待处理位和中断使能位。 MSIP 在 mip 中是只读的,并通过访问内存映射控制寄存器来写入,远程 Hart 使用这些寄存器来提供机器级处理器间中断。 Hart 可以使用相同的内存映射控制寄存器写入自己的 MSIP 位。如果系统只有一个 HART,或者平台标准支持通过外部中断 (MEI) 传递机器级处理器间中断,则 mip .MSIP 和 mie .MSIE都可以是只读零。
mcounteren(Machine Counter-Enable Register)
计数器使能寄存器 mcounteren 是一个32位寄存器,用于控制硬件性能监控计数器对下一个较低特权模式的可用性。
mcountinhibit(Machine Counter-Inhibit)
计数器禁止寄存器 mcountinhibit 是一个 32 位 WARL 寄存器,用于控制哪个硬件性能监控计数器递增。该寄存器中的设置仅控制计数器是否递增;它们的可访问性不受该寄存器设置的影响。
mscratch(Machine Scratch Register)
mscratch 寄存器是专用于机器模式的MXLEN位读/写寄存器。通常,它用于保存指向机器模式 hart 本地上下文空间的指针,并在进入 M 模式陷阱处理程序时与用户寄存器交换。
mepc(Machine Exception Program Counter)
当陷阱进入 M 模式时, mepc 会写入被中断或遇到异常的指令的虚拟地址。否则, mepc 永远不会由实现编写,尽管它可能是由软件显式编写的。
mcause(Machine Cause Register)
mcause 寄存器是一个 MXLEN 位读写寄存器。当陷阱进入 M 模式时, mcause 会写入指示事件的代码这导致了陷阱。否则, mcause 永远不会由实现编写,尽管它可能是由软件显式编写的。
中断 | 异常代码 | 描述 |
---|---|---|
1 1 1 1 | 0 1 2 3 | 保留 监督软件中断 保留 机器软件中断 |
1 1 1 1 | 4 5 6 7 | 保留 监督计时器中断 保留 机器计时器中断 |
1 1 1 1 | 8 9 10 11 | 保留 监督外部中断 保留 机器外部中断 |
1 1 1 1 | 12 13 14-15 ≥16 | 保留 计数器溢出中断 保留 平台指定使用 |
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 | 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16-17 18 19 20-23 24-31 32-47 48-63 ≥64 | 指令地址未对齐 指令访问错误 非法指令 断点 加载地址未对齐 加载访问错误 存储/AMO 地址未对齐 存储/AMO 访问错误 来自 U 模式的环境调用 来自 S 模式的环境调用 保留 来自 M 模式的环境调用 指令页面错误 加载页面错误 保留 存储/AMO 页面错误 保留 软件检查 硬件错误 保留 自定义使用指定 保留 自定义使用指定 保留 |
mtval(Machine Trap Value Register)
mtval 寄存器是一个 MXLEN 位读写寄存器。当陷阱进入 M 模式时, mtval 要么设置为零,要么写入帮助软件处理陷阱的异常特定信息。否则, mtval 永远不会由实现编写,尽管它可能是由软件显式编写的。硬件平台将指定哪些异常必须以信息方式设置 mtval ,哪些异常可以无条件将其设置为零,哪些异常可以表现出任一行为,具体取决于导致异常的基础事件。如果硬件平台指定没有异常将 mtval 设置为非零值,则 mtval 为只读零。
mconfigptr(Machine Configuration Pointer Register)
mconfigptr 是一个 MXLEN 位只读 CSR,它保存配置数据结构的物理地址。软件可以遍历这个数据结构来发现有关硬件、平台及其配置的信息。
menvcfg(Machine Environment Configuration Register)
menvcfg CSR 是一个 64 位读/写寄存器,它控制特权低于 M 的模式的执行环境的某些特征。
mseccfg(Machine Security Configuration Register)
mseccfg 是一个可选的 64 位读/写寄存器,用于控制安全功能。
mtime,mtimecmp(Machine Timer Registers)
平台提供实时计数器,作为内存映射机器模式读写寄存器 mtime 公开。 mtime 必须以恒定频率递增,并且平台必须提供一种机制来确定 mtime 刻度周期。如果计数溢出, mtime 寄存器将回绕。
mtime 寄存器在所有 RV32 和 RV64 系统上都具有 64 位精度。平台提供 64 位内存映射机器模式定时器比较寄存器 ( mtimecmp )。每当 mtime 包含大于或等于 mtimecmp 的值时,机器计时器中断就会处于挂起状态,并将这些值视为无符号整数。中断保持发布状态,直到 mtimecmp 变得大于 mtime (通常是写入 mtimecmp 的结果)。仅当中断使能并且 mie 寄存器中的 MTIE 位被置位时,才会产生中断。