C.SSPOPCHK 未启用相关 CFI 时会怎样?
假定 Zcmop 存在,xSSE=0 时保留对应 C.MOP 的行为:不访问影子栈,不更新 ssp,也不写任何寄存器。
xSSE=1 时,C.SSPOPCHK 从影子栈读取 XLEN 位并与固定 x5 比较。
C.SSPOPCHK x5(Zicfiss,配合 Zcmop)展开为 SSPOPCHK x5,用于 Zicfiss 后向 CFI。它从 ssp 指向的影子栈读取 XLEN 宽返回地址并与固定的 x5 比较;不匹配时触发 software-check 异常(cause=18,xtval 为 shadow stack fault code 3)。编码复用 C.MOP.5。仅当 xSSE=1 时执行影子栈操作;否则保留 C.MOP.5 的不写寄存器行为。
仅展示官方定义的编码、条件和架构可见结果,不表示微架构实现。
该压缩编码没有可变的显式寄存器:C.SSPUSH 固定 x1;C.SSPOPCHK 固定 x5。
假定 Zicfiss、Zcmop 及其依赖扩展存在;xSSE 为当前权限模式的有效使能值。只演示对齐的 ssp;RV64 场景假定 UXLEN/SXLEN 始终为 64。
C.SSPOPCHK 是固定 x5 的 Zicfiss 影子栈检查;只有 xSSE=1 才读取、比较并可能更新 ssp。
结合 «c.sspopchk x5» 等实际代码理解该场景。
结合 «c.sspopchk x5» 等实际代码理解该场景。
假定 Zcmop 存在,xSSE=0 时保留对应 C.MOP 的行为:不访问影子栈,不更新 ssp,也不写任何寄存器。
xSSE=1 时,读取 mem[ssp] 并与 x5 逐位比较。仅加载成功且相等时将 ssp 增加 XLEN/8;不匹配触发 cause=18、xtval=3 的 software-check 异常。