SSAMOSWAP.D 未启用相关 CFI 时会怎样?
SSAMOSWAP.D 不使用 Zimop/Zcmop 回退;其执行遵循 SSE 访问控制和影子栈内存保护规则,并会依特权级与状态触发非法指令、虚拟指令或 store/AMO access-fault 异常。
SSAMOSWAP.D(仅 RV64)对影子栈内存执行 AMO 风格交换,返回旧值并写入新值。
仅 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 从 rs1 指向的影子栈位置原子读取64 位双字值写入 rd,并把 rs2 的对应宽度值写回原地址。它用于影子栈切换、检查点保存等需要保护 ssp 相关数据的场景。该形式仅适用于 RV64。
只展示规范定义的编码、条件和架构可见状态;不模拟流水线、缓存一致性或平台策略。
complete:假定 S-mode、menvcfg.SSE=1、合法影子栈页、幂等内存、PMP 读写和 PMA AMOSwap 支持且访问成功;illegal:无 S-mode 或 SSE 非法指令条件;virtual:SSE 虚拟指令条件;m-access-fault:S-mode 已实现且有效特权级为 M。所有场景保留原地址和旧源值,ssp 不变。
SSAMOSWAP.D 是 RV64 的 Zicfiss AMO;它原子读取旧双字到 rd,再把 rs2 的双字写至 rs1 指向的影子栈位置。
假定 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 不变。
SSAMOSWAP.D 不使用 Zimop/Zcmop 回退;其执行遵循 SSE 访问控制和影子栈内存保护规则,并会依特权级与状态触发非法指令、虚拟指令或 store/AMO access-fault 异常。
不会。成功交换仍将 rs2 的 64 位值写入原地址,只丢弃旧内存值的寄存器写回;地址和源数据在写回前读取。