C.SSPUSH 未启用相关 CFI 时会怎样?
假定 Zcmop 存在,xSSE=0 时保留对应 C.MOP 的行为:不访问影子栈,不更新 ssp,也不写任何寄存器。
xSSE=1 时,C.SSPUSH 将固定 x1 的值压入影子栈。
C.SSPUSH x1(Zicfiss,依赖 Zcmop)使用 C.MOP.1 编码,在 xSSE=1 时等价于 SSPUSH x1:向 ssp - XLEN/8 地址存储 x1 的值;只有存储成功后 ssp 才递减 XLEN/8 并提交更新。未启用 Zicfiss 时按 C.MOP.1 的 Zcmop 行为执行。
仅展示官方定义的编码、条件和架构可见结果,不表示微架构实现。
该压缩编码没有可变的显式寄存器:C.SSPUSH 固定 x1;C.SSPOPCHK 固定 x5。
假定 Zicfiss、Zcmop 及其依赖扩展存在;xSSE 为当前权限模式的有效使能值。只演示对齐的 ssp;RV64 场景假定 UXLEN/SXLEN 始终为 64。
C.SSPUSH 是固定 x1 的 Zicfiss 影子栈压入;只有 xSSE=1 且存储成功时才提交 ssp 递减。
结合 «c.sspush x1 # push ra onto shadow stack» 等实际代码理解该场景。
结合 «c.sspush x1 # push ra onto shadow stack» 等实际代码理解该场景。
假定 Zcmop 存在,xSSE=0 时保留对应 C.MOP 的行为:不访问影子栈,不更新 ssp,也不写任何寄存器。
xSSE=1 时,向 ssp−XLEN/8 存储 x1;仅存储成功才将 ssp 减少 XLEN/8。存储故障不提交该更新。