SSRDP

RISC-V SSRDP 指令详解

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

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

指令语法

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

指令行为说明

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

SSRDP 指令解析与执行动画

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

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

快速理解与检索要点

SSRDP 是 Zicfiss 的 ssp 读取指令;未激活时按 Zimop 性质写入 0。

SSRDP 使用 MOP.R.28 编码,rs1 固定为 x0,rd 不能为 x0。
xSSE=1 时 rd 写入 XLEN 宽的 ssp;xSSE=0 时 rd 写入 0。

常见使用场景

函数调用与返回

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

操作系统接口

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

特定用途

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

系统与特权

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

使用前检查清单

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

容易混淆 / 常见误区

SSRDP 只在 Zicfiss 的 xSSE=1 时返回 ssp;否则写入 0。
Zicfiss 依赖 Zicsr、Zimop 和 Zaamo 扩展。
SSRDP 使用 MOP.R.28 编码,rs1 固定为 x0。
rd 不能编码为 x0。
操作系统和运行时不应把有效影子栈放在地址 0,否则会破坏“0 表示未启用”的检测习惯。
rd=x0 编码不受支持;xSSE=0 时结果为 0。

常见问题

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

xSSE=0 时,SSRDP 的 MOP 行为向目标寄存器写入 0;xSSE=1 时才写入 ssp。

SSRDP 的官方来源是什么?

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