SSPOPCHK 未启用相关 CFI 时会怎样?
xSSE=0 时,SSPOPCHK 不访问影子栈且不更新 ssp。未实现 Zicfiss 但支持 Zimop 时也按 MOP 行为执行;没有 Zimop 支持则可能触发非法指令异常。
xSSE=1 时,SSPOPCHK 从 ssp 读取影子返回地址并与 x1/x5 比较。
RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);sspopchk rs1,rs1 仅 x1/x5。
32 位 SYSTEM:bits31:20=110011011100、funct3=100、opcode=1110011;rs1 是比较源,rd=00000。
xSSE=1 时读取 mem[ssp] 并与源逐位比较;匹配且读取成功才令 ssp+=XLEN/8。不匹配为 software-check(cause=18、xtval=3),不写源寄存器。
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 时,SSPOPCHK 从 ssp 指向的影子栈读取返回地址,与 x1 或 x5 中的链接寄存器值逐位比较;不匹配时触发 software-check 异常,匹配且读取成功后 ssp 增加 XLEN/8。
只显示规范定义的编码、条件和架构可见状态。
假定 Zicfiss 与 Zimop 已实现;xSSE 是当前模式按规范确定的启用状态。ssp 的低两位必须为零;RV64 允许 bit2=1 的输入假定实现也支持 32 位模式。complete 表示影子栈访问保护通过。步骤不代表处理器周期。
SSPOPCHK 是 Zicfiss 影子栈检查指令;xSSE 和访问结果决定是否比较和更新 ssp。
假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。x1 与 mem[0x2000] 均为 0x12345678,合法加载成功且比较匹配后 ssp=0x2008;x1 不变。
假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。x1 与 mem[0x2000] 均为 0x12345678,合法加载成功且比较匹配后 ssp=0x2008;x1 不变。
xSSE=0 时,SSPOPCHK 不访问影子栈且不更新 ssp。未实现 Zicfiss 但支持 Zimop 时也按 MOP 行为执行;没有 Zimop 支持则可能触发非法指令异常。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 的 Control-flow Integrity 章节定义此指令;Volume II: Privileged Architecture 定义启用状态与影子栈内存保护。