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

RISC-V C.SSPOPCHK 指令详解

指令手册C-type

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

指令语法

c.sspopchk x5
操作数说明
该压缩形式固定为 x5,没有可变的显式寄存器操作数。
C.MOP.5 编码在 xSSE=1 时展开为 SSPOPCHK x5;ssp 是隐式基址,读取宽度为 XLEN。
访问成功但值与 x5 不匹配时抛出 software-check 异常;仅成功匹配才递增 ssp。
ZicfissZcmop安全机制

指令行为说明

C.SSPOPCHK x5(Zicfiss,配合 Zcmop)展开为 SSPOPCHK x5,用于 Zicfiss 后向 CFI。它从 ssp 指向的影子栈读取 XLEN 宽返回地址并与固定的 x5 比较;不匹配时触发 software-check 异常(cause=18,xtval 为 shadow stack fault code 3)。编码复用 C.MOP.5。仅当 xSSE=1 时执行影子栈操作;否则保留 C.MOP.5 的不写寄存器行为。

C.SSPOPCHK 指令解析与执行动画

仅展示官方定义的编码、条件和架构可见结果,不表示微架构实现。

c.sspopchk x5

该压缩编码没有可变的显式寄存器:C.SSPUSH 固定 x1;C.SSPOPCHK 固定 x5。

执行环境
software-check exception (cause=18, xtval=shadow stack fault code 3); ssp 不变。
16 位编码字段
15..13
funct3
011
12..11
fixed high bits
00
10..8
C.MOP.5 selector
010
7
fixed bit
1
6..2
fixed low bits
00000
1..0
op
01
固定压缩字段选择隐式寄存器。
load 0x0000000000003000 from 0x0000000000002000; compare with x5 = 0x0123456789ABCDEF
software-check exception (cause=18, xtval=shadow stack fault code 3); ssp 不变。
尚未提交架构状态。

快速理解与检索要点

C.SSPOPCHK 是固定 x5 的 Zicfiss 影子栈检查;只有 xSSE=1 才读取、比较并可能更新 ssp。

影子栈操作隐式使用 ssp,宽度为 XLEN。
不要把 CFI MOP 兼容性误解为安全检查总是执行;xSSE=0 时这两个压缩 C.MOP 形式不访问影子栈且不写寄存器。

常见使用场景

函数调用与返回

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

压缩与代码优化

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

寄存器操作

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

使用前检查清单

语法检查
  • 确认 16 位 C.MOP.5 固定选择 x5;该压缩形式没有可变显式寄存器。
  • 确认 Zicfiss、Zcmop 及其所依赖的 Zicsr、Zimop、Zaamo 可用,并且不在 M-mode 使用 Zicfiss。
语义检查
  • xSSE=1 时从 ssp 读取 XLEN 宽值并与 x5 比较;访问故障优先于 software-check 检查。
  • 只有成功匹配才使 ssp 增加 XLEN/8;不匹配时为 cause 18、xtval 为 shadow stack fault code 3 的 software-check 异常。

容易混淆 / 常见误区

压缩形式只提供 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。