首页/指令库/SSAMOSWAP.W
SSAMOSWAP.W

RISC-V SSAMOSWAP.W 指令详解

指令手册AMO-type

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

指令语法

ssamoswap.w rd, rs2, (rs1)

RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);语法 ssamoswap.w rd, rs2, (rs1),没有 offset 立即数。

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

成功时原子读取原地址的 32 位旧值到 rd(RV64 符号扩展),把旧 rs2 的低 32 位写回原地址;rd=x0 丢弃写回,ssp 不变。重叠源使用同一旧值。

按规范顺序检查:非 M 且 menvcfg.SSE=0、无 S-mode、U 且 senvcfg.SSE=0 时为 illegal;否则 VS 且 henvcfg.SSE=0、VU 且 senvcfg.SSE=0 时为 virtual。成功访问另需影子栈内存保护与四字节自然对齐;有效 M 访问为 access-fault,未对齐适用 AMO 异常选项。

Zicfiss安全机制

指令行为说明

入门理解:SSAMOSWAP.W 从 rs1 指向的影子栈位置原子读取 32 位字值写入 rd,并把 rs2 的低 32 位写回原地址。它用于影子栈切换、检查点保存等需要保护 ssp 相关数据的场景。在 RV64 上读出的 32 位值会符号扩展到 rd。

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

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

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

假定 Zicfiss 已实现。complete 表示 SSE 检查与影子栈页/PMP/PMA/地址翻译均通过;故障选项是预先选定的检查结果,不由此模型推导特权状态。aq=1 为 acquire,rl=1 为 release;不改变交换值,ssp 不变。

指令编码
31..27
funct5
01001
26/25
aq/rl
00
24..20
rs2
01011
19..15
rs1
01100
14..12
funct3
010
11..7
rd
01010
6..0
opcode
0101111 AMO
解码固定字段
x[a2]=0x0000000000002000, x[a1]=0x0000000012345678, mem[address]=0x89ABCDEF
x[a0] <- 0xFFFFFFFF89ABCDEF; mem[0x0000000000002000] <- 0x12345678
尚未提交架构状态。

快速理解与检索要点

SSAMOSWAP.W 是 Zicfiss 的影子栈 AMO 指令;其 SSE 访问条件由当前特权环境控制。

SSAMOSWAP.W/D 采用 AMO 风格读旧值、写新值,并可使用 aq/rl 一致性语义。
SSAMOSWAP.W/D 不是 MOP 编码;SSE 条件不满足时进入其规定的异常路径。

常见使用场景

影子栈切换

假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1;t2=0x2000、t1=0x12345678、旧内存 word=0x89ABCDEF,合法影子栈访问成功。结果 t0=0xFFFFFFFF89ABCDEF,原地址写入 0x12345678;ssp 不变。

影子栈检查点维护

假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1;t2=0x2000、t1=0x12345678、旧内存 word=0x89ABCDEF,合法影子栈访问成功。结果 t0=0xFFFFFFFF89ABCDEF,原地址写入 0x12345678;ssp 不变。

使用前检查清单

语法检查
  • RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);语法 ssamoswap.w rd, rs2, (rs1),没有 offset 立即数。
  • 32 位 AMO:funct5=01001、funct3=010、opcode=0101111;aq=1 为 acquire,rl=1 为 release。
语义检查
  • 成功时原子读取原地址的 32 位旧值到 rd(RV64 符号扩展),把旧 rs2 的低 32 位写回原地址;rd=x0 丢弃写回,ssp 不变。重叠源使用同一旧值。
  • 按规范顺序检查:非 M 且 menvcfg.SSE=0、无 S-mode、U 且 senvcfg.SSE=0 时为 illegal;否则 VS 且 henvcfg.SSE=0、VU 且 senvcfg.SSE=0 时为 virtual。成功访问另需影子栈内存保护与四字节自然对齐;有效 M 访问为 access-fault,未对齐适用 AMO 异常选项。

容易混淆 / 常见误区

SSAMOSWAP.W 不是 Zimop/Zcmop MOP 兼容 no-op;手册列出的 SSE 或 S-mode 条件不满足时会产生非法指令或虚拟指令异常,有效内存特权级为 M 时,访问会产生 store/AMO access-fault。
Zicfiss 依赖 Zicsr、Zimop 和 Zaamo 扩展。
在 M 特权级不支持激活 Zicfiss;U 特权级使用则要求实现 S 特权级。
SSAMOSWAP.W 的 rs1 地址必须按 word 的 4 字节宽度自然对齐;未自然对齐时适用 A 扩展 AMO 的同一异常选项。
它是 AMO 类操作,支持 aq/rl release-consistency 语义;不要当作普通 load/store。
访问内存必须是幂等的;若内存非幂等或 PMP 未提供读写权限,会产生 store/AMO access-fault。SSAMOSWAP.W 还要求 PMA 提供 AMOSwap 级别支持。
SSAMOSWAP.W 在 RV64 上把加载的 32 位旧值符号扩展到 rd;.D 仅 RV64。

常见问题

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

SSAMOSWAP.W 是 AMO 编码而非 Zimop/Zcmop MOP;若 SSE 访问控制或 S-mode 条件不满足,它会进入规定的非法指令或虚拟指令异常路径。

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

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