Skip to content

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]HexUse and Accessibility
Unprivileged and User-Level CSRs
0000XXXX0x000-0x0FFStandard read/write
0100XXXX0x400-0x4FFStandard read/write
1000XXXX0x800-0x8FFCustom read/write
11000XXX0xC00-0xC7FStandard read-only
110010XX0xC80-0xCBFStandard read-only
110011XX0xCC0-0xCFFCustom read-only
Supervisor-Level CSRs
0001XXXX0x100-0x1FFStandard read/write
01010XXX0x500-0x57FStandard read/write
010110XX0x580-0x5BFStandard read/write
010111XX0x5C0-0x5FFCustom read/write
10010XXX0x900-0x97FStandard read/write
100110XX0x980-0x9BFStandard read/write
100111XX0x9C0-0x9FFCustom read/write
11010XXX0xD00-0xD7FStandard read-only
110110XX0xD80-0xDBFStandard read-only
110111XX0xDC0-0xDFFCustom read-only
Hypervisor and VS CSRs
0010XXXX0x200-0x2FFStandard read/write
01100XXX0x600-0x67FStandard read/write
011010XX0x680-0x6BFStandard read/write
011011XX0x6C0-0x6FFCustom read/write
10100XXX0xA00-0xA7FStandard read/write
101010XX0xA80-0xABFStandard read/write
101011XX0xAC0-0xAFFCustom read/write
11100XXX0xE00-0xE7FStandard read/write
111010XX0xE80-0xEBFStandard read/write
111011XX0xEC0-0xEFFCustom read/write
Machine-Level CSRs
0011XXXX0x300-0x3FFStandard read/write
01110XXX0x700-0x77FStandard read/write
0111100X0x780-0x79FStandard read/write
011110100x7A0-0x7AFStandard read/write debug CSRs
011110110x7B0-0x7BFDebug-mode-only CSRs
011111XX0x7C0-0x7FFCustom read/write
10110XXX0xB00-0xB7FStandard read/write
101110XX0xB80-0xBBFStandard read/write
101111XX0xBC0-0xBFFCustom read/write
11110XXX0xF00-0xF7FStandard read/write
111110XX0xF80-0xFBFStandard read/write
111111XX0xFC0-0xFFFCustom 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 仅在调试模式下可见。实现应该在机器模式访问后一组寄存器时引发非法指令异常。

寄存器分类

  1. WPRI(Reserved Writes Preserve Values, Reads Ignore Values ): 一些完整的读/写字段被保留以供将来使用。软件应忽略从这些字段读取的值,并且在将值写入同一寄存器的其他字段时应保留这些字段中保存的值。为了向前兼容,不提供这些字段的实现必须将它们设置为只读零。这些字段在寄存器描述中标记为 WPRI。
  2. WLRL(Write/Read Only Legal Values): 一些读/写 CSR 字段仅指定可能位编码的子集的行为,并保留其他位编码。软件不应向此类字段写入除合法值以外的任何内容,并且不应假设读取将返回合法值,除非最后一次写入具有合法值,或者自其他操作(例如重置)以来尚未写入寄存器将寄存器设置为合法值。这些字段在寄存器描述中标记为 WLRL。
  3. 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
虚拟机保护和翻译
0x680HRWhgatp虚拟机客体地址翻译和保护
调试/跟踪寄存器
0x6A8HRWhcontext虚拟机模式上下文寄存器
虚拟机计数器/定时器虚拟化寄存器
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
0x10ASRWsenvcfg监督环境配置寄存器
Supervisor Counter Setup
0x120SRWscountinhibit监督计数器禁止寄存器
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
0x180SRWsatp监督地址翻译和保护
Debug/Trace Registers
0x5A8SRWscontext监督模式上下文寄存器
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)

MXLEN-1 MXLEN-2 MXLEN-3 26 25 0
+-----------------+-----------+------------------+
| MXL(WARL) | 0(WARL) | extensions(WARL) |
+-----------------+-----------+------------------+
  • MXL: 标识XLEN
