HLVX.HU

RISC-V HLVX.HU 指令详解

指令手册SYSTEM R-type fields

Hypervisor 虚拟机取指仿真加载:以执行权限替代读权限检查,加载零扩展半字。

指令语法

hlvx.hu rd, (rs1)
操作数说明
H 1.0;RV32/RV64;32 位 SYSTEM R-type 字段,funct7=0110010、funct3=100、opcode=1110011。
rd=[11:7] 接收 16 位加载值零扩展到 XLEN 的结果;rs1=[19:15] 直接提供地址;rs2=[24:20] 固定为 00011,不是源寄存器;无偏移立即数。
M/HS 或 V=0 的 U-mode 且 HU=1 可执行;V=1 为 virtual-instruction,V=0 的 U-mode 且 HU=0 为 illegal-instruction。SPVP=0/1 选择 VU/VS 访问;HS SUM 被忽略,MPRV 不影响访问。
两个转换阶段使用执行权限代替读权限;最终物理属性(含 PMP)仍需读和执行权限。仍报告 load 类异常,不受 pointer masking 影响。
本页示例假定 H 可用、相关模式 XLEN 相同、pointer masking 关闭,且转换和保护检查成功;非自然对齐访问由执行环境决定,不保证完成。
H系统与特权

扩展条件:H 扩展 1.0;RV32/RV64。V=0,且当前为 M/HS,或 U-mode 且 hstatus.HU=1。

指令行为说明

HLVX.HU 是 H 扩展用于取指仿真的虚拟机加载变体。它类似 HLV.HU,但在两个地址转换阶段用执行权限替代读权限进行检查;最终物理内存属性仍必须允许读和执行。它可在 M-mode 或 HS-mode 执行,也可在 hstatus.HU=1 时从 U-mode 执行。

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

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

rd
rs1
hlvx.hu
,(
)

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

31..25
24..20
19..15
14..12
11..7
6..0
0110010
funct7
00011
rs2=00011 (HLVX)
01011
rs1/address
100
PRIVM
01010
rd
1110011
SYSTEM
架构数据路径
instruction
0x6435C573
decode
funct7=0110010, rs2=00011, funct3=100, rd=01010 -> HLVX.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; HLVX requires execute permission in both stages and final physical read+execute permission
load
16-bit 0x8001 -> zero-extend -> 0x0000000000008001
state
尚未提交架构状态;最终 rd 状态只在提交步骤显示。
尚未提交架构状态;最终 rd 状态只在提交步骤显示。

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

快速理解与检索要点

HLVX.HU 从 rs1 直接取得访客地址,没有偏移立即数。成功时将 16 位加载值零扩展到 XLEN 后写 rd;rd=x0 只丢弃结果,不取消访问。

显式访问以 hstatus.SPVP=0/1 选择 VU/VS 有效特权,应用 VS-stage 与 G-stage 转换;HS-level sstatus.SUM 被忽略,MPRV 不改变该访问。
HLVX 在两个转换阶段要求执行权限而不要求读权限;最终物理内存属性(含 PMP)仍必须允许读和执行。它报告 load 类异常,且不受 pointer masking 影响。

常见使用场景

访客取指仿真

RV64 H、HS-mode、SPVP=0、pointer masking 关闭,地址 0x1000 且访问成功:a1=0x1000、已组装的内存值=0x8001;hlvx.hu a0, (a1) 得到 a0=0x0000000000008001。两个转换阶段均可执行,最终物理属性允许读和执行。

使用前检查清单

语法检查
  • H 1.0;RV32/RV64;32 位 SYSTEM R-type 字段,funct7=0110010、funct3=100、opcode=1110011。
  • rd=[11:7] 接收 16 位加载值零扩展到 XLEN 的结果;rs1=[19:15] 直接提供地址;rs2=[24:20] 固定为 00011,不是源寄存器;无偏移立即数。
语义检查
  • M/HS 或 V=0 的 U-mode 且 HU=1 可执行;V=1 为 virtual-instruction,V=0 的 U-mode 且 HU=0 为 illegal-instruction。SPVP=0/1 选择 VU/VS 访问;HS SUM 被忽略,MPRV 不影响访问。
  • 两个转换阶段使用执行权限代替读权限;最终物理属性(含 PMP)仍需读和执行权限。仍报告 load 类异常,不受 pointer masking 影响。
  • 本页示例假定 H 可用、相关模式 XLEN 相同、pointer masking 关闭,且转换和保护检查成功;非自然对齐访问由执行环境决定,不保证完成。

容易混淆 / 常见误区

HLVX 仍报告 load 类异常,不报告 instruction-fetch 类异常。
HLVX 不绕过 PMP;PMP execute-only 内存仍可能导致访问错误。
当虚拟化模式 V=1 时执行 HLV/HLVX/HSV 会触发 virtual-instruction 异常。

常见问题

哪些特权状态允许执行?

H 扩展可用且满足本页 XLEN 条件时,M/HS 可以执行;V=0 的 U-mode 还要求 hstatus.HU=1,否则为 illegal-instruction。V=1 时执行会产生 virtual-instruction 异常。