HLV.BU

RISC-V HLV.BU 指令详解

指令手册SYSTEM (R-type encoding)

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

指令语法

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

指令行为说明

HLV.BU 是 H 扩展中对应 LBU 的虚拟机加载指令。它从 rs1 指定的地址读取 8 位值并零扩展到 XLEN;指令没有立即数偏移。它仅可在 M-mode、HS-mode,或 hstatus.HU=1 的 U-mode 执行。显式访问在 hstatus.SPVP=0 时以 VU 有效特权、在 SPVP=1 时以 VS 有效特权执行,并经过 VS-stage 与 G-stage 两阶段地址转换。 hstatus.SPVP=0 选择 VU,SPVP=1 选择 VS;HS-level sstatus.SUM 被忽略,mstatus.MPRV 不改变该访问。

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

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

rd
rs1
hlv.bu
,(
)

演示假定 H 扩展已实现、相关特权模式使用相同 XLEN、pointer masking 关闭;输入是已组装的内存数值,访问结果由下拉框指定,不验证真实页表。rs1=x0 时地址固定为 0。步骤是教学顺序,不代表处理器周期。

31..25
24..20
19..15
14..12
11..7
6..0
0110000
funct7
00001
rs2[0]=U
01011
rs1/address
100
PRIVM
01010
rd
1110011
SYSTEM
架构数据路径
instruction
0x6015C573
decode
funct7=0110000, rs2=00001, funct3=100, rd=01010 -> HLV.BU
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
8-bit 0x80 -> zero-extend -> 0x0000000000000080
state
尚未提交架构状态;最终 rd 状态只在提交步骤显示。
尚未提交架构状态;最终 rd 状态只在提交步骤显示。

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

快速理解与检索要点

HLV.BU 从 rs1 地址读取 8 位值,零扩展到 XLEN 后写入 rd。执行指令的模式与内存访问的 VS/VU 有效特权是两个不同条件。

H 扩展中仅 M/HS 或 hstatus.HU=1 的 U-mode 可执行;V=1 产生 virtual-instruction 异常,V=0 的 U-mode 且 HU=0 产生 illegal-instruction 异常。
hstatus.SPVP=0/1 分别选择 VU/VS 有效特权;访问使用 VS-stage 与 G-stage,HS-level SUM 被忽略,MPRV 不影响该指令。
HS-level MXR 作用于两个转换阶段,vsstatus.MXR 仅作用于 VS-stage;任一转换阶段可配置为 Bare。
rd=x0 丢弃加载值但不免除访问异常或其他副作用;rs1=x0 提供地址 0。

常见使用场景

虚拟机内存加载

结合 «# RV64; H 扩展 / H extension; HS-mode, SPVP=0; pointer masking disabled # x11=0x40001000; VS/G-stage access succeeds # 8-bit memory value = 0x80 hlv.bu x10, (x11) # x10 = 0x0000000000000080» 等实际代码理解该场景。

VS/VU 有效特权

结合 «# RV64; H 扩展 / H extension; HS-mode, SPVP=0; pointer masking disabled # x11=0x40001000; VS/G-stage access succeeds # 8-bit memory value = 0x80 hlv.bu x10, (x11) # x10 = 0x0000000000000080» 等实际代码理解该场景。

两阶段地址转换

结合 «# RV64; H 扩展 / H extension; HS-mode, SPVP=0; pointer masking disabled # x11=0x40001000; VS/G-stage access succeeds # 8-bit memory value = 0x80 hlv.bu x10, (x11) # x10 = 0x0000000000000080» 等实际代码理解该场景。

使用前检查清单

语法检查
  • 确认汇编语法为 hlv.bu rd, (rs1):rs1 直接给出地址,没有 offset 立即数。
  • 确认 SYSTEM 编码中的 rs2 固定为 00001,funct7=0110000、funct3=100、opcode=1110011。
语义检查
  • 确认执行处于 M/HS,或 U-mode 且 hstatus.HU=1;V=1 时会发生 virtual-instruction 异常。
  • 确认 8 位加载按 零扩展规则处理,并为 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。

常见问题

它可以在 U-mode 执行吗?

实现 H 扩展且 V=0、hstatus.HU=1 时可以。HU=0 的 U-mode 产生 illegal-instruction 异常;V=1 的 VS/VU-mode 产生 virtual-instruction 异常。

rs1=x0 或 rd=rs1 会怎样?

rs1=x0 提供地址 0,不代表免除地址转换。rd 与 rs1 相同时先从原寄存器值取得地址,再在成功加载后写回结果;rd=x0 则只丢弃结果,仍保留异常和其他副作用。