MXLXLEM
132
264
3128
  • extensions: 支持的拓展
BitCharacterDescription
0AAtomic extension
1BB extension
2CCompressed extension
3DDouble-precision floating-point extension
4ERV32E/64E base ISA
5FSingle-precision floating-point extension
6GReserved
7HHypervisor extension
8IRV32I/64I/128I base ISA
9JReserved
10KReserved
11LReserved
12MInteger Multiply/Divide extension
13NTentatively reserved for User-Level Interrupts extension
14OReserved
15PTentatively reserved for Packed-SIMD extension
16QQuad-precision floating-point extension
17RReserved
18SSupervisor mode implemented
19TReserved
20UUser mode implemented
21VVector extension
22WReserved
23XNon-standard extensions present
24YReserved
25ZReserved

如果存在任何非标准扩展,则将设置“X”位。

当“B”位为 1 时,实现支持 Zba、Zbb 和 Zbs 扩展提供的指令。当“B”位为 0 时,表示该实现可能不支持 Zba、Zbb 或 Zbs 扩展中的一项或多项。

mvendorid(Machine Vendor ID Register)

mvendorid CSR 是一个 32 位只读寄存器,提供内核提供商的 JEDEC 制造商 ID。该寄存器在任何实现中都必须可读,但可以返回值 0 以指示该字段未实现或者这是非商业实现。

31 7 6 0
+-----------------------------+------------------+
| Bank | Offset |
+-----------------------------+------------------+

marchid(Machine Architecture ID Register)

marchid CSR 是一个 MXLEN 位只读寄存器,用于编码 hart 的基本微架构。该寄存器在任何实现中都必须可读,但可以返回 0 值以指示该字段未实现。 mvendorid 和 marchid 的组合应唯一标识所实现的 hart 微体系结构的类型。

MXLEN-1 0
+-----------------------------------------------+
| Architecture ID |
+-----------------------------------------------+

mimpid(Machine Implementation ID Register)

mimpid CSR 提供​​处理器实现版本的唯一编码。该寄存器在任何实现中都必须可读,但可以返回 0 值以指示该字段未实现。实现值应反映 RISC-V 处理器本身的设计,而不是任何周围系统的设计。

MXLEN-1 0
+-----------------------------------------------+
| implementation |
+-----------------------------------------------+

mhartid(Hart ID Register)

mhartid CSR 是一个 MXLEN 位只读寄存器,包含运行代码的硬件线程的整数 ID。该寄存器在任何实现中都必须可读。在多处理器系统中,Hart ID 不一定是连续编号的,但至少有一个 Hart 的 Hart ID 必须为零。 Hart ID 在执行环境中必须是唯一的。

MXLEN-1 0
+-----------------------------------------------+
| Hart ID |
+-----------------------------------------------+

mstatus,mstatush(Machine Status Registers)

mstatus 寄存器是一个 MXLEN 位读/写寄存器,其格式如图 7(RV32)和图 8(RV64)所示。 mstatus 寄存器跟踪并控制hart的当前操作状态。 mstatus 的受限视图在 S 级 ISA 中显示为 sstatus 寄存器。

mstatus在RV32中

31 31 30 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+-----+------+-----+-----+-----+-----+-----+------+---------+---------+----------+----------+-----+------+-----+------+------+-----+------+-----+------+
| SD | WPRI | TSR | TW | TVM | MXR | SUM | MPRV | XS[1:0] | FS[1:0] | MPP[1:0] | VS[1:0] | SPP | MPIE | UBE | SPIE | WPRI | MIE | WPRI | SIE | WPRI |
+-----+------+-----+-----+-----+-----+-----+------+---------+---------+----------+----------+-----+------+-----+------+------+-----+------+-----+------+

mstatus在RV64中

