SSRDP

RISC-V SSRDP 指令详解

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

SSRDP 在 xSSE=1 时读取 ssp,xSSE=0 时向非 x0 目标写零。

指令语法

ssrdp rd

RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);ssrdp rd,rd 不能为 x0。

32 位 SYSTEM:bits31:20=110011011100、funct3=100、opcode=1110011;rs1=00000,rd 是目标。

xSSE=1 时 rd=ssp;xSSE=0 时 rd=0。读取不改变 ssp,也不访问影子栈内存。

S-mode 已实现时,M 的 xSSE=0,S/HS 取 menvcfg.SSE、VS 取 henvcfg.SSE、U/VU 取 senvcfg.SSE;无 S-mode 时 M/U 均为 0。兼容行为要求支持 Zimop。以零结果检测未激活状态时,操作系统和运行时不得把影子栈放在地址 0。

Zicfiss安全机制

指令行为说明

SSRDP 将 XLEN 宽的 ssp 复制到非 x0 目标寄存器;xSSE=0 时写零。支持 Zimop 的处理器在 Zicfiss 未实现时也写零。运行时可用零结果检测未激活状态,为此操作系统和运行时不得把影子栈放在地址 0。

SSRDP 指令解析与执行动画

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

ssrdp t0
ssrdp
执行环境

假定 Zicfiss 与 Zimop 已实现;xSSE 是当前模式按规范确定的启用状态。ssp 的低两位必须为零;RV64 允许 bit2=1 的输入假定实现也支持 32 位模式。complete 表示影子栈访问保护通过。步骤不代表处理器周期。

指令编码
31..20
SSRDP
110011011100
19..15
rs1
00000
14..12
funct3
100
11..7
rd
00101
6..0
opcode
1110011 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。

常见使用场景

影子栈状态读取

假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。ssrdp t0 得到 t0=0x2000,ssp 不变;xSSE=0 时则写零。

影子栈展开与切换

假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。ssrdp t0 得到 t0=0x2000,ssp 不变;xSSE=0 时则写零。

使用前检查清单

语法检查
  • RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);ssrdp rd,rd 不能为 x0。
  • 32 位 SYSTEM:bits31:20=110011011100、funct3=100、opcode=1110011;rs1=00000,rd 是目标。
语义检查
  • xSSE=1 时 rd=ssp;xSSE=0 时 rd=0。读取不改变 ssp,也不访问影子栈内存。
  • S-mode 已实现时,M 的 xSSE=0,S/HS 取 menvcfg.SSE、VS 取 henvcfg.SSE、U/VU 取 senvcfg.SSE;无 S-mode 时 M/U 均为 0。兼容行为要求支持 Zimop。以零结果检测未激活状态时,操作系统和运行时不得把影子栈放在地址 0。

容易混淆 / 常见误区

SSRDP 只在 Zicfiss 的 xSSE=1 时返回 ssp;否则写入 0。
Zicfiss 依赖 Zicsr、Zimop 和 Zaamo 扩展。
SSRDP 使用 MOP.R.28 编码,rs1 固定为 x0。
rd 不能编码为 x0。
为支持以零结果检测未激活状态,操作系统和运行时不得把影子栈放在地址 0。
未实现 Zicfiss 时,写零兼容行为要求处理器支持 Zimop;缺少 Zimop 时可能触发非法指令异常。

常见问题

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

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

SSRDP 的官方来源是什么?

The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 的 Control-flow Integrity 章节定义此指令;Volume II: Privileged Architecture 定义启用状态与影子栈内存保护。