SSRDP 未启用相关 CFI 时会怎样?
xSSE=0 时,SSRDP 的 MOP 行为向目标寄存器写入 0;xSSE=1 时才写入 ssp。
SSRDP 在 xSSE=1 时读取 ssp,xSSE=0 时向非 x0 目标写零。
RV32/RV64 Zicfiss(依赖 Zicsr、Zimop、Zaamo);ssrdp rd,rd 不能为 x0。
32 位 SYSTEM:bits31:20=110011011100、funct3=100、opcode=1110011;rs1=00000,rd 是目标。
xSSE=1 时 rd=ssp;xSSE=0 时 rd=0。读取不改变 ssp,也不访问影子栈内存。
S-mode 已实现时,M 的 xSSE=0,S/HS 取 menvcfg.SSE、VS 取 henvcfg.SSE、U/VU 取 senvcfg.SSE;无 S-mode 时 M/U 均为 0。兼容行为要求支持 Zimop。以零结果检测未激活状态时,操作系统和运行时不得把影子栈放在地址 0。
SSRDP 将 XLEN 宽的 ssp 复制到非 x0 目标寄存器;xSSE=0 时写零。支持 Zimop 的处理器在 Zicfiss 未实现时也写零。运行时可用零结果检测未激活状态,为此操作系统和运行时不得把影子栈放在地址 0。
只显示规范定义的编码、条件和架构可见状态。
假定 Zicfiss 与 Zimop 已实现;xSSE 是当前模式按规范确定的启用状态。ssp 的低两位必须为零;RV64 允许 bit2=1 的输入假定实现也支持 32 位模式。complete 表示影子栈访问保护通过。步骤不代表处理器周期。
SSRDP 是 Zicfiss 的 ssp 读取指令;未激活时按 Zimop 性质写入 0。
假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。ssrdp t0 得到 t0=0x2000,ssp 不变;xSSE=0 时则写零。
假定 RV64 Zicfiss、S-mode、menvcfg.SSE=1(xSSE=1)、ssp=0x2000。ssrdp t0 得到 t0=0x2000,ssp 不变;xSSE=0 时则写零。
xSSE=0 时,SSRDP 的 MOP 行为向目标寄存器写入 0;xSSE=1 时才写入 ssp。
The RISC-V Instruction Set Manual, Volume I: Unprivileged Architecture 的 Control-flow Integrity 章节定义此指令;Volume II: Privileged Architecture 定义启用状态与影子栈内存保护。