SSRDP

RISC-V SSRDP 指令详解

指令手册R-type

读取当前 ssp;未启用 Zicfiss 时按 Zimop 性质返回 0。

指令语法

ssrdp rd
操作数说明
目标寄存器 rd:存放运算结果的通用寄存器。
源寄存器 rs1:第一个操作数寄存器。
源寄存器 rs2:第二个操作数寄存器。
Zicfiss安全机制

指令行为说明

入门理解:SSRDP 用于运行时、异常展开或栈切换代码读取 ssp。若 Zicfiss 未启用,结果可为 0,因此软件常用它动态判断影子栈是否处于活动状态。

快速理解与检索要点

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

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

常见使用场景

函数调用与返回

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

操作系统接口

结合 «ssrdp t0» 等实际代码理解该场景。

特定用途

结合 «ssrdp t0» 等实际代码理解该场景。

系统与特权

结合 «ssrdp t0» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

这些指令只有在对应 Zicfilp/Zicfiss 状态启用时才提供保护;未启用时可能表现为 NOP 或返回 0。
异常行为受当前特权级、环境配置 CSR 和页表属性影响。
rd 不能编码为 x0。
操作系统和运行时不应把有效影子栈放在地址 0,否则会破坏“0 表示未启用”的检测习惯。
rd=x0 编码不受支持;xSSE=0 时结果为 0。

常见问题

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

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

SSRDP 的官方来源是什么?

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