CSR 位字段

RISC-V vscause CSR 寄存器详解

地址 0x242特权级 Hypervisor 直接访问 / VS 别名访问访问 HRW(Hypervisor 读写) / VSXLENHypervisor 与虚拟化 CSR

vscause 是 VSXLEN 位 WLRL 的 guest trap 原因寄存器;进入 VS-mode trap 时写入中断标志和转换后的原因码。

字段映射

按 bit 字段理解 vscause

2 个关键字段
VSXLEN-1

Interrupt

读写

指示 vscause 低位原因码表示中断还是同步异常。

这个字段控制什么

  • - 指示 vscause 低位原因码表示中断还是同步异常。

常见取值

00

这是同步异常,低位字段按异常原因码解释。

11

这是中断,低位字段按中断原因码解释。

打开官方手册
VSXLEN-2:0

Exception Code

读写

WLRL 的 VS trap 原因码,必须保存 scause 可保存的同一组值。进入 VS-mode 的 VSEI/VSTI/VSSI 分别写为 supervisor 原因码 9/5/1;platform 中断是否做类似转换由实现决定。同步 VS trap 只来自 medeleg 与 hedeleg 均允许委托的原因。实现 AIA 时,该字段还必须有足够位数表示本 hart 的 vstopi.IID 最大值。

这个字段控制什么

  • - WLRL 的 VS trap 原因码,必须保存 scause 可保存的同一组值。进入 VS-mode 的 VSEI/VSTI/VSSI 分别写为 supervisor 原因码 9/5/1;platform 中断是否做类似转换由实现决定。同步 VS trap 只来自 medeleg 与 hedeleg 均允许委托的原因。实现 AIA 时,该字段还必须有足够位数表示本 hart 的 vstopi.IID 最大值。

常见取值

同步异常
0指令地址未对齐

同步异常原因码 0。

1指令访问错误

同步异常原因码 1。

2非法指令

同步异常原因码 2。

3断点

同步异常原因码 3。

4Load 地址未对齐

同步异常原因码 4。

5Load 访问错误

同步异常原因码 5。

6Store/AMO 地址未对齐

同步异常原因码 6。

7Store/AMO 访问错误

同步异常原因码 7。

8VU 模式环境调用

同步异常原因码 8。

12指令页错误

同步异常原因码 12。

13Load 页错误

同步异常原因码 13。

15Store/AMO 页错误

同步异常原因码 15。

18软件检查

同步异常原因码 18。

19硬件错误

同步异常原因码 19。

中断
1VS 软件中断

当 Interrupt 位为 1 时,低位原因码 1 表示 VS 软件中断。

5VS 定时器中断

当 Interrupt 位为 1 时,低位原因码 5 表示 VS 定时器中断。

9VS 外部中断

当 Interrupt 位为 1 时,低位原因码 9 表示 VS 外部中断。

13计数器溢出中断

当 Interrupt 位为 1 时,低位原因码 13 表示计数器溢出中断。

打开官方手册
官方依据与检索要点

vscause 记录进入 VS-mode 的最后一次 trap 原因。V=1 时替代 scause,标准 VS 中断原因会转换为 guest 可见的 supervisor 原因码。

vscause 的地址、访问类和宽度按官方 CSR 表核对:0x242,HRW(Hypervisor 读写),VSXLEN。
H 扩展规定 V=1 时 scause 访问替代到 vscause;V=0 时 vscause 不直接影响机器行为。
Exception Code 是 WLRL;VSEI/VSTI/VSSI 进入 VS-mode 时分别转换为原因码 9/5/1。AIA 还要求该字段能表示本 hart 的最大 vstopi.IID。

读这个 CSR 时先看什么

  • - vscause 的独立 CSR 地址按官方表属于 HRW(Hypervisor 读写) 访问类;VS/VU guest 通常通过对应 supervisor CSR 别名访问 VS 状态。
  • - H 扩展定义 vscause;V=1 时 scause 访问替代到 vscause,V=0 时 vscause 不直接影响机器行为。

写入前的风险检查

  • - Exception Code 是 WLRL,必须支持与 scause 相同的值集合;除受支持的异常码外,软件写入值不保证保持。

放回真实流程里理解

1

M/HS 软件可通过独立 CSR 地址访问 vscause 的 VS 副本。

2

当 V=1 时,guest 访问 scause 类 supervisor CSR 会替代到对应 VS 状态;直接访问独立 VS CSR 地址会触发 virtual-instruction exception。

3

进入 VS-mode trap 时同时写 vsepc、vscause 和 vstval;根据 Interrupt 位解释原因码。

常见问题

vscause 的独立地址能由 VS-mode 直接访问吗?

不能。H 扩展规定 V=1 时 guest 通过对应 supervisor CSR 别名访问 VS 状态;直接读写独立 VS CSR 地址会触发 virtual-instruction exception。

vscause 主要保存什么?

vscause 保存进入 VS-mode 的最后一次 trap 的 Interrupt 标志和原因码,供 guest trap handler 区分并处理异常或中断。