CSR 位字段

RISC-V mip CSR 寄存器详解

地址 0x344特权级 M模式访问 读写 / MXLENMachine 状态、trap 与中断 CSR

机器中断挂起寄存器,指示当前有哪些中断处于挂起状态。

字段映射

按 bit 字段理解 mip

16 个关键字段
MXLEN-1:16

PLATFORM

平台定义;逐位可写或只读

中断编号 16 及以上供平台使用;mip 中每个对应挂起位可写或只读,可写位写 0 可清除,只读位必须由其他机制清除。

这个字段控制什么

  • - 中断编号 16 及以上供平台使用;mip 中每个对应挂起位可写或只读,可写位写 0 可清除,只读位必须由其他机制清除。

常见取值

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

15:14

0

只读0

标准中断原因空间中的固定零位。

这个字段控制什么

  • - 标准中断原因空间中的固定零位。

常见取值

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

13

LCOFIP

读写或只读零

本地计数器溢出中断挂起;若实现 Sscofpmf,则在 mip 中读写,并反映任一 mhpmeventn.OF 置位导致的本地计数器溢出中断请求;未实现 Sscofpmf 时为只读 0。

这个字段控制什么

  • - 本地计数器溢出中断挂起;若实现 Sscofpmf,则在 mip 中读写,并反映任一 mhpmeventn.OF 置位导致的本地计数器溢出中断请求;未实现 Sscofpmf 时为只读 0。

常见取值

0未挂起

LCOFIP 对应中断未挂起。

1挂起

LCOFIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

12

SGEIP / 0

H 扩展中为 hip 别名;否则只读0

实现 H 扩展时为Supervisor guest external interrupt挂起位,并与 hip.SGEIP 别名;未实现 H 时为只读 0。

这个字段控制什么

  • - 实现 H 扩展时为Supervisor guest external interrupt挂起位,并与 hip.SGEIP 别名;未实现 H 时为只读 0。

常见取值

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

11

MEIP

只读

机器模式外部中断挂起(只读,由平台特定机制设置)

这个字段控制什么

  • - 机器模式外部中断挂起(只读,由平台特定机制设置)

常见取值

0未挂起

MEIP 对应中断未挂起。

1挂起

MEIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

10

VSEIP / 0

H 扩展中为 hip 别名;否则只读0

实现 H 扩展时为Virtual supervisor external interrupt挂起位,并与 hip.VSEIP 别名;未实现 H 时为只读 0。

这个字段控制什么

  • - 实现 H 扩展时为Virtual supervisor external interrupt挂起位,并与 hip.VSEIP 别名;未实现 H 时为只读 0。

常见取值

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

9

SEIP

读写

监管者外部中断挂起;若实现 S 模式则在 mip 中可写,并与外部中断控制器信号逻辑或后作为读取值;CSR 写入/读改写只更新软件可写位。未实现 S 模式时为只读 0。

这个字段控制什么

  • - 监管者外部中断挂起;若实现 S 模式则在 mip 中可写,并与外部中断控制器信号逻辑或后作为读取值;CSR 写入/读改写只更新软件可写位。未实现 S 模式时为只读 0。

常见取值

0未挂起

SEIP 对应中断未挂起。

1挂起

SEIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

8

0

只读0

标准中断原因空间中的固定零位。

这个字段控制什么

  • - 标准中断原因空间中的固定零位。

常见取值

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

7

MTIP

只读

机器模式定时器中断挂起(只读,由硬件根据 mtime >= mtimecmp 自动设置)

这个字段控制什么

  • - 机器模式定时器中断挂起(只读,由硬件根据 mtime >= mtimecmp 自动设置)

常见取值

0未挂起

MTIP 对应中断未挂起。

1挂起

MTIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

6

VSTIP / 0

H 扩展中为 hip 别名;否则只读0

实现 H 扩展时为Virtual supervisor timer interrupt挂起位,并与 hip.VSTIP 别名;未实现 H 时为只读 0。

这个字段控制什么

  • - 实现 H 扩展时为Virtual supervisor timer interrupt挂起位,并与 hip.VSTIP 别名;未实现 H 时为只读 0。

常见取值

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

5

STIP

读写或只读

监管者定时器中断挂起;若未实现 stimecmp,则在 mip 中可写;若实现 stimecmp,则为只读并反映 stimecmp 产生的监管者定时器中断信号;未实现 S 模式时为只读 0。

这个字段控制什么

  • - 监管者定时器中断挂起;若未实现 stimecmp,则在 mip 中可写;若实现 stimecmp,则为只读并反映 stimecmp 产生的监管者定时器中断信号;未实现 S 模式时为只读 0。

常见取值

0未挂起

STIP 对应中断未挂起。

1挂起

STIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

4

0

只读0

标准中断原因空间中的固定零位。

这个字段控制什么

  • - 标准中断原因空间中的固定零位。

常见取值

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

3

MSIP

只读

机器软件中断挂起,通常只读并反映内存映射 msip。若系统仅有一个 hart,或平台改用机器外部中断递送机器级处理器间中断,则 mip.MSIP 与 mie.MSIE 可以同为只读 0。

这个字段控制什么

  • - 机器软件中断挂起,通常只读并反映内存映射 msip。若系统仅有一个 hart,或平台改用机器外部中断递送机器级处理器间中断,则 mip.MSIP 与 mie.MSIE 可以同为只读 0。

常见取值

0未挂起

MSIP 对应中断未挂起。

1挂起

MSIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

2

VSSIP / 0

H 扩展中为 hip 别名;否则只读0

实现 H 扩展时为Virtual supervisor software interrupt挂起位,并与 hip.VSSIP 别名;未实现 H 时为只读 0。

这个字段控制什么

  • - 实现 H 扩展时为Virtual supervisor software interrupt挂起位,并与 hip.VSSIP 别名;未实现 H 时为只读 0。

常见取值

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

1

SSIP

读写

监管者软件中断挂起;若实现 S 模式则在 mip 中可写,也可由平台特定中断控制器置 1;未实现 S 模式时为只读 0。

这个字段控制什么

  • - 监管者软件中断挂起;若实现 S 模式则在 mip 中可写,也可由平台特定中断控制器置 1;未实现 S 模式时为只读 0。

常见取值

0未挂起

SSIP 对应中断未挂起。

1挂起

SSIP 对应中断挂起;是否递送还取决于 enable、全局中断和委托状态。

0

0

只读0

标准中断原因空间中的固定零位。

这个字段控制什么

  • - 标准中断原因空间中的固定零位。

常见取值

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

官方依据与检索要点

mip 是地址 0x344 的 MXLEN 位 M 模式中断挂起 CSR。每个位报告同号中断是否挂起;是否进入 M 模式还取决于 mie、mstatus.MIE 和 mideleg。各位可写性按位定义。

官方 CSR 表列出 mip 地址 0x344,M 模式读写。
中断 i 进入 M 模式要求 mip[i] 和 mie[i] 都为 1,并满足当前特权级/全局 MIE 条件,且未被 mideleg 委托给更低模式。
MSIP、MTIP、MEIP 为只读或条件只读零;SSIP、STIP、SEIP、LCOFIP 的可写性有条件限制;H 扩展增加 SGEIP、VSEIP、VSTIP 和 VSSIP 别名。

汇编操作示例

使用 csrr/csrw/csrs/csrc 指令读写 mip,参考 RISC-V Privileged Architecture §2.8

csrr t0, mip
读取所有当前挂起的中断源
csrr t0, mip; andi t0, t0, 0x80; bnez t0, handle_mtip
检查 MTIP(bit7) 是否挂起并分支

与其他 CSR 的关系

mip 指示各中断源是否处于挂起状态。mip 与 mie 同一位位置对应同一中断源。MSIP 在 mip 中反映机器软件中断挂起状态;机器软件中断通常通过写内存映射的 msip 寄存器触发,而不是直接写 mip.MSIP。

关键位字段速查

SSIP(bit1) S模式软件中断挂起 | MSIP(bit3) M模式软件中断挂起 | STIP(bit5) S模式定时器中断挂起 | MTIP(bit7) M模式定时器中断挂起 | SEIP(bit9) S模式外部中断挂起 | MEIP(bit11) M模式外部中断挂起

读这个 CSR 时先看什么

  • - mip 是 MXLEN 位 M 模式中断挂起 CSR,地址 0x344。
  • - 每个位 i 对应 mie 中的同号 enable 位;标准低 16 位覆盖标准中断原因,16 及以上指定为平台使用。
  • - 各 pending 位可写性逐位定义:部分位只读并由平台、定时器或内存映射控制寄存器更新。

写入前的风险检查

  • - 只写官方定义为可写的软件挂起位;只读位必须通过对应平台、定时器或内存映射机制清除。
  • - SEIP 读取值是软件可写位与外部中断控制器信号的逻辑或,但 CSR 写入和读改写只更新软件可写位。
  • - 写 mip、mie、mstatus 或 mideleg 后,中断陷入条件必须在有界时间内重新求值。

放回真实流程里理解

1

读取 mip 查看哪些中断源处于挂起状态。

2

用 mie、mstatus.MIE 和 mideleg 判断挂起中断是否会进入 M 模式。

3

对可写 pending 位可写 0 清除;对只读 pending 位使用对应平台或定时器机制清除。

常见问题

mip 可以在任意特权级访问吗?

不能只看 CSR 名称判断。官方 CSR 地址表给出最低访问特权级;mip 位于 0x344,最低访问级为 M 模式。权限不足或访问未实现 CSR 时会触发非法指令异常。

写 mip 时最容易忽略什么?

写 mip 时必须逐位区分可写和只读 pending 位。可写 pending 位写 0 可清除;只读 pending 位需要通过平台中断控制器、mtimecmp/stimecmp 或内存映射 msip 等对应机制清除。