SSAMOSWAP.W 未启用相关 CFI 时会怎样?
SSAMOSWAP.W 是 AMO 编码而非 Zimop/Zcmop MOP;若 SSE 访问控制或 S-mode 条件不满足,它会进入规定的非法指令或虚拟指令异常路径。
SSAMOSWAP.W 对影子栈内存执行 AMO 风格交换,返回旧值并写入新值。
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 从 rs1 指向的影子栈位置原子读取 32 位字值写入 rd,并把 rs2 的低 32 位写回原地址。它用于影子栈切换、检查点保存等需要保护 ssp 相关数据的场景。在 RV64 上读出的 32 位值会符号扩展到 rd。
只显示规范定义的编码、条件和架构可见状态。
假定 Zicfiss 已实现。complete 表示 SSE 检查与影子栈页/PMP/PMA/地址翻译均通过;故障选项是预先选定的检查结果,不由此模型推导特权状态。aq=1 为 acquire,rl=1 为 release;不改变交换值,ssp 不变。
SSAMOSWAP.W 是 Zicfiss 的影子栈 AMO 指令;其 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 不变。
SSAMOSWAP.W 是 AMO 编码而非 Zimop/Zcmop MOP;若 SSE 访问控制或 S-mode 条件不满足,它会进入规定的非法指令或虚拟指令异常路径。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 的 Control-flow Integrity 章节定义此指令;Volume II: Privileged Architecture 定义启用状态与影子栈内存保护。