首页/指令库/影子栈原子交换(双字)
SSAMOSWAP.D

RISC-V SSAMOSWAP.D 指令详解

指令手册AMO-type

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

指令语法

ssamoswap.d rd, rs2, (rs1)

仅 RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);语法 ssamoswap.d rd, rs2, (rs1),三个整数寄存器字段,没有 offset 立即数。

32 位 AMO:funct5=01001、funct3=011、opcode=0101111;aq=1 为 acquire,rl=1 为 release。

成功时原子读取原地址的 64 位旧值到 rd,把旧 rs2 写回原地址;rd=x0 仅丢弃寄存器写回。重叠源必须使用同一写回前的值。

需通过 SSE 检查、影子栈内存保护及八字节自然对齐;无 S-mode 为非法指令,有效 M 特权内存访问为 access-fault。未对齐适用 AMO 异常选项。

Zicfiss安全机制

指令行为说明

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

SSAMOSWAP.D 指令解析与执行动画

只展示规范定义的编码、条件和架构可见状态;不模拟流水线、缓存一致性或平台策略。

ssamoswap.d a0, a2, (a1)
执行环境

complete:假定 S-mode、menvcfg.SSE=1、合法影子栈页、幂等内存、PMP 读写和 PMA AMOSwap 支持且访问成功;illegal:无 S-mode 或 SSE 非法指令条件;virtual:SSE 虚拟指令条件;m-access-fault:S-mode 已实现且有效特权级为 M。所有场景保留原地址和旧源值,ssp 不变。

指令编码
31..27
funct5
01001
26
aq
0
25
rl
0
24..20
rs2
01100 (a2)
19..15
rs1
01011 (a1)
14..12
funct3
011
11..7
rd
01010 (a0)
6..0
opcode
0101111 (AMO)
解码固定字段
固定编码字段识别指令和操作数角色。
原子交换: x[a0] <- mem[0x0000000000003000] = 0x1122334455667788; mem <- 0xAABBCCDDEEFF0011.
尚未提交架构状态。

快速理解与检索要点

SSAMOSWAP.D 是 RV64 的 Zicfiss AMO;它原子读取旧双字到 rd,再把 rs2 的双字写至 rs1 指向的影子栈位置。

SSAMOSWAP.W/D 采用 AMO 风格读旧值、写新值,并可使用 aq/rl 一致性语义。
它不使用 Zimop/Zcmop 回退:SSAMOSWAP.W/D 的执行还受 SSE 控制和影子栈内存保护条件约束。
成功交换要求合法影子栈页、可幂等内存、PMP 读写权限及 PMA AMOSwap 支持;虚拟化的 G-stage 还须允许读写。

常见使用场景

影子栈切换

假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1;t2=0x3000、t1=0xAABBCCDDEEFF0011、旧内存双字=0x1122334455667788,合法影子栈访问成功。结果 t0=旧内存值,原地址写入旧 t1;ssp 不变。

影子栈检查点保存

假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1;t2=0x3000、t1=0xAABBCCDDEEFF0011、旧内存双字=0x1122334455667788,合法影子栈访问成功。结果 t0=旧内存值,原地址写入旧 t1;ssp 不变。

使用前检查清单

语法检查
  • 仅 RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);语法 ssamoswap.d rd, rs2, (rs1),三个整数寄存器字段,没有 offset 立即数。
  • 32 位 AMO:funct5=01001、funct3=011、opcode=0101111;aq=1 为 acquire,rl=1 为 release。
语义检查
  • 成功时原子读取原地址的 64 位旧值到 rd,把旧 rs2 写回原地址;rd=x0 仅丢弃寄存器写回。重叠源必须使用同一写回前的值。
  • 需通过 SSE 检查、影子栈内存保护及八字节自然对齐;无 S-mode 为非法指令,有效 M 特权内存访问为 access-fault。未对齐适用 AMO 异常选项。

容易混淆 / 常见误区

SSAMOSWAP.D 不采用 MOP no-op 回退;无 S-mode 或 SSE 访问检查失败会依条件产生非法指令/虚拟指令异常。有效特权级为 M 时,内存访问产生 store/AMO access-fault。
地址必须指向合法影子栈内存并按操作数宽度自然对齐;不满足时按影子栈内存保护规则异常。
它是 AMO 类操作,支持 aq/rl release-consistency 语义;不要当作普通 load/store。
SSAMOSWAP.W 在 RV64 上把加载的 32 位旧值符号扩展到 rd;.D 仅 RV64。

常见问题

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

SSAMOSWAP.D 不使用 Zimop/Zcmop 回退;其执行遵循 SSE 访问控制和影子栈内存保护规则,并会依特权级与状态触发非法指令、虚拟指令或 store/AMO access-fault 异常。

rd=x0 会取消内存交换吗?

不会。成功交换仍将 rs2 的 64 位值写入原地址,只丢弃旧内存值的寄存器写回;地址和源数据在写回前读取。