严重错误
概述
昆明湖 V2R2 支持了 RISC-V 双重陷入系列拓展,包括 ssdbltrp 以及 smdbltrp 拓展,用于处理系统级不可恢复错误,即严重错误 (critical error) :此时处理器陷入一种无法通过常规异常处理流程进行修复的状态。
RISC-V 特权级手册定义的严重错误是指在异常处理程序(非可重入阶段)发生了新的异常或中断即双重陷入 (double trap) 。这种嵌套陷入可能会导致:
- 上下文寄存器内容丢失或覆盖
- 常规异常返回路径不再可靠
- 无法恢复初始异常的执行现场
因此,RISC-V 特权级手册引入了双重陷入拓展,额外定义严重错误异常处理程序,处理部分可恢复的严重错误。
可恢复严重错误
双重陷入拓展将在监管模式 (HS/S)、虚拟监管模式(VS)以及部分机器模式(M)发生的双重陷入定义为可恢复的严重错误。
(虚拟)监管模式可恢复严重错误
(虚拟)监管模式可恢复严重错误的响应流程:
第一步,根据 vs/sstatus 寄存器的 SDT 位判断是否在(虚拟)监管模式发生双重陷入;
第二步,若发生双重陷入,委托更高特权级(机器模式)对第二次陷入进行处理,从而保护当前特权级以及存在的特权寄存器,上下文寄存器等信息;
第三步,机器模式处理第二次陷入:
- 将 mcause 标记为 16(double trap);
- 将 mtval2 标记为第二次陷入类型;
第四步,根据 mtvec 跳转至系统软件预先配置的双重陷入处理函数,处理二次陷入。
(虚拟)监管模式可恢复严重错误的返回流程:
机器模式采用 mret 指令回到第一次陷入的异常处理函数以及特权级,将对应 vs/sstatus 的 SDT 清空,以标记二次陷入处理完成,最后继续完成后续第一次陷入处理。
机器模式可恢复严重错误
由于 昆明湖 V2R2 支持了 RISC-V 可恢复非屏蔽中断拓展,即 smrnmi 拓展,因此支持对机器模式严重错误进行恢复。
机器模式可恢复严重错误的响应流程:
第一步,根据 mstatus 寄存器的 MDT 位判断是否在机器模式发生双重陷入;
第二步,若发生双重陷入,查找是否存在更高特权级对第二次陷入进行处理:
- 若非屏蔽中断状态寄存器 mnstatus.nmie 位打开,表示此时支持可恢复非屏蔽中断处理,可以委托;
- 若 nmie 位关闭,表示此时不支持可恢复非屏蔽中断或正在进行可恢复非屏蔽中断处理,无法委托;
第三步,非屏蔽中断处理二次陷入。
机器模式模式可恢复严重错误的返回流程:
机器模式采用 mnret 指令回到第一次陷入的异常处理函数以及特权级,将对应 mstatus 的 MDT 清空,以标记二次陷入处理完成,最后继续完成后续第一次陷入处理。
不可恢复严重错误(严重错误状态)
双重陷入拓展将下列严重错误定义为不可恢复严重错误:
- 不支持可恢复非屏蔽中断处理时,机器模式发生严重错误
- 可恢复非屏蔽中断正在处理时,机器模式发生严重错误
简单来说,上述情况都是在 mnstatus.nmie 拉低的情况下,发生陷入。此时不存在可以委托的更高特权级,因此无法处理严重错误。双重陷入拓展将该状态定义为严重错误状态:即处理器核在支持双重陷入行为后也无法处理当前状态,后续行为未知,需要外部平台介入。
此外,目前 昆明湖 V2R2 将处理器核挂死自定义为严重错误状态,作为硅后判断挂死的重要手段。其中 ROB commit stuck 超时检查由自定义 CSR mcorepwr[1] 控制:mcorepwr 的地址为 0xBC0,bit 1 为 COMMIT_STUCK_CHECK_ENABLE,复位值为 0。软件将该位写 1 时开启 ROB commit stuck 超时检查,超时后上报 critical error;写 0 时关闭该检查,处理器不会因该类 commit stuck 超时上报 critical error。
严重错误状态处理
处理器收集到不可恢复严重错误信息后,会进入严重错误状态,即特殊停机状态。RISC-V 手册规定该状态需要对外部平台可观测、可调试:
- 处理器核提供顶层接口 riscv_critical_error ,用于外部平台观测;
- 根据调试模式配置寄存器 dcsr.cetrig 字段,在严重错误状态可选进入调试模式处理;
- cetrig = 1: 不对外递送 critical error 信号,进入调试模式处理,并配置进入原因为严重错误状态:dcsr.cause = 7, dcsr.extcause = 0;
- cetrig = 0: 递送 critical error 信号,由外部平台进行 reset 或其他错误上报/容错机制。