rvh h-extension 1.0
- sstatus 反映 Supervisor-mode(后面简称 S-mode) 下的cpu 状态, 这里仅以其 SPP(Supervisor previous previlege) 做介绍, 如第一次想从S-mode 执行到 User-mode(下简称U-mode) 下, 需要设置sstatus.SPP=U-mode (0)
- satp (Supervisor Address Translation and Protection (satp) Register), 保存了第一级页表地址
- sepc (Supervisor Exception Program Counter) 保存发生trap/中断 前的 pc 地址, 此处如为第一次执行该用户态应用, 则需要将其设置为用户态的入口地址
- sret (S-mode return), 通俗来讲就是调用sret后, 硬件会设置 pc = spec, 下一条指令从sepc 的位置执行. 除此之外, sret 还会判断 sstatus.SPP 确定下一刻要将cpu 置为哪个特权模式, 此处如为第一次执行用户态应用, 需要将sstatus.SPP 置为 U-mode, 下一刻cpu会切换特权级, 从S-mode 切换到 U-mode.
- scause S-mode 原因寄存器, 在发生异常/中断时, scause 会被硬件修改对应的位, 表明当前进入异常/中断的原因.
虚拟机 os,需要完整的运行环境。
我们考虑一个简单的linux运行需要什么环境
- 1,通用寄存器,传参,sp,pc这些。
- 2,CSR,比如status,cause寄存器这些,配置cpu的运行状态,或者获取cpu的运行状态等。
- 3,内存,需要管理虚拟地址到物理地址的转换。
- 4,trap handler,发生异常或者中断时的处理方法。
- 5,特权等级。
这些东西,通过纯软件也可以做模拟,但是效率和安全性上都会受影响,RVH ISA就是在CPU 硬件层面上给这些虚拟机OS运行环境需要的资源进行了明确的要求和定义。
HS-模式的作用与S-模式相同,但有额外的指令和CSR,2-stage translation, 翻译GVA->HPA, 为guest os 提供内存和mmio的外设地址空间模拟, 常规的S模式操作系统可以在HS模式或VS模式下执行,无需修改。
特权模式
Hypervisor and Virtual Supervisor CSRs
这些csr 有两类:
- h开头的csr 供hypervisor 管理程序 vm 使用
- vs 开头的寄存器, 给guest os 使用. 可以看作是S-mode 专属csr的备份
为什么需要vs* 的csr, cpu 可以切换普通的进程, 也可以在普通进程和vcpu 之间进行调度, 如果没有vs* 的csr, 那进程和vcpu的上下文就非常的混乱.
在HS模式下运行的操作系统或管理程序使用s-mode CSR与异常、中断和地址转换子系统进行交互
H-extension 定义了额外的CSR提供给HS模式,但不提供给VS模式,以管理 2-stage 地址翻译 和控制VS-mode guest os的行为:hstatus, hedeleg, hiddenleg, hvip, hip, hie, hgeip, hgeie, henvcfg, henvcfgh, hcounteren, htimedelta, htimedeltah, htval, htinst, and hgatp。
当V=1时,VS CSRs代替了相应的s-mode的CSRs,接管了通常监督器CSRs的所有功能。S-mode CSR的指令应改为访问相应的VS CSR。当V=1时,试图通过自己的独立CSR地址直接读取或写入VS CSR会导致虚拟指令异常。VS CSRs本身只能从M模式或HS模式访问。
一些标准 S-mode CSR(senvcfg、scounteren和scontext …)没有匹配的VS CSR, 这些csr的行为在V=1 和 V=0 时都是一样的, 这意味着hypervisor 需要保存恢复这些csr的状态.
hstatus
- 当VTSR=1时,VS模式中执行SRET的尝试会引起一个虚拟指令异常。
- 当VTW=1时(并假设mstatus.TW=0),如果WFI没有在特定的时间限制内完成,VS模式中执行WFI的尝试会引起一个虚拟指令异常。
- 当VTVM=1时,VS模式中执行SFENCE.VMA或SINVAL.VMA或访问CSR satp的尝试会引起一个虚拟指令异常。
VGEIN (Virtual Guest External Interrupt Number) 在中断直通场景下使用, 对于支持aia imsic 的中断控制器, 用于选择一个 virtual guest external interrupt file
当VGEIN=0 时, 不选择 virtual guest external interrupt file, 表示是物理cpu的中断.
HU (Hypervisor in U-mode), HU位允许管理程序的一部分在U模式下运行,以更好地保护软件错误,同时仍然保留对虚拟机的访问。
HU=1, HLV, HLVX, and HSV 可以在 HS-mode 和 U mode下执行
HU=0, 在U-mode下执行 HLV, HLVX, and HSV 会触发非法指令异常
SPV 每当陷阱进入HS模式时,SPV位(进入 HS-mode 以前的模式)就会被写入。hstatus中的SPV位在陷阱时被设置为虚拟化模式V的值。如 V=0时执行SRET指令,SPV被设置为 0。
hedeleg hideleg
中断代理
medeleg mideleg 相应位被设置后, S-mode 可以接管 部分异常/中断
同理 hedeleg hideleg 相应位被设置后, VS-mode 可以接管 HS-mode的部分异常/中断
hideleg
如果一个被委托给HS模式的中断(使用mideleg)被进一步委托给VS模式, 在hideleg的15:0位中,10、6和2位(对应于标准的VS级中断)是可写的,12、9、5和1位(对应于标准的S级中断)是只读零。
通常
virtual supervisor external interrupt (10)
virtual supervisor timer interrupt (6)
virtual supervisor software interrupt (2)
对于中断注入和中断直通来说, 上述 10/6/2 bit位是必须被设置的.
VS-mode下 guest os接收到这些中断后, 10/6/2 会被转换位 9/5/1 号中断
这样是为了保持 guest os可以使用普通的kernel版本, 不需要再为guest 修改中断相关的源码
一个被委托给HS模式的同步陷阱(使用medeleg)被进一步委托给VS模式,如果在陷阱之前V=1,并且相应的hedeleg位被设置。hedeleg的每一位都应是可写的或只读的零。
hvip hip hie vsip vsie hgeip hgeie
上述均为管理 guest os 相关的中断相关的csr
hvip
Setting VSEIP in hvip asserts a VS-level external interrupt;
setting VSTIP asserts a VS-level timer interrupt;
setting VSSIP asserts a VS-level software interrupt.
hip
vsip hip hvip 之间的关系如下:
hideleg 开启时(bit 10/6/2 不为0时)
- vsip.SEIP = hip.VSEIP vsip.STIP = hip.VSTIP vsip.SSIP = hip.VSSIP
- VSEIP is read-only in
hip
, and is the logical-OR of these interrupt sources:- bit VSEIP of
hvip
; - bit of
hgeip
selected byhstatus
.VGEIN - any other platform-specific external interrupt signal directed to VS-level.
- bit VSEIP of
- VSTIP is read-only in
hip
, and is the logical-OR of:hvip
.VSTIP- any other platform-specific timer interrupt signal directed to VS-level.
- VSSIP in
hip
is an alias (writable) of the same bit inhvip
.- 即 vsip.SSIP = hip.VSSIP = hvip.VSSIP
- VSEIP is read-only in
- vsie.SEIE = hie.VSEIE vsie.STIE = hie.VSTIE vsie.SSIE = hie.SSIE
真正影响guest os的是vsip , guest os 运行时处于V=1 mode, vsip被替换为sip,
- vsip software 中断来自于hvip (来自于HS hypervisor), 或者guest os 自己.
- vsip timer 中断来自于hvip (来自于 HS hypervisor), 或guest os 自己, 或 platform-specific timer interrupt signal directed to VS-level
- vsip guest external 中断来自于hvip (来自于HS hypervisor), 或hstatus.VGEIN -> hgeip 或 any other platform-specific external interrupt signal directed to VS-level
hgeip read-only, 由硬件置位, 在支持中断直通的中断控制器上, 由中断控制器进行置位, 代表来自于中断控制器的哪个virtual guest interrupt file. 简单来讲是表示直通的哪个vcpu收到了中断.
Bits hip
.SGEIP and hie
.SGEIE are the interrupt-pending and interrupt-enable bits for guest external interrupts at supervisor level (HS-level).
hip.SGEIP 和 hip.SGEIE 是给HS 用的, 重点看 SGEIP, 这个是hgeip & hgeie and的结果, 代表的有guest external 中断待处理.
henvcfg henvcfgh
FIOM (Fence of I/O implies Memory)
FIOM=1 and V=1 时, 原子指令访问的区域排序为设备I/O,其aq和/或rl位被设置,那么该指令的排序就像它同时访问设备I/O和内存一样。
PBMTE = 1, Svpbmt extension is available for VS-stage address translation
PBMTE=0, Svpbmt extension is not implemented for VS-stage address translation
STCE位的定义将由即将到来的Sstc扩展提供。它在henvcfg中的意义可能会在批准该扩展之前发生变化
CBZE位的定义将由即将到来的Zicboz扩展提供。它在henvcfg中的分配可能会在批准该扩展之前发生变化。
CBCFE和CBIE位的定义将由即将到来的Zicbom扩展提供。它们在henvcfg中的分配可能会在批准该扩展之前发生变化。
Register henvcfgh does not exist when HSXLEN=64
hcounteren
Hypervisor Counter-Enable Register
控制硬件性能监测计数器对客户虚拟机的可用性
V=1时, 当 CY、TM、IR或HPMn位未设置时,试图读取cycle、time、instret或 hpmcountern寄存器会触发虚拟指令异常, 即使在 mcouteren 中对应的bit位 为1时.
当这些位被设置了, VS-mode下才能读取对应的寄存器.
在VM-mode下, 需要hcounteren 和 scounteren 的对应位都被设置才可以读取对应的寄存器
htimedelta
Hypervisor Time Delta Registers
读取VS或VU模式下的time CSR,返回的是 htimedelta + time csr。
htval
因异常进入HS-mode时,htval与stval一起被写入额外的特定异常信息,以协助软件处理陷阱。
(htval被写入GPA, stval 被写入GVA)
- 发生 guest-page-fault trap 时, htval 会被写入异常的 GPA >> 2
- 其他异常进入的trap , htval = 0
- 未来可能会为其他异常修改htval的行为
当VS阶段的翻译未能完成时 (在第一阶段的GVA->GPA 发生异常时), 此时GPA是未知的。CSR htinst中提供了额外的信息来消除这种情况的歧义。
其他情况下, 对于未对齐的地址load/store 引发的 guest page fault, htval 会被写入对应的GPA.
对于具有可变长度指令的系统上的指令异常,非零的htval对应于指令的异常部分,如stval中的虚拟地址所示。
htinst
因异常进入HS-mode时, htinst 被写入了触发异常的指令, 以协助软件处理trap
hgatp
Hypervisor Guest Address Translation and Protection Register
MODE=Bare, VS-mode的 物理地址等于S-mode下的物理地址,除了物理内存保护外,对GPA没有进一步的内存保护。
2 more bits at the high end in VPN[2]
对于实现39位虚拟地址的机器(Sv39),这使得管理程序扩展可以支持多达41位的客户物理地址空间,而不需要硬件支持48位的虚拟地址(Sv48)或回落到使用影子页表模拟更大的地址空间。
VMID (guest os id) 的位数不是固定的, VMIDLEN 在64位中 最多 14位
如果hgatp 发生了改变, 需要执行HFENCE.GVMA 刷新G-stage 页表
v开头的csr
vsstatus vsip vsie vstvec vsscratch vsepc vscause vstval vsatp
不过多介绍, 行为同S-mode的 s开头的csr 行为一致
虚拟化H扩展定义了一个硬件状态位,称作V状态,可以为0或1,V状态不同,定义和访问的CSR寄存器也不同。
- 当V为0时
- 以“s”开头的CSR寄存器表示当前操作系统的状态
- “h”开头的用于支持和实现虚拟化软件
- “vs”开头的代表运行在虚拟化技术上的系统状态。
- 当V为1时
- “s”开头的寄存器指向了前文以“vs”开头的寄存器。
Hypervisor Instructions
Hypervisor Virtual-Machine Load and Store Instructions
管理程序虚拟机的加载和存储指令只在M模式或HS模式下有效,或者在hstatus.HU=1时在U模式下有效。
每条指令都像V=1一样执行显式内存访问;
也就是说,具有地址转换和保护,以及适用于VS模式或VU模式的内存访问的endianness。
hstatus.SPVP控制访问的权限级别。
- 当SPVP=0时,显式内存访问在VU模式下完成,
- 而当SPVP=1时,在VS模式下完成。
当V=1时,应用两阶段地址转换,HS sstatus.SUM被忽略。HS sstatus.MXR 使地址翻译的两个阶段(VS阶段和G阶段)都可以读到只有执行权限的page,而vsstatus.MXR只影响第一个翻译阶段(VS阶段)
LB、LBU、LH、LHU、LW、LWU和LD,都有一个相应的虚拟机加载指令。
HLV.B, HLV.BU, HLV.H, HLV.HU, HLV.W, HLV.WU, 和HLV.D。
对于每条RV32I或RV64I存储指令,SB、SH、SW和SD,都有一个相应的虚拟执行指令
当然,指令HLV.WU、HLV.D和HSV.D对RV32是无效的。
指令HLVX.HU HLVX.WU 与 HLV.HU和HLV.WU相同,只是在地址转换过程中,执行权限取代了读权限。
也就是说,在地址转换的两个阶段有执行权限的页都有读权限。
对于由地址转换产生的HS-mode的HPA,其需要具有执行和读权限.
在VS-mode 或 VU-mode 下执行这些指令会触发虚拟指令异常
hstatus.HU=0时, 在U-mode下执行这些指令会触发指令异常
Hypervisor Memory-Management Fence Instructions
HFENCE.VVMA和HFENCE.GVMA执行的功能与SFENCE.VMA(第4.2.1节)类似
只是 HFENCE.VVMA 适用于由CSR vsatp 控制的VS-stage translation (GVA->GPA)
HFENCE.GVMA 适用于 CSR hgatp 控制的 G-stage translation (GPA->HPA)。
指令SFENCE.VMA只适用于由当前satp控制的 1-stage translation
特殊的, 在guest os 中执行sfence.vma 适用于 vs-stage translation
HFENCE.VVMA is valid only in M-mode or HS-mode
执行HFENCE.VVMA保证任何已经对当前 hart 可见的先前存储在所有隐式读取之前被排序,该hart 为VS阶段地址转换所做的指令为
- HFENCE.VVMA
HFENCE.GVMA 在 M-mode下有效或
当mstatus.TVM=0时,HFENCE.GVMA在HS模式下有效
排序指令, 执行 HFENCE.GVMA 后, 先前执行的存储指令对于 排在 HFENCE.GVMA 后面的隐式内存读取指令是可见的
Machine-Level CSRs
h-extension 引入后修改了 mstatus、mideleg、mip和mie,并增加了CSRs mtval2和mtinst。
mstatus
增加了两个bit MPV GVA
当因异常进入 m-mode时, mpv (Machine Previous Virtualization Mode) 被设置
mret执行时,硬件状态位 V 被设置为 MPV,除非MPP=3,在这种情况下V仍然是0。
当因异常进入 m-mode时, GVA (Guest Virtual Address) 被设置
因这些异常 (breakpoint, address misaligned, access fault, page fault, or guest-page fault)
mtval 被写入 guest virtual address, GVA is set to 1.
For any other trap into M-mode, GVA is set to 0.
修改了 TVM MPRV (Modify PRiVilege)
TVM=1时, HS-mode 不能访问hgatp, 不能执行 HFENCE.GVMA 和 HINVAL.GVMA
MPRV=0, translation and protection behave as normal, using the translation and protection mechanisms of the current privilege mode
当MPRV=1时,显式内存访问被翻译和保护,endianness被应用
mideleg
h-extension 加入后, 其10/6/2 变成了只读
如果 guest external interrupts(GEILEN) 不为0时, 12 bit 也变成只读, 意味着这种情况下 VS-level的interrupts 总是被委托给 VS-mode
mideleg 中bit位是0的, 在 hideleg hip hie的相应bit是只读的
mip mie
SGEIP, VSEIP, VSTIP VSSIP in mip 等同于 hip的相应bit位
SGEIE, VSEIE, VSTIE VSSIE in mie 等同于 hie的相应bit位
mtval2
Machine Second Trap Value Register
在发生异常进入 M-mode后, mtval2 被写入额外的 异常特定的信息
- guest-page-fault 异常, mtval2 要么是0 要么是 GPA >> 2, 对于其他异常, 总是为0, 未来可能被扩展
如果是因为 vs-stage 发生的 guest-page-fault, gpa是无效的, 需要借助 mtinst 进行辨别
对于地址未对齐导致的 guest page fault, mtval2中的非零GPA 对应于mtval中的虚拟地址所表示的访问的page fault部分。
对于变长地址指令, mtval2 对应于 mtval 表示的虚拟地址 page fault部分.
mtinst
Machine Trap Instruction Register
在发生异常进入 M-mode 后, 提供发生异常的指令信息
2-stage translation
vs-stage vsatp GVA->GPA
G-stage hgatp GPA->HPA
G-stage translation
G阶段地址翻译是Sv32、Sv39、Sv48或Sv57的通常基于页面的虚拟地址翻译方案的一个变种。在每种情况下,传入地址的大小都会扩大2比特(到34、41、50或59比特)。为了适应2个额外的位,根页表(仅)被扩展了4倍,即16KiB,而不是通常的4KiB。
G-stage 阶段发生 page fault 时, 触发的异常是 guest-page-fault exceptions
所有G阶段PTE中的G位被保留用于以后进行扩展
G-stage 的pte 的权限同样会被检查, 如果是因权限问题导致的page fault, 异常原因是 instruction, load, or store/AMO guest page fault
Guest-Page Faults
该类异常通常会被委托给HS-mode, 需要设置medeleg 的对应bit. 如不进行委托, 则有m-mode 进行处理.
发生异常时, mtval 或 stval 会写入发生page fault时的 GVA.
mtval2 或 htval 会写0或GPA>>2.
CSR mtinst或htinst 会被写入 page fault时的指令信息
当一条指令获取或非对齐的内存访问跨越了一个页面边界时,会涉及两个不同的地址转换。在这种情况下发生客户页面故障时,写入mtval/stval的fault 虚拟地址与普通page fault所需的相同。因此,如果该页边界的字节在被访问的字节之间,page fault 的 虚拟地址可能是一个高于指令的原始虚拟地址的页边界地址。
当发生该异常时, 是由于 VS-stage 阶段导致的, 写到 mtval2/htval的GPA 等同于 写到mtval/stval的VA 地址.
Memory-Management Fences
讨论 HFENCE.VVMA 和 HFENCE.GVMA 的使用
见前文
因修改PMP 导致影响到了2-stage 页表所在的物理地址或页表所指向的物理地址的情况下
M-mode 的软件修改了PMP的设置后, 需要同步给虚拟内存子系统
对于HS-mode的软件所使用的虚拟地址, M-mode 下可以通过sfence.vma 0 0 刷新页表
hfence.gvma 0 0 刷新所有的G-stage 和 VS-stage 的页表缓存
防止错误使用了 被修改的 pmp 设置影响到的物理地址对应的 缓存的页表项 .
Traps
Trap Cause Codes
H-extension加入后, cause中添加了:
VS级中断(中断2、6、10)、S-mode 级guest external interrupt(中断12)、虚拟指令异常(22)和 guest page fault(20、21、23。此外,来自VS模式的 ecall 调用 被指定为10,而来自HS-mode 或S-mode的ecall 调用则像往常一样使用原因9。
#cause #riscv_cause scause mcause
当V=1时,如果尝试的指令是HS legal的,但由于权限不足或由于HS-mode CSR(如scounteren或hcounteren)明确禁用该指令而被阻止执行的, 通常会触发一个虚拟指令异常(代码22),而不是非法指令异常.
如果一条指令在HS模式下执行是有效的(对于指令寄存器操作数的某些值),假设CSR mstatus的字段TSR和TVM都是零,那么它就是HS legal 的。
具体来说,在以下情况下触发一个虚拟指令异常:
- in VS-mode, attempts to access a counter CSR when the corresponding bit in hcounteren is 0 and the same bit in mcounteren is 1;
- in VU-mode, attempts to access a counter CSR when the corresponding bit in either hcounteren or scounteren is 0 and the same bit in mcounteren is 1;
- in VS-mode or VU-mode, attempts to execute a hypervisor instruction (HLV, HLVX, HSV, or HFENCE);
- in VS-mode or VU-mode, attempts to access an implemented hypervisor CSR or VS CSR when the same access (read/write) would be allowed in HS-mode, assuming mstatus.TVM=0;
- in VU-mode, attempts to execute WFI when mstatus.TW=0, or to execute a supervisor instruction (SRET or SFENCE);
- in VU-mode, attempts to access an implemented supervisor CSR when the same access (read/write) would be allowed in HS-mode, assuming mstatus.TVM=0;
- in VS-mode, attempts to execute WFI when hstatus.VTW=1 and mstatus.TW=0, unless the instruction completes within an implementation-specific, bounded time;
- in VS-mode, attempts to execute SRET when hstatus.VTSR=1;
- in VS-mode, attempts to execute an SFENCE.VMA or SINVAL.VMA instruction or to access satp, when hstatus.VTVM=1.
对RISC-V特权架构的其他扩展可能会增加当V=1时导致虚拟指令异常的情况集合。
h-extension 加入后的 同步异常优先级
如果一条指令可能引起多个同步异常,表8.7中优先级递减的顺序表明哪个异常被采取并以mcause或scause报告。
Trap Entry
当陷阱发生在VS模式或VU模式时,它将进入M模式,除非由medeleg或mideleg委托,在这种情况下,它将进入HS模式,除非由hedeleg或hideleg进一步委托,在这种情况下,它将进入VS模式。
未设置委托, MPV and MPP in mstatus 根据进入trap/中断 前的模式设置为对应的值
如果设置了委托 mideleg medeleg, trap / 中断 进 HS-mode前会将 sstatus的SPV SPP 设置为对应的值
当进一步设置了 hideleg hedeleg, trap/中断 进 VS-mode 前讲 vsstatus SPP 设置为对应值
V 始终为1
mtinst htinst
当因为 trap 进入 M-mode 或 HS-mode时
mtinst 或 htinst 被更新为:
- 0
- trap 时的 instruction
- 自定义值 (trapping instruction 不是标准的)
- 特定的伪指令
除非需要一个伪指令值,否则写入 mtinst 或 htinst 的值可能总是零,这表明硬件在寄存器中没有为这个特定的陷阱提供任何信息
写入陷阱指令 CSR 的值有两个目的。
- 首先是提高陷阱处理程序中指令仿真的速度,部分是通过允许处理程序跳过从内存中加载陷阱指令,部分是通过避免一些解码和执行指令的工作。
- 第二个目的是通过伪指令提供关于由 VS 阶段地址转换的隐式内存访问引起的 guest page fault 的额外信息。
在中断时,写入陷阱指令寄存器的值总是零。
表8.11显示了每个标准异常原因可能被自动写入陷阱指令寄存器的值。对于阻止获取指令的例外情况,可以只写零或一个伪指令值。只有trapping 的指令是非标准的,才能自动写入一个自定义值。未来的标准或扩展可能允许其他值被写入,从先前建立的允许值集合中选择。
同步异常可以向陷阱指令寄存器写入捕获指令的标准转换,只针对由显式内存访问(来自加载、存储和AMO指令)产生的异常。目前只为这些内存访问指令定义了标准转换。
如果一个没有定义转换的标准指令发生了同步陷阱,陷阱指令寄存器应以零写入(或者在某些情况下,以特殊的伪指令值写入)。
对于一个标准的压缩指令(16位大小),转换后的指令如下:
- 转换为32位等效指令。
- bit 1 被替换为 0
对于guest page fault,在以下情况下,陷阱指令寄存器被写入一个特殊的伪指令值。
(a) 该故障是由VS阶段地址转换的隐式内存访问引起的,
(b) 一个非零值(GPA)被写入mtval2或htval。
如果这两个条件都满足,写入mtinst或htinst的值必须取自下表;不允许为零。
伪指令 0x00003020 用于硬件试图自动更新VS级页表中的位A和/或D的情况。
所有其他用于VS阶段地址转换的隐式内存访问将被读取。
如果硬件从未自动更新VS级页表中的位A或D(将此留给软件),那么写入伪指令的情况就不会出现。这样的页表更新实际上必须是原子性的,而不仅仅是一个简单的写
Trap Return
MRET指令被用来从一个进入M模式的陷阱返回。MRET首先根据mstatus.MPP mstatus.MPV 中的值确定新的特权模式是什么,然后MRET 设置 mstatus MPV=0,MPP=0,MIE=MPIE,和MPIE=1。最后,MRET设置先前确定的特权模式,并设置pc=mepc。
SRET指令用于从进入HS模式或VS模式的陷阱返回。它的行为取决于当前的虚拟化模式。
当以M模式或HS模式执行时(即V=0),SRET首先根据 hstatus.SPV 和 sstatus.SPP 中的值确定新的特权模式是什么,然后SRET设置hstatus.SPV=0,在sstatus中设置SPP=0,SIE=SPIE,和SPIE=1。最后,SRET设置先前确定的特权模式,并设置pc=sepc。
当以VS模式执行时(即V=1),SRET根据 vsstatus.SPP 设置特权模式,在vsstatus设置SPP=0、SIE=SPIE和SPIE=1,最后设置pc=vsepc。
- hstatus cpu 虚拟模式状态寄存器, 此处关注的是其 SPV位, 该位决定 sret 运行后将cpu 的V状态, V=0 还是 V=1
- sstatus (S-mode) cpu 运行状态寄存器, 此处 host os 和 guest os 都用到了该csr, sret 返回时, 需要综合判断 hstatus.SPV 和 sstatus.SPP, 来确定下一刻cpu 从当前的HS-mode 返回到 VS-mode/HS-mode/U-mode/VU-mode
- hgatp (Hypervisor Guest Address Translation and Protection Register), 用于G-stage 页表翻译, 需要将其设置为guest os的G-stage 的第一级页表基址
- hideleg/hedeleg (Hypervisor Trap Delegation Registers) hypervisor 中断/异常委托寄存器, 此处只需要在第一次进入guest os 时设置
- stvec S-mode 下中断/异常向量入口地址
- htval hinst 用于判断导致异常时发生的异常指令. 如G-stage page fault, hinst 反映了发生异常时执行的什么指令, htval 表示发生异常时GPA的地址
- mmio 地址触发的G-stage page fault, 一般表明是模拟外设的地址空间出现了page fault, 此类异常一般会由用户态的管理程序(qemu)进行模拟
- sret 根据hstatus.SPV 和 sstatus.SPP 位决定返回 HS-mode/U-mode/VS-mode/VU-mode 中的哪一个.
- scause S-mode 原因寄存器, 在发生异常/中断时, scause 会被硬件修改对应的位, 表明当前进入异常/中断的原因.
History
0 | 2017/5/7 |
---|---|
0.1-draft | 2017/11/10 |
0.2-draft | 2018/10/15 |
0.2 | 2018/12/3 |
0.3 | 2019-03-06 |
0.4 | 2019/6/17 |
0.5 | 2019/10/30 |
0.6 | 2020/2/9 |
0.6.1 | 2020/5/6 |
0.6.2 | 2021/7/31 |
1.0.0-rc | 2021/9/16 |
1.0.0 | 2021/11/30 |
1.0 | 2021/12/1 |
1.0 -> now
- Add FLH, FSH to defined transformed instructions for H extension
- Clarify that henvcfg.PBMTE is read-only zero if Svpbmt is not implemented
- 其他一些细微的修改, 如文档描述换个说法表达等
0.6.1 -> 1.0 差异
1.0 新增
- hgatp 新增 sv57x4 mode
- henvcfg (hypervisor environment configuration)
- 其他一些细微的修改, 如文档描述换个说法等.
riscv 硬件虚拟化
riscv qemu-kvm 框架
arm vs riscv 硬件虚拟化
riscv-aia
riscv 体系下, 中断直通需要 支持 aia 架构的 riscv-imsic
https://github.com/riscv/riscv-aia/
riscv-imsic stable
riscv-imsic release
riscv-iommu
设备直通需要 iommu 组件, riscv 体系下, iommu 属于 non-isa 部分.
Non-ISA specifications do not add new instructions, create or change opcodes, or in any way modify the RISC-V ISA. They do help us to develop an ecosystem around the ISA Specifications.
https://github.com/riscv-non-isa/riscv-iommu/