CSR 位字段

RISC-V mvip CSR 寄存器详解

地址 0x309特权级 Machine 模式访问 机器模式读写(MRW,具体位含别名和只读行为) / 64 位逻辑 CSR;RV32 低 32 位在 mvip,高 32 位在 mviphMachine AIA、定时器与间接中断 CSR

`mvip`(0x309)是 Smaia 在实现 S 模式时提供的 64 位 MRW 虚拟中断挂起 CSR;它为 Supervisor 级中断过滤与虚拟中断提供挂起状态,并为 SSIP、STIP 和 SEIP 提供规定的低位别名。

字段映射

按 bit 字段理解 mvip

9 个关键字段
63:14

Interrupt 63:14 virtual-pending bits

条件可写或只读 0

每位对应同编号中断。若对应 mvien 位只读为 0,规范建议该 mvip 位也只读为 0;13-63 中的其他位必须可写。

这个字段控制什么

  • - 每位对应同编号中断。若对应 mvien 位只读为 0,规范建议该 mvip 位也只读为 0;13-63 中的其他位必须可写。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

13

LCOFI virtual pending

条件可写;满足 Smcdeleg+Sscofpmf+Smaia 时必须可写

对应 LCOFI(中断 13)。同时实现 Smcdeleg、Sscofpmf 和 Smaia 时,该位必须实现且可写。

这个字段控制什么

  • - 对应 LCOFI(中断 13)。同时实现 Smcdeleg、Sscofpmf 和 Smaia 时,该位必须实现且可写。

常见取值

mvip[13]
0未挂起

可写时,0 表示虚拟 LCOFI 未挂起。

1挂起

可写时,1 表示虚拟 LCOFI 挂起。

12:10

Reserved

只读 0

AIA 保留,必须读为 0。

这个字段控制什么

  • - AIA 保留,必须读为 0。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

9

SEIP virtual pending

mip.SEIP 软件位别名或独立可写

mvien[9]=0 时,本位直接访问 mip.SEIP 的软件可写位;mvien[9]=1 时,本位与 mip.SEIP 分离并独立可写。改变 mvien[9] 不改变本位值。

这个字段控制什么

  • - mvien[9]=0 时,本位直接访问 mip.SEIP 的软件可写位;mvien[9]=1 时,本位与 mip.SEIP 分离并独立可写。改变 mvien[9] 不改变本位值。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

8:6

Reserved

只读 0

AIA 保留,必须读为 0。

这个字段控制什么

  • - AIA 保留,必须读为 0。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

5

STIP pending alias

mip.STIP 别名或只读 0

mip.STIP 可写时,本位是其别名;mip.STIP 不可写时(例如 menvcfg.STCE=1),本位只读为 0。

这个字段控制什么

  • - mip.STIP 可写时,本位是其别名;mip.STIP 不可写时(例如 menvcfg.STCE=1),本位只读为 0。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

4:2

Reserved

只读 0

AIA 保留,必须读为 0。

这个字段控制什么

  • - AIA 保留,必须读为 0。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

1

SSIP virtual pending

mip.SSIP 别名或独立可写

mvien[1]=0 时,本位别名到 mip.SSIP;mvien[1]=1 时,本位成为独立可写位。mvien[1] 从 0 变为 1 时,本位值变为 UNSPECIFIED。

这个字段控制什么

  • - mvien[1]=0 时,本位别名到 mip.SSIP;mvien[1]=1 时,本位成为独立可写位。mvien[1] 从 0 变为 1 时,本位值变为 UNSPECIFIED。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

0

Reserved

只读 0

AIA 保留,必须读为 0。

这个字段控制什么

  • - AIA 保留,必须读为 0。

常见取值

这个字段更适合结合上下文字段解释,不用按固定枚举背诵。

官方依据与检索要点

mvip 提供 Supervisor 级虚拟挂起状态;低位 SSIP/STIP/SEIP 具有不同的 mip 别名规则,高位则受对应 mvien 位实现方式约束。

mvip[1] 和 mvip[9] 的别名/独立状态由 mvien[1]/[9] 控制。
mvip[5] 只在 mip.STIP 可写时别名到它,否则只读为 0。
Smcdeleg+Sscofpmf+Smaia 强制 LCOFI 位 13 实现且可写。

读这个 CSR 时先看什么

  • - 每位对应中断号 0-63,但 12:0 中除 1、5、9 外均保留且只读为 0。
  • - 未实现 S 模式时 mvip 不存在。
  • - S 模式下的最小实现只需保留 mvip[1]、mvip[9] 和有时 mvip[5] 作为现有可写 mip 位的别名,其余位可只读为 0。

写入前的风险检查

  • - mvien[1] 从 0 变为 1 后,mvip[1] 的值是 UNSPECIFIED,必须显式建立所需状态。
  • - 不要把 mvip[5] 当作独立虚拟 STIP 位;它只能是可写 mip.STIP 的别名,否则读 0。
  • - mvien[9] 改变不会改变 mvip[9],但会改变它与 mip.SEIP 的关系。

放回真实流程里理解

1

确认实现 S 模式和 Smaia;RV32 使用 mviph 访问中断 32-63。

2

按中断号核对 mvien 与 mideleg,确定 mvip 位是否通过 sip 可见。

3

对 SSIP、STIP、SEIP 分别应用本页的别名规则,再写入允许独立写入的位。

常见问题

mvip 的所有 64 位都可写吗?

不是。12:0 中只有 1、5、9 有定义语义,且包含别名或只读情况;13-63 的可写性还取决于对应 mvien 位和扩展要求。