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

RISC-V C.SSPOPCHK 指令详解

指令手册C-type

xSSE=1 时,C.SSPOPCHK 从影子栈读取 XLEN 位并与固定 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。

执行环境

假定 Zicfiss、Zcmop 及其依赖扩展存在;xSSE 为当前权限模式的有效使能值。只演示对齐的 ssp;RV64 场景假定 UXLEN/SXLEN 始终为 64。

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; 0x0000000000003000 != x5=0x0123456789ABCDEF; software-check; ssp unchanged
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 形式不访问影子栈且不写寄存器。
Zicfiss 不用于 M-mode;U-mode 使用需要实现 S-mode。xSSE 是当前权限模式的有效使能值。

常见使用场景

影子栈返回地址校验

结合 «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 时会怎样?

假定 Zcmop 存在,xSSE=0 时保留对应 C.MOP 的行为:不访问影子栈,不更新 ssp,也不写任何寄存器。

C.SSPOPCHK 何时更新 ssp?

xSSE=1 时,读取 mem[ssp] 并与 x5 逐位比较。仅加载成功且相等时将 ssp 增加 XLEN/8;不匹配触发 cause=18、xtval=3 的 software-check 异常。