首页/指令库/着陆垫
LPAD

RISC-V LPAD 指令详解

指令手册U-type (AUIPC HINT)

Zicfilp 着陆垫指令;启用前向 CFI 时验证间接跳转/调用目标。

指令语法

lpad label

RV32/RV64 Zicfilp(依赖 Zicsr);语法 lpad label,label 是 0–1048575 的 20 位 LPL,不是 PC 相对偏移。

32 位 U 型:LPL=bits31:12、rd=00000、AUIPC opcode=0010111;没有通用寄存器目的操作数。

仅 xLPE=1 且 ELP=LP_EXPECTED 时检查 PC 四字节对齐,以及非零 LPL 与 x7[31:12] 匹配;成功清除 ELP,否则 software-check(cause=18,xtval=2)。

xLPE=0 或 ELP=NO_LP_EXPECTED 时为 no-op;进入 trap 另会保存旧 ELP 到 xPELP 并清除 ELP。

Zicfilp安全机制

指令行为说明

Zicfilp 启用时,JALR/C.JR/C.JALR 的 rs1 不为 x1、x5、x7 才要求着陆垫。ELP=LP_EXPECTED 时,下一条指令须为 4 字节对齐的 LPAD;非零 20 位 LPL 必须匹配 x7[31:12],否则产生 software-check 异常(cause=18,xtval=2)。成功则 ELP=NO_LP_EXPECTED;未启用或 ELP 未期待时 LPAD 为 no-op。

LPAD 指令解析与执行动画

只展示规范定义的编码、条件和架构可见状态;不模拟流水线、缓存一致性或平台策略。

lpad 0x12345
执行环境
指令编码
31..12
LPL
00010010001101000101
11..7
rd
00000 (x0)
6..0
opcode
0010111 (AUIPC)
解码固定字段
固定编码字段识别指令和操作数角色。
无异常:ELP 更新为 NO_LP_EXPECTED。
尚未提交架构状态。

快速理解与检索要点

LPAD 属于 RISC-V Zicfilp 前向 CFI 指令;其行为受 Zicfilp 是否启用以及相关环境配置控制。

LPAD 使用 AUIPC HINT 编码,未启用时不改变架构状态。
LPAD 使用 U-type 的 AUIPC 主操作码且 rd 固定为 x0;其 LPL 占用 bit 31:12。

常见使用场景

前向CFI保护

假定 RV64 Zicfilp 启用、ELP=LP_EXPECTED、PC=0x2000;lpad 0 跳过标签比较并令 ELP=NO_LP_EXPECTED。

间接调用/跳转目标标记

假定 RV64 Zicfilp 启用、ELP=LP_EXPECTED、PC=0x2000;lpad 0 跳过标签比较并令 ELP=NO_LP_EXPECTED。

安全加固

假定 RV64 Zicfilp 启用、ELP=LP_EXPECTED、PC=0x2000;lpad 0 跳过标签比较并令 ELP=NO_LP_EXPECTED。

使用前检查清单

语法检查
  • RV32/RV64 Zicfilp(依赖 Zicsr);语法 lpad label,label 是 0–1048575 的 20 位 LPL,不是 PC 相对偏移。
  • 32 位 U 型:LPL=bits31:12、rd=00000、AUIPC opcode=0010111;没有通用寄存器目的操作数。
语义检查
  • 仅 xLPE=1 且 ELP=LP_EXPECTED 时检查 PC 四字节对齐,以及非零 LPL 与 x7[31:12] 匹配;成功清除 ELP,否则 software-check(cause=18,xtval=2)。
  • xLPE=0 或 ELP=NO_LP_EXPECTED 时为 no-op;进入 trap 另会保存旧 ELP 到 xPELP 并清除 ELP。

容易混淆 / 常见误区

只有 Zicfilp 启用且 ELP=LP_EXPECTED 时才检查 PC 对齐和标签。
LPL=0 跳过标签比较;非零 LPL 比较 x7[31:12],不是整个 x7。
异常进入 trap 时将旧 ELP 保存到 xPELP,再把 ELP 清为 NO_LP_EXPECTED。

常见问题

LPAD 未启用相关 CFI 时会怎样?

LPAD 按 no-op 执行。

哪些间接分支不要求 LPAD?

JALR/C.JR/C.JALR 的 rs1 为 x1、x5 或 x7 时不置 ELP=LP_EXPECTED;x7 形式称为 software guarded branch。