RISC-V h拓展
https://tinylab.org/riscv-kvm-virt-mode-switch/
https://tinylab.org/riscv-kvm-virt-trap/
特权模式
指令集中约定用虚拟化模式 V (virtualization mode) 来标记当前是否是在 Guest 系统中运行。V=1 表示当前确实运行在 Guest 系统中,V=0 则表示不运行在 Guest 中。
V | 虚拟化(H-Level Arch.) | V | 虚拟化特例 | 名义特权级 | 运行的程序 |
---|---|---|---|---|---|
1 | VU-mode | 0 | U-mode | U-0 | Guest OS的应用程序 |
1 | VS-mode | S-1 | Guest OS | ||
0 | HS-mode | 0 | HS-mode | S-1 | 宿主OS / Hypervisor |
0 | M-mode | 0 | M-mode | M-3 | opensbi |
在上述表格中,虚拟化特例指 hart 所指示的应用程序以 U-mode 直接运行在一个运行于 HS-mode 的 OS 上。
名义特权级(Nominal Privilege)是在 S-mode 基础上的特权级约定,分为 U, S, M 三级,分别用 0,1,3 表示,各类指令集模拟器均以此标准实现。
相关CSR
mstatus寄存器
- MIE、SIE:当前中断使能
- SPIE、MPIE:(previous) 记录trap之前的中断使能
- SPP、MPP:记录trap之前的特权级别
- TSR(Trap SRet):拦截supervisor异常返回指令sret。TSR=1,在S-mode下支持sret会导致illegal instruction exception。TSR=0,则允许S-mode下执行sret。
hstatus寄存器
- SPV(supervisor previous Virtualization):sstatus.SPP 在 trap 时会被设置为 trap 对应的名义特权级,此时 hstatus.SPV 就会被设置为 trap 时的 V 值;当 V=0 时执行 sret 指令,SPV 置为 V。
- SPVP (Supervisor Previous Virtual Privilege):V=1 时,行为与 sstatus.SPP 相同,即置为 trap 时的名义特权级;V=0 时,保持不变。
- GVA (Guest Virtual Address):trap 到 HS-mode 时写入:对于写虚拟地址到 stval 的寄存器的 trap(breakpoint, address misaligned, access fault, page fault, or guest-page fault),hstatus.GVA 置 1,对于其他 trap 置 0。
sstatus
sstatus 是 mstatus 的一个子集。
- SPP:用于标识 trap 进入 S-mode 之前 hart 所在的特权级:来自 U-mode 则置 0,否则为 1。
- trap 处理过程中 sstatus 的行为
trap to S-mode: SPIE=SIE, SIE=0
sret: SIE=SPIE, SPIE=1
vsstatus
和sstauts一样。
V=1 时,vsstatus 用于替代 sstatus,所以通常针对 sstatus 的操作会替换为 vsstatus。
中断处理流程
中断委托
从上图可知,正常情况下 trap 都会导致 hart 的控制转移至 M-mode,处理之后通过 mret 指令返回到原来的模式。
特殊情况下 trap 会经由 mdeleg 或 mideleg 委派从 HS-mode 或 VS-mode 转移至 HS-mode,或再经由 hedeleg 或 hideleg 委派从 VU-mode 转移至 VS-mode。
被委派至 HS-mode 和 VS-mode 的 trap 在处理完毕后,将通过 sret 指令返回至 trap 之前的模式。