63 62 38 37 36 35 34 33 32
+-----+--------------+-----+-----+----------+----------+
| SD | WPRI | MBE | SBE | SXL[1:0] | UXL[1:0] |
+-----+--------------+-----+-----+----------+----------+
31 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+------------+-----+-----+-----+-----+-----+------+---------+---------+----------+----------+-----+------+-----+------+------+-----+------+-----+------+
| WPRI | TSR | TW | TVM | MXR | SUM | MPRV | XS[1:0] | FS[1:0] | MPP[1:0] | VS[1:0] | SPP | MPIE | UBE | SPIE | WPRI | MIE | WPRI | SIE | WPRI |
+------------+-----+-----+-----+-----+-----+------+---------+---------+----------+----------+-----+------+-----+------+------+-----+------+-----+------+

mstatush在RV32

31 6 5 4 3 0
+--------------------+-----+-----+------+
| WPRI | MBE | SBE | WPRI |
+--------------------+-----+-----+------+

全局中断使能位 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) 组成。

MXLEN-1 2 1 0
+--------------------------------+-------------+
| BASE[MXLEN-1:2](WARL) | MODE(WPRL) |
+--------------------------------+-------------+
MODEName描述
0Direct所有进入机器模式的陷阱都会导致 pc 设置为 BASE 字段中的地址。
1Vectored所有进入机器模式的同步异常都会导致 pc 设置为 BASE 字段中的地址,而中断则导致 pc 设置为 BASE 字段中的地址。 BASE 字段加上中断原因编号的四倍。
>=2Reserved

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

63 0
+---------------------------------------------+
| Synchronous Exceptions(WARL) |
+---------------------------------------------+

mideleg

63 0
+---------------------------------------------+
| Synchronous Exceptions(WARL) |
+---------------------------------------------+

mip,mie(Machine Interrupt Registers)

mip 寄存器是包含待处理中断信息的 MXLEN 位读/写寄存器,而 mie 是包含中断使能位的相应 MXLEN 位读/写寄存器。中断原因编号 i 与 mip 和 mie 中的位 i 相对应。位 15:0 仅分配给标准中断原因,而位 16 及以上指定供平台使用。

mip

MXLEN-1 0
+---------------------------------------------+
| Interrupts(WARL) |
+---------------------------------------------+

mie

MXLEN-1 0
+---------------------------------------------+
| Interrupts(WARL) |
+---------------------------------------------+

如果满足以下所有条件,则中断 i 将陷入 M 模式(导致特权模式更改为 M 模式):

  1. 当前特权模式为 M
  2. mstatus 和 mie 中均被设置
  3. 如果寄存器 mideleg 存在,则 mideleg 中的位 i 不会被设置。

寄存器 mip 和 mie 的标准部分(位15:0)

mip[15:0]

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+---------+--------+------+------+-----+------+-----+------+-----+------+-----+------+-----+------+-----+
| 0 | LCOFIP | 0 | MEIP | 0 | SEIP | 0 | MTIP | 0 | STIP | 0 | MSIP | 0 | SSIP | 0 |
+---------+--------+------+------+-----+------+-----+------+-----+------+-----+------+-----+------+-----+

mie[15:0]

15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
+---------+--------+------+------+-----+------+-----+------+-----+------+-----+------+-----+------+-----+
| 0 | LCOFIP | 0 | MEIP | 0 | SEIP | 0 | MTIE | 0 | STIE | 0 | MSIE | 0 | SSIE | 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位寄存器,用于控制硬件性能监控计数器对下一个较低特权模式的可用性。

31 30 29 5 4 3 2 1 0
+---------+--------+-------+------+-----+------+-----+------+-----+------+------+------+-----+------+-----+
| HPM31 | HPM30 | HPM29 | .... | HPM5 | HPM4 | HPM3 | IR | TM | CY |
+---------+--------+-------+------+-----+------+-----+------+-----+------+------+------+-----+------+-----+

mcountinhibit(Machine Counter-Inhibit)

计数器禁止寄存器 mcountinhibit 是一个 32 位 WARL 寄存器,用于控制哪个硬件性能监控计数器递增。该寄存器中的设置仅控制计数器是否递增;它们的可访问性不受该寄存器设置的影响。

31 30 29 5 4 3 2 1 0
+---------+--------+-------+------+-----+------+-----+------+-----+------+------+------+-----+------+-----+
| HPM31 | HPM30 | HPM29 | .... | HPM5 | HPM4 | HPM3 | IR | 0 | CY |
+---------+--------+-------+------+-----+------+-----+------+-----+------+------+------+-----+------+-----+

mscratch(Machine Scratch Register)

mscratch 寄存器是专用于机器模式的MXLEN位读/写寄存器。通常,它用于保存指向机器模式 hart 本地上下文空间的指针,并在进入 M 模式陷阱处理程序时与用户寄存器交换。

MXLEN-1 0
+---------------------------------------------+
| mscratch |
+---------------------------------------------+

mepc(Machine Exception Program Counter)

当陷阱进入 M 模式时, mepc 会写入被中断或遇到异常的指令的虚拟地址。否则, mepc 永远不会由实现编写,尽管它可能是由软件显式编写的。

MXLEN-1 0
+---------------------------------------------+
| mepc |
+---------------------------------------------+

mcause(Machine Cause Register)

mcause 寄存器是一个 MXLEN 位读写寄存器。当陷阱进入 M 模式时, mcause 会写入指示事件的代码这导致了陷阱。否则, mcause 永远不会由实现编写,尽管它可能是由软件显式编写的。

MXLEN-1 MXLEN-2 0
+-----------+------------------------------------+
| interrupt | Exception Code(WLRL) |
+-----------+------------------------------------+
中断异常代码描述
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 为只读零。

MXLEN-1 0
+---------------------------------------------+
| mtval |
+---------------------------------------------+

mconfigptr(Machine Configuration Pointer Register)

mconfigptr 是一个 MXLEN 位只读 CSR,它保存配置数据结构的物理地址。软件可以遍历这个数据结构来发现有关硬件、平台及其配置的信息。

MXLEN-1 0
+---------------------------------------------+
| mconfigptr |
+---------------------------------------------+

menvcfg(Machine Environment Configuration Register)

menvcfg CSR 是一个 64 位读/写寄存器,它控制特权低于 M 的模式的执行环境的某些特征。

63 62 61 60 59 33 32 31 8 7 6 5 4 3 1 0
+---------+--------+------+------+---------+------+----------+------+-------+--------+---------+------+
| STCE | PBMTE | ADUE | CDE | WPRI | PMM | WPRI | CBZE | CBCFE | CBIE | WPRI | FIOM |
+---------+--------+------+------+---------+------+----------+------+-------+--------+---------+------+

mseccfg(Machine Security Configuration Register)

mseccfg 是一个可选的 64 位读/写寄存器,用于控制安全功能。

63 34 33 32 31 10 9 8 7 3 2 1 0
+---------+------+--------+-------+---------+-------+--------+---------+------+
| WPRI | PMM | WPRI | SSEED | USEED | WPRI | RLB | MMWP | MML |
+---------+------+--------+-------+---------+-------+--------+---------+------+

mtime,mtimecmp(Machine Timer Registers)

平台提供实时计数器,作为内存映射机器模式读写寄存器 mtime 公开。 mtime 必须以恒定频率递增,并且平台必须提供一种机制来确定 mtime 刻度周期。如果计数溢出, mtime 寄存器将回绕。

mtime 寄存器在所有 RV32 和 RV64 系统上都具有 64 位精度。平台提供 64 位内存映射机器模式定时器比较寄存器 ( mtimecmp )。每当 mtime 包含大于或等于 mtimecmp 的值时,机器计时器中断就会处于挂起状态,并将这些值视为无符号整数。中断保持发布状态,直到 mtimecmp 变得大于 mtime (通常是写入 mtimecmp 的结果)。仅当中断使能并且 mie 寄存器中的 MTIE 位被置位时,才会产生中断。

63 0
+---------------------------------------------+
| mtime |
+---------------------------------------------+
63 0
+---------------------------------------------+
| mtimecmp |
+---------------------------------------------+