首页/指令库/C-SSPOPCHK
C.SSPOPCHK

RISC-V C.SSPOPCHK 指令详解

指令手册C-type

C.SSPOPCHK 从 ssp 指向的影子栈读取返回地址并与 x1/x5 检查。

指令语法

c.sspopchk x5
操作数说明
压缩指令仅 16 位,寄存器选择通常限制在 x8–x15。
立即数字段较窄,查看特定压缩指令的完整编码。
ZicfissZcmop安全机制

指令行为说明

C.SSPOPCHK x5 (Zicfiss,依赖Zcmop)展开为 SSPOPCHK x5,用于 Zicfiss 后向 CFI。它从 ssp 指向的影子栈读取返回地址,与 x5 比较,不匹配时触发 software-check 异常。编码复用c.mop.5。仅当xSSE=1时生效;否则作为c.mop.5执行(无操作)。

快速理解与检索要点

C.SSPOPCHK 属于 RISC-V CFI 相关指令;其行为受 Zicfilp/Zicfiss 是否启用以及相关环境配置控制。

影子栈操作隐式使用 ssp,宽度为 XLEN。
不要把 CFI MOP 兼容性误解为安全检查总是执行;未启用时可能退化为 no-op 或写零结果。

常见使用场景

函数调用与返回

使用 jal ra, label 或 jalr ra, rs, imm。

压缩与代码优化

结合 «c.sspopchk x5» 等实际代码理解该场景。

寄存器操作

结合 «c.sspopchk x5» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

压缩形式只提供 x5;完整 SSPOPCHK 支持 x1 和 x5。
返回地址不匹配会触发带 shadow-stack fault code 的 software-check 异常。
Zicfiss 依赖 Zicsr、Zimop 和 Zaamo;压缩形式还需要 Zcmop。
SSPOPCHK/C.SSPOPCHK 只有在加载成功且比较通过后才递增 ssp。

常见问题

C.SSPOPCHK 未启用相关 CFI 时会怎样?

Zicfiss 指令按官方 Zimop/Zcmop 兼容规则退化,不执行影子栈检查或更新。

C.SSPOPCHK 的官方来源是什么?

RISC-V 非特权 ISA 的 Control-flow Integrity 章节定义 LPAD、SSPUSH、SSPOPCHK、SSRDP 和 SSAMOSWAP。