SSPUSH 未启用相关 CFI 时会怎样?
xSSE=0 时,SSPUSH 不访问影子栈且不更新 ssp。未实现 Zicfiss 但支持 Zimop 时也按 MOP 行为执行;没有 Zimop 支持则可能触发非法指令异常。
xSSE=1 时,SSPUSH 将 x1/x5 的值压入向下增长的影子栈。
RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);sspush rs2,rs2 仅 x1/x5。
32 位 SYSTEM:bits31:25=1100111、rs1=00000、funct3=100、rd=00000、opcode=1110011,rs2 是源字段。
xSSE=1 时向 ssp−XLEN/8 存储 XLEN 位源值,存储成功后才提交新 ssp;不写源寄存器。
S-mode 已实现时,M 的 xSSE=0,S/HS 取 menvcfg.SSE、VS 取 henvcfg.SSE、U/VU 取 senvcfg.SSE;无 S-mode 时 M/U 均为 0。兼容行为要求支持 Zimop。xSSE=0 时不访问影子栈且不更新 ssp;活动时未按 XLEN 对齐产生 store/AMO access-fault。
xSSE=1 时,SSPUSH 以 ssp - XLEN/8 为地址把 x1 或 x5 的返回地址副本写入影子栈;只有影子栈存储成功后,ssp 才提交为该新值。它用于非叶子函数入口,配合普通栈保存返回地址来检测返回地址被篡改。
只显示规范定义的编码、条件和架构可见状态。
假定 Zicfiss 与 Zimop 已实现;xSSE 是当前模式按规范确定的启用状态。ssp 的低两位必须为零;RV64 允许 bit2=1 的输入假定实现也支持 32 位模式。complete 表示影子栈访问保护通过。步骤不代表处理器周期。
SSPUSH 是 Zicfiss 影子栈压入指令;只有完成存储后才更新 ssp。
假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。x1=0x12345678,合法存储完成后 mem[0x1FF8]=0x12345678,ssp=0x1FF8。
假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。x1=0x12345678,合法存储完成后 mem[0x1FF8]=0x12345678,ssp=0x1FF8。
xSSE=0 时,SSPUSH 不访问影子栈且不更新 ssp。未实现 Zicfiss 但支持 Zimop 时也按 MOP 行为执行;没有 Zimop 支持则可能触发非法指令异常。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 的 Control-flow Integrity 章节定义此指令;Volume II: Privileged Architecture 定义启用状态与影子栈内存保护。