0%

rvh h-extension 1.0 & riscv 硬件虚拟化

rvh h-extension 1.0

image-20240416112451638

  • 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模式下执行,无需修改。

特权模式

image-20240416112455653

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

image-20240416112459089

  • 当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的每一位都应是可写的或只读的零。

image-20240416112502300

hvip hip hie vsip vsie hgeip hgeie

上述均为管理 guest os 相关的中断相关的csr

image-20240416112506239
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.

image-20240416112511051
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 by hstatus.VGEIN
      • any other platform-specific external interrupt signal directed to VS-level.
    • 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 in hvip.
      • 即 vsip.SSIP = hip.VSSIP = hvip.VSSIP
  • 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

image-20240416112515434

FIOM (Fence of I/O implies Memory)
FIOM=1 and V=1 时, 原子指令访问的区域排序为设备I/O,其aq和/或rl位被设置,那么该指令的排序就像它同时访问设备I/O和内存一样。

image-20240416112518813

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
控制硬件性能监测计数器对客户虚拟机的可用性

image-20240416112522067

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

image-20240416112525892

image-20240416112528370

MODE=Bare, VS-mode的 物理地址等于S-mode下的物理地址,除了物理内存保护外,对GPA没有进一步的内存保护。

image-20240416112531453

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

image-20240416112535307

管理程序虚拟机的加载和存储指令只在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

image-20240416112538467

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被应用

image-20240416112542233

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

image-20240416112546720

当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时导致虚拟指令异常的情况集合。

image-20240416112551526
h-extension 加入后的 同步异常优先级

如果一条指令可能引起多个同步异常,表8.7中优先级递减的顺序表明哪个异常被采取并以mcause或scause报告。

Trap Entry

当陷阱发生在VS模式或VU模式时,它将进入M模式,除非由medeleg或mideleg委托,在这种情况下,它将进入HS模式,除非由hedeleg或hideleg进一步委托,在这种情况下,它将进入VS模式。

未设置委托, MPV and MPP in mstatus 根据进入trap/中断 前的模式设置为对应的值
image-20240416112555070

如果设置了委托 mideleg medeleg, trap / 中断 进 HS-mode前会将 sstatus的SPV SPP 设置为对应的值
image-20240416112558910

当进一步设置了 hideleg hedeleg, trap/中断 进 VS-mode 前讲 vsstatus SPP 设置为对应值
V 始终为1
image-20240416112602991

mtinst htinst

当因为 trap 进入 M-mode 或 HS-mode时
mtinst 或 htinst 被更新为:

  • 0
  • trap 时的 instruction
  • 自定义值 (trapping instruction 不是标准的)
  • 特定的伪指令

除非需要一个伪指令值,否则写入 mtinst 或 htinst 的值可能总是零,这表明硬件在寄存器中没有为这个特定的陷阱提供任何信息

写入陷阱指令 CSR 的值有两个目的。

  • 首先是提高陷阱处理程序中指令仿真的速度,部分是通过允许处理程序跳过从内存中加载陷阱指令,部分是通过避免一些解码和执行指令的工作。
  • 第二个目的是通过伪指令提供关于由 VS 阶段地址转换的隐式内存访问引起的 guest page fault 的额外信息。

在中断时,写入陷阱指令寄存器的值总是零。

表8.11显示了每个标准异常原因可能被自动写入陷阱指令寄存器的值。对于阻止获取指令的例外情况,可以只写零或一个伪指令值。只有trapping 的指令是非标准的,才能自动写入一个自定义值。未来的标准或扩展可能允许其他值被写入,从先前建立的允许值集合中选择。

image-20240416112606153

同步异常可以向陷阱指令寄存器写入捕获指令的标准转换,只针对由显式内存访问(来自加载、存储和AMO指令)产生的异常。目前只为这些内存访问指令定义了标准转换。
如果一个没有定义转换的标准指令发生了同步陷阱,陷阱指令寄存器应以零写入(或者在某些情况下,以特殊的伪指令值写入)。

对于一个标准的压缩指令(16位大小),转换后的指令如下:

  • 转换为32位等效指令。
  • bit 1 被替换为 0

对于guest page fault,在以下情况下,陷阱指令寄存器被写入一个特殊的伪指令值。
(a) 该故障是由VS阶段地址转换的隐式内存访问引起的,
(b) 一个非零值(GPA)被写入mtval2或htval。
如果这两个条件都满足,写入mtinst或htinst的值必须取自下表;不允许为零。

image-20240416112609501

伪指令 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。

image-20240416112612609

  • 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 框架

image-20240416112618610

arm vs riscv 硬件虚拟化

image-20240416112621851

riscv-aia

riscv 体系下, 中断直通需要 支持 aia 架构的 riscv-imsic

https://github.com/riscv/riscv-aia/

riscv-imsic stable
image-20240416112625946

riscv-imsic release
image-20240416112629030

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/

image-20240416112632130