HLV.HU

RISC-V HLV.HU 指令详解

指令手册SYSTEM (R-type encoding)

Hypervisor 虚拟机加载:按 VS/VU 有效特权和两阶段转换加载零扩展半字。

指令语法

hlv.hu rd, (rs1)
操作数说明
目标寄存器 rd:接收 16 位加载值的零扩展结果;rd=x0 时写回值被丢弃,但显式访问仍会执行。
地址寄存器 rs1:直接提供显式内存访问的地址;HLV.HU 汇编语法没有 offset 立即数字段。
SYSTEM 编码固定 funct7=0110010、rs2=00001、funct3=100 和 opcode=1110011;不要按普通 I-type load 解读。
H系统与特权

指令行为说明

HLV.HU 是 H 扩展中对应 LHU 的虚拟机加载指令。它从 rs1 指定的地址读取 16 位半字并零扩展到 XLEN;指令没有立即数偏移。它仅可在 M-mode、HS-mode,或 hstatus.HU=1 的 U-mode 执行。显式访问按 hstatus.SPVP 选择 VU 或 VS 有效特权,并经过 VS-stage 与 G-stage 两阶段地址转换。

HLV.HU 指令解析与执行动画

展示 HLV.HU 的 SYSTEM 编码、特权检查、两阶段转换与零扩展写回;不模拟页表遍历或 TLB 实现。

rd
rs1
hlv.hu
,(
)
31..25
24..20
19..15
14..12
11..7
6..0
0110010
funct7
00001
rs2[0]=U
01011
rs1/address
100
PRIVM
01010
rd
1110011
SYSTEM
架构数据路径
instruction
0x6415C573
decode
funct7=0110010, rs2=00001, funct3=100, rd=01010 -> HLV.HU
address
a1(x11) -> 0x0000000040001000 (no immediate offset)
privilege
HS:允许执行
translation
VU effective privilege -> VS-stage -> G-stage; HS SUM ignored; MPRV is not used
load
16-bit 0x8001 -> zero-extend -> 0x0000000000008001
state
尚未提交架构状态;最终 rd 状态只在提交步骤显示。
尚未提交架构状态;最终 rd 状态只在提交步骤显示。

该动画仅展示官方定义的架构条件与结果;页表遍历、TLB、缓存和平台异常处理未建模。

快速理解与检索要点

HLV.HU 是 H 扩展的 虚拟机无符号半字加载,以内存访问的 VS/VU 有效特权经过 VS-stage 与 G-stage 两阶段转换加载数据。

执行权限、trap 类型和状态恢复由特权级、相关 CSR 位和扩展存在性决定。
H 扩展访存/栅栏指令涉及 VS-stage 与 G-stage 两阶段地址转换。

常见使用场景

Hypervisor设备仿真

结合 «hlv.hu a0, (a1)» 等实际代码理解该场景。

Guest内存访问

结合 «hlv.hu a0, (a1)» 等实际代码理解该场景。

虚拟化指令模拟

结合 «hlv.hu a0, (a1)» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认汇编语法为 hlv.hu rd, (rs1):rs1 直接给出地址,没有 offset 立即数。
  • 确认 SYSTEM 编码中的 rs2 固定为 00001,funct7=0110010、funct3=100、opcode=1110011。
语义检查
  • 确认执行处于 M/HS,或 U-mode 且 hstatus.HU=1;V=1 时会发生 virtual-instruction 异常。
  • 确认 16 位加载按 零扩展规则处理,并为 VS-stage/G-stage 的访问异常、页错误和 guest-page fault 保留处理路径。

容易混淆 / 常见误区

当虚拟化模式 V=1 时执行 HLV/HLVX/HSV 会触发 virtual-instruction 异常。
U-mode 只有在 hstatus.HU=1 时可执行,否则触发 illegal-instruction 异常。
仍可能因 VS-stage/G-stage 转换产生访问错误、页错误或 guest-page fault。

常见问题

它是用户态普通指令吗?

不是。该类指令受特权级和扩展支持约束,用户态是否可执行必须看官方特权规则。

它是否替代普通内存 fence?

不能简单替代。地址转换、指令获取和数据内存排序分别有不同的 fence/失效指令。