首页/指令库/SSAMOSWAP-D
SSAMOSWAP.D

RISC-V SSAMOSWAP.D 指令详解

指令手册R-type

SSAMOSWAP.D 对影子栈内存执行 AMO 风格交换,返回旧值并写入新值。

指令语法

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

指令行为说明

入门理解:SSAMOSWAP.D 从 rs1 指向的影子栈位置原子读取64 位双字值写入 rd,并把 rs2 的对应宽度值写回原地址。它用于影子栈切换、检查点保存等需要保护 ssp 相关数据的场景。该形式仅适用于 RV64。

快速理解与检索要点

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

SSAMOSWAP.W/D 采用 AMO 风格读旧值、写新值,并可使用 aq/rl 一致性语义。
不要把 CFI MOP 兼容性误解为安全检查总是执行;未启用时可能退化为 no-op 或写零结果。

常见使用场景

函数调用与返回

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

操作系统接口

结合 «ssamoswap.d t0, t1, (t2)» 等实际代码理解该场景。

特定用途

结合 «ssamoswap.d t0, t1, (t2)» 等实际代码理解该场景。

使用前检查清单

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

容易混淆 / 常见误区

SSAMOSWAP.D 不是 Zimop/Zcmop MOP 兼容 no-op;SSE 访问控制不满足时会产生非法指令或虚拟指令异常。
地址必须指向合法影子栈内存并按操作数宽度自然对齐;不满足时按影子栈内存保护规则异常。
它是 AMO 类操作,支持 aq/rl release-consistency 语义;不要当作普通 load/store。
SSAMOSWAP.W 在 RV64 上把加载的 32 位旧值符号扩展到 rd;.D 仅 RV64。

常见问题

SSAMOSWAP.D 未启用相关 CFI 时会怎样?

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

SSAMOSWAP.D 的官方来源是什么?

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