HLV.B

RISC-V HLV.B 指令详解

指令手册SYSTEM R-type

Hypervisor 虚拟机加载:以 rs1 为地址,按 VS/VU 有效特权经过两阶段转换读取字节并符号扩展到 XLEN。

指令语法

hlv.b rd, (rs1)
操作数说明
本指令为 SYSTEM R-type 格式,请根据汇编语法确认各操作数位置。
H系统与特权

指令行为说明

HLV.B 是 H 扩展中对应 LB 的虚拟机加载指令。它没有立即数偏移:rs1 提供显式内存访问的地址。读取的 8 位值符号扩展到 XLEN 后写入 rd(rd=x0 时值丢弃,但加载仍可产生异常或其他副作用)。该指令仅可在 M-mode、HS-mode,或 hstatus.HU=1 的 U-mode 执行;hstatus.SPVP=0 时显式访问使用 VU 有效特权,SPVP=1 时使用 VS 有效特权,并经过 VS-stage 和 G-stage 两阶段地址转换。

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

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

rd
rs1
hlv.b
,(
)
31..25
24..20
19..15
14..12
11..7
6..0
0110000
funct7
00000
rs2=x0
01011
rs1/address
100
PRIVM
01010
rd
1110011
SYSTEM
架构数据路径
instruction
0x6005C573
decode
funct7=0110000, rs2=00000, funct3=100, rd=01010 -> HLV.B
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 -> sign-extend (-128) -> 0xFFFFFFFFFFFFFF80
state
尚未提交架构状态;最终 rd 状态只在提交步骤显示。
尚未提交架构状态;最终 rd 状态只在提交步骤显示。

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

快速理解与检索要点

HLV.B 是 H 扩展的虚拟机有符号字节加载:以 rs1 为地址、按内存访问的 VS/VU 有效特权经过 VS-stage 与 G-stage 两阶段转换。

funct7=0110000、rs2=x0、funct3=100、rd 与 rs1、opcode=1110011 构成 HLV.B 的 SYSTEM R-type 编码。
HLV.B 对应 LB:以 rs1 作为地址读取 8 位并符号扩展到 XLEN;它没有立即数偏移。
执行权限、virtual-instruction 异常和两阶段转换条件由 H 扩展的特权规则决定。

常见使用场景

Hypervisor设备仿真

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

Guest内存访问

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

虚拟化指令模拟

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

使用前检查清单

语法检查
  • 确认当前指令格式为 SYSTEM R-type。
  • 确认操作数排列顺序与示例一致。
语义检查
  • 确认目标寄存器用途和调用约定兼容。
  • 确认该指令不是伪指令展开后的底层形式。

容易混淆 / 常见误区

当虚拟化模式 V=1 时执行 HLV/HLVX/HSV 会触发 virtual-instruction 异常。
U-mode 只有在 hstatus.HU=1 时可执行,否则触发 illegal-instruction 异常。
仍可能因 VS-stage/G-stage 转换产生访问错误、页错误或 guest-page fault;这些条件下不会写入 rd。
编码固定 funct7=0110000、rs2=x0、funct3=100、opcode=1110011;它不是带 12 位偏移的普通 I-type LB。

常见问题

它是用户态普通指令吗?

不是普通用户态加载。它仅在 M-mode、HS-mode,或 hstatus.HU=1 的 U-mode 有效;V=1 时尝试执行会触发 virtual-instruction 异常。

HLV.B 的地址是否带立即数偏移?

不带。HLV.B 的地址来自 rs1;它在 SYSTEM R-type 编码中固定 rs2=x0,而不是使用普通 LB 的 12 位 I-type 偏移字段。