首页/指令库/SSPOPCHK
SSPOPCHK

RISC-V SSPOPCHK 指令详解

指令手册SYSTEM (MOP.R.28)

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

指令语法

sspopchk rs1
操作数说明
本指令为 SYSTEM (MOP.R.28) 格式,请根据汇编语法确认各操作数位置。
Zicfiss安全机制

指令行为说明

入门理解:SSPOPCHK 从 ssp 指向的影子栈读取返回地址,与 x1 或 x5 中的链接寄存器值逐位比较;不匹配时触发 software-check 异常,匹配且读取成功后 ssp 增加 XLEN/8。

SSPOPCHK 指令解析与执行动画

只显示规范定义的编码、条件和架构可见状态。

sspopchk x1
执行环境
指令编码
31..20
MOP.R.28
110011011100
19..15
rs1
x1
14..12
funct3
100
11..7
rd
00000
6..0
opcode
SYSTEM
解码固定字段
ssp=0x0000000000002000, x[x1]=0x0000000012345678, mem[ssp]=0x0000000012345678
ssp <- 0x0000000000002008
尚未提交架构状态。

快速理解与检索要点

SSPOPCHK 是 Zicfiss 影子栈检查指令;xSSE 和访问结果决定是否比较和更新 ssp。

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

常见使用场景

函数调用与返回

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

操作系统接口

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

特定用途

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

使用前检查清单

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

容易混淆 / 常见误区

该指令只支持 x1 或 x5 作为被比较的链接寄存器。
Zicfiss 依赖 Zicsr、Zimop 和 Zaamo 扩展。
影子栈值不匹配会触发 software-check 异常。
store/AMO access-fault 的优先级高于 software-check;若隐式 ssp 加载产生 store/AMO page-fault 或 guest-page-fault,则不比较且 ssp 不更新。
若 ssp 未按 XLEN 对齐,SSPOPCHK 会产生 store/AMO access-fault。
访问内存必须是幂等的,并且 PMP 必须允许读写;否则会产生 store/AMO access-fault。
异常行为取决于当前特权级、环境配置 CSR 和页表/内存属性。
只有加载成功且比较通过后,ssp 才增加 XLEN/8。
SSPOPCHK/C.SSPOPCHK 只有在加载成功且比较通过后才递增 ssp。

常见问题

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

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

SSPOPCHK 的官方来源是什么?

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