RISC-V N: 用户态中断

RISC-V N: 用户态中断 #

version: 2021-05-26

新增 CSR #

ustatus #

UXLEN-1 5   4    3  1    0
┌────────┬──────┬──────┬─────┐
│  WPRI  │ UPIE │ WPRI │ UIE │
└────────┴──────┴──────┴─────┘
  UXLEN-5   1       3     1

ustatus 是一个 UXLEN 位长的读写寄存器,记录和控制硬件的工作状态。

用户态中断使能位 UIE 为零时阻止用户态中断的发生。为了向用户态陷入处理程序提供原子性, UIE 中的值在用户态中断被处理时复制到 UPIE 并被置为零。

UIE 和 UPIE 是 mstatussstatus 中对应位的镜像。在硬件实现中三者可以是同一寄存器。

指令 URET 用于从陷入状态返回用户态。URET 将 UPIE 复制回 UIE,然后将 UPIE 置位,最后将 uepc 拷贝至 pc

用户态中断只能在用户态触发,所以不需要 UPP 位。

uip uie #

uipuie 均为 UXLEN 位的读写寄存器,其中 uip 存储等待处理的中断信息, uie 存储相应的中断使能位。

| WPRI | UEIP | WPRI | UTIP | WPRI | USIP |

| WPRI | UEIE | WPRI | UTIE | WPRI | USIE |

定义三种中断:软件中断、时钟中断、外部中断。用户态软件中断通过置位当前的 hart 的 uip 的软件中断等待 (USIP) 来触发。清零该位可以取消等待中的软件中断。当 uie 中的 USIE 为零时,用户态软件中断被禁止。

ABI 应当提供一种向其他 hart 发送处理器间中断的机制,这最终将置位接收 hart 的 uip 寄存器的 USIP 位。

除了 USIP, uip 中的其他位在用户态是可读的。

如果 uip 寄存器中的 UTIP 位被置位,一个用户态定时器中断将进入待处理状态。当 uie 寄存器中的 UTIE 位被置零时,用户态定时器中断被禁用。ABI 应该提供一个机制来清除一个待定的定时器中断。

如果 uip 寄存器中的 UEIP 位被置位,一个用户态外部中断将进入待处理状态。当 uie 寄存器中的 UEIE 位被置位时,用户态外部中断被禁用。ABI 应该提供屏蔽、解除屏蔽和查询外部中断原因的机制。

uipuie 寄存器是 mipmie 寄存器的子集。读取 uip/uie 的任何字段,或者写入任何可写字段,都会对 mip/mie 的相应字段进行读取或写入。如果系统实现了 S 模式,uipuie 寄存器也是 sipsie 寄存器的子集。

sedeleg sideleg #

为提升中断和异常的处理性能,可以实现独立的读写寄存器 sedelegsideleg,设置其中的位将特定的中断和异常交由用户态陷入处理程序处理。

当一个陷入被委托给一个权限较低的模式 u 时,ucause 寄存器被写入陷阱的原因;uepc 寄存器被写入发生陷阱的指令的虚拟地址;utval 寄存器被写入一个特定的异常数据;mstatus 的 UPIE 字段被写入陷阱发生时 UIE 字段的值;mstatus 的 UIE 字段被清零。mcause/scausemepc/sepc 寄存器以及 mstatus 的 MPP 和 MPIE 字段不被写入。

一个实现不应硬性规定任何委托位为一,也就是说,任何可以被委托的陷阱都必须支持不被委托。一个实现方案是选择可委托的陷入的子集。支持的可委托位可通过向每个比特位置写 1,然后读回 medeleg/sedelegmideleg/sideleg 中的值,看看哪些位上有 1。

目前,不支持触发低权限级的陷入

不会在用户态发生的应硬件恒零,如 ECall from S/H/M-mode

uscratch #

uscratch 寄存器是一个 UXLEN 位读/写寄存器。

uepc #

uepc 是 UXLEN 位读写寄存器。最低位(uepc[0])恒零。次低位 uepc[1] 视实现的对齐需求而定。

uepc 是 WARL 寄存器,应能存储所有的合法物理/虚拟地址,但不需要能挣钱存储非法地址。实现可以先将非法地址转为其他非法地址再写入 uepc

但陷入在用户态处理时,uepc 被写入中断或触发异常的指令的虚拟地址。此外,除了软件显式地写,否则 uepc 应永不被写。

ucause #

| Interrupt | Exception Code WLRL |

ucause 是 UXLEN 位长读写寄存器。

utvec #

| BASE[UXLEN-1 : 2] | MODE |

utvec 是 UXLEN 位长读写寄存器,存储陷入向量,包括向量基地址和向量模式。

BASE 是 WARL,可以存储任意合法的虚拟地址或物理地址,需要 4 字节对齐。特殊的模式可以有其他对齐标准。

valuenamedescription
0directbase
1vectoredbase + 4 * cause
reserved

utval #

存储内容待讨论

N 扩展指令 #

URET #