LPAD 未启用相关 CFI 时会怎样?
LPAD 按 no-op 执行。
Zicfilp 着陆垫指令;启用前向 CFI 时验证间接跳转/调用目标。
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 启用时,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 属于 RISC-V Zicfilp 前向 CFI 指令;其行为受 Zicfilp 是否启用以及相关环境配置控制。
假定 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。
LPAD 按 no-op 执行。
JALR/C.JR/C.JALR 的 rs1 为 x1、x5 或 x7 时不置 ELP=LP_EXPECTED;x7 形式称为 software guarded branch。