大数跨境
0
0

RISC-V双重陷阱扩展--Sxdbltrp

RISC-V双重陷阱扩展--Sxdbltrp 处理器+AI知识星球
2025-12-08
7
导读:RISC-V 指令集的一大优势是其可扩展性,用户可根据具体应用需求,选择合适的扩展指令集。本文介绍RISC-V的双重陷阱扩展--Sxdbltrp

更多精彩,请点击上方图片蓝字关注我

前言:


RISC-V(发音为“risk-five”)是一种新的指令集架构(ISA),最初的设计目的是支持计算机架构的研究和教育,但随着近些年的发展,它已经成为工业实现中的一个标准化、免费且开放的架构。(所有spec下载:我整理了RISC-V所有spec(附下载链接)

RISC-V 指令集的一大优势是其可扩展性,用户可根据具体应用需求,选择合适的扩展指令集。本文介绍RISC-V的双重陷阱扩展--Sxdbltrp


一、双重陷阱介绍

双重陷阱通常发生在陷阱处理操作的敏感阶段 —— 当陷阱处理程序(负责管理这类事件的组件)处于不可重入状态时,若此时触发异常或中断,就会引发双重陷阱。这种不可重入状态一般出现在陷阱处理的初期阶段,此时陷阱处理程序尚未完成必要的状态保存,无法支撑后续的陷阱处理与恢复流程。在此阶段发生新的陷阱,会覆盖关键的状态信息,导致恢复初始陷阱所需的数据丢失。我们将引发这种严重错误状态的陷阱称为意外陷阱

陷阱处理程序在该阶段的设计要求是:既不允许使能中断,也不能主动触发异常。但硬件错误异常具有不可预测性,其潜在的双重陷阱风险给陷阱处理程序的实现带来了极大挑战。

RISC-V 指令集架构(ISA)的双重陷阱扩展,旨在解决传统故障处理机制难以应对的场景。尽管双重陷阱在多数情况下属于无法恢复的严重错误,但这类扩展定义了跨特权级的错误处理策略。为增强故障处理能力,RISC-V官方定义了以下两类指令集架构扩展:

  1. Ssdbltrp 扩展:该扩展用于处理比机器模式低的特权级的双重陷阱。它支持:

    • 当虚拟机的监督者模式(VS 模式)发生双重陷阱时,由宿主监督者模式(HS 模式)调用虚拟机内的严重错误处理程序;

    • 当监督者模式(S 模式)/ 宿主监督者模式(HS 模式)发生双重陷阱时,由机器模式(M 模式)调用操作系统 / 虚拟机监控器中的严重错误处理程序。

  2. Smdbltrp 扩展:该扩展用于处理机器模式(M 模式)下的双重陷阱。功能如下:

    • 若同时实现了 Smrnmi 扩展 ,当 M 模式发生双重陷阱时,可调用RNMI 处理程序来处理该严重错误;

    • 未实现 Smrnmi 扩展,或 RNMI 处理程序执行期间发生双重陷阱,该扩展会将硬件线程(hart)切换至严重错误状态,并向平台发送严重错误信号;

    • 为提升错误诊断与解决效率,该扩展支持对处于严重错误状态的硬件线程(hart)进行调试


二 Ssdbltrp 扩展

Ssdbltrp 扩展为以下控制状态寄存器(CSR)新增字段:

  • 在 sstatus 寄存器中添加监督者模式陷阱禁用位(SDT)(bit24);

  • 在 menvcfg 寄存器中添加双重陷阱使能位(DTE)(bit59)。

若实现了 H 扩展(虚拟化扩展),Ssdbltrp 还会:

  • 在 vsstatus 寄存器中添加 SDT 位(bit24);

  • 在 henvcfg 寄存器中添加 DTE 位(bit59)。

Ssdbltrp 扩展要求必须实现 mtval2 寄存器,并新增一种异常码(值 = 16),专门用于标识双重陷阱异常。由于双重陷阱不可委派,medeleg(机器模式异常委派寄存器)和 hedeleg(宿主异常委派寄存器)的第 16 位均为只读零

2.1 使能控制逻辑

  1. 当 menvcfg.DTE 位为 0 时,实现行为等同于未启用 Ssdbltrp 扩展;

  2. 若未实现Ssdbltrp扩展, sstatus.SDTvsstatus.SDT和 henvcfg.DTE位均为只读零;

  3. 当 henvcfg.DTE 位为 0 时,VS 模式下的 Ssdbltrp 扩展视为未启用,且 vsstatus.SDT 位为只读零。

2.2 SDT 位与 SIE 位的联动规则

通过显式 CSR 写操作将 SDT 位设为 1 时,监督者中断使能位(SIE) 会被强制清0——即便同一写操作试图修改 SIE 位,该清0行为仍会生效。仅当以下两种情况之一成立时,才能通过显式 CSR 写操作将 SIE 位置 1:

  • 同一写操作同时将 SDT 位设为 0;

  • SDT 位已处于 0 状态。

2.3 双重陷阱触发与处理流程

当陷阱即将进入 VS 模式或 S 模式时,按以下逻辑处理:

  1. 若当前 SDT 位为 0:将 SDT 位设为 1,并正常交付该陷阱;

  2. 若当前 SDT 位已为 1:此陷阱判定为意外陷阱,触发双重陷阱异常并交付至 M 模式(机器模式)。

双重陷阱异常交付时,硬件线程(hart)的寄存器写入规则如下:

  • 除 mcause(机器模式异常原因寄存器)和 mtval2(机器模式陷阱值 2 寄存器)外,其余寄存器按 “该意外陷阱直接交付至 M 模式” 的场景写入对应信息;

  • mtval2 寄存器写入 “该意外陷阱原本应写入 mcause 的值”;

  • mcause 寄存器写入双重陷阱异常码(值 = 16)。

2.4 双重陷阱恢复

  1. 在 S 模式(监督者模式) 下执行 SRET 指令(监督者模式返回指令)时,会将 sstatus.SDT 位设为 0;若执行该指令后切换至 VU 模式(虚拟用户模式),则同时将 vsstatus.SDT 位设为 0。

  2. 在 VS 模式(虚拟监督者模式) 下执行 SRET 指令时,仅将 vsstatus.SDT 位设为 0。

  3. 执行 MRET 指令(机器模式返回指令)时,若切换后的新特权级为 U 模式(用户模式)、VS 模式或 VU 模式,则将 sstatus.SDT 位设为 0;若新特权级为 VU 模式,额外将 vsstatus.SDT 位设为 0。

  4. 当硬件线程(hart)从 调试模式(Debug Mode) 恢复时,若切换后的新特权级为 U 模式、VS 模式或 VU 模式,则将 sstatus.SDT 位设为 0;若新特权级为 VU 模式,额外将 vsstatus.SDT 位设为 0。

当陷阱处理程序完成陷阱恢复所需状态(如 scause、sepc、stval 等寄存器值)的保存,且具备可重入性后,应清除 SDT 位。通过 SRET 指令清零 SDT 位的设计,使得陷阱处理程序能够检测到收尾阶段(即恢复从陷阱返回所需关键状态的阶段)可能发生的双重陷阱。

客户机页故障引发的 GPA 不可用问题

本规范的一个隐含结果是:若严重错误由客户机页故障(guest page-fault) 导致,则当双重陷阱交付至 M 模式时,客户机物理地址(GPA) 无法在 mtval2 寄存器中获取。这种场景的触发条件是:HS 模式在 SDT 位为 1 时,执行虚拟机加载 / 存储指令,且该指令引发了客户机页故障。不过,在陷阱处理的该阶段执行此类指令并不常见。

需要说明的是,未将 GPA 记录到 mtval2 被视为无害—— 因为若确有需要,仍可通过页表遍历(虽需额外开销)获取该地址。


三 Smdbltrp扩展 

Smdbltrp 扩展为机器模式(M 模式)的双重陷阱处理提供核心机制,其细节如下:

3.1 新增寄存器字段与基础配置

1. MDT 位(Machine-mode-disable-trap)

    • RV64 架构:在 mstatus 控制状态寄存器中新增第 42 位,作为 MDT 位;

    • RV32 架构:在 mstatush(机器模式状态高位寄存器)中新增第 10 位,作为 MDT 位。

  • 复位状态:MDT 位复位后默认值为 1。

  • 异常码:沿用双重陷阱统一异常码(值 = 16)。

3.2 MDT 位与 MIE 位的联动规则

通过显式 CSR 写操作将 MDT 位设为 1 时,机器模式中断使能位(MIE) 会被强制清 0:

  • RV64 架构:无论同一写操作是否尝试修改 MIE 位,该清 0 行为均生效;

  • RV32 架构:由于 MDT 位位于 mstatush 寄存器,而 MIE 位位于 mstatus 寄存器,二者写操作相互独立,但仍需遵循 “MDT=1 时 MIE 必须为 0” 的约束。

仅当以下条件满足时,可通过显式 CSR 写操作将 MIE 位置 1:

  • RV64:MDT 位已为 0,或同一写操作同时将 MDT 位设为 0;

  • RV32:MDT 位已为 0(因寄存器分离,无法通过同一写操作同步修改)。

3.3 M 模式陷阱处理逻辑

当陷阱即将进入 M 模式时,按以下规则判定是否为双重陷阱:

  1. 正常陷阱交付:若当前 MDT 位为 0,将 MDT 位设为 1,并按预期交付陷阱;

  2. 意外陷阱判定:若当前 MDT 位已为 1,该陷阱判定为意外陷阱(即触发 M 模式双重陷阱)。

3.4 特殊例外规则(与 Smrnmi 扩展联动)

  • 若实现了 Smrnmi 扩展(重启不可屏蔽中断扩展),则RNMI 引发的陷阱无论 MDT 位状态如何,均不视为意外陷阱,且不会修改 MDT 位;

  • 若在 M 模式下执行时,mnstatus.NMIE(机器模式不可屏蔽中断使能位)为 0,此时发生的任何陷阱均判定为意外陷阱。

3.5 意外陷阱的两种处理路径

路径 1:通过 RNMI 处理程序恢复(需实现 Smrnmi 扩展)

当 Smrnmi 扩展已实现且 mnstatus.NMIE 为 1 时

  1. 硬件线程(hart)陷入 RNMI 处理程序(重启不可屏蔽中断处理程序);

  2. 寄存器写入规则:

    • mnepc(机器模式不可屏蔽中断程序计数器)写入原意外陷阱应存入 mepc 的值;

    • mncause(机器模式不可屏蔽中断原因寄存器)写入原意外陷阱应存入 mcause 的值;

    • mnstatus(机器模式不可屏蔽中断状态寄存器)的特权级字段标识为 M 模式,并将其 NMIE 位设为 0(禁止嵌套 RNMI)。

本规范的隐含约束:RNMI 处理程序无法直接获取原陷阱在 mtval 和 mtval2 寄存器中存储的信息。若需此类信息,需由 RNMI 处理程序解码 mnepc 指向地址的指令,并读取其源寄存器内容推导得出。

路径 2:进入不可恢复的严重错误状态

当以下任一条件成立时,hart 进入不可恢复的严重错误状态

  • 未实现 Smrnmi 扩展;

  • 已实现 Smrnmi 扩展,但 mnstatus.NMIE 为 0。

该状态的行为特征:

  • 立即停止指令执行,不更新任何架构状态(包括程序计数器 pc);

  • 禁用所有中断(含不可屏蔽中断 NMI);

  • 向平台断言(assert)严重错误信号

平台收到严重错误信号后的处理行为为平台相关(platform-specific),可能的操作包括:重启受影响的 hart、重启整个平台、触发故障记录等。

3.6 返回指令与状态恢复逻辑

当在 M 模式下执行 MRET(机器模式返回指令)或 SRET(监督者模式返回指令)时:

  1. 强制将 mstatus.MDT 位设为 0(重置 M 模式陷阱禁用状态);

  2. 若返回后的目标特权级为 U 模式(用户模式)、VS 模式(虚拟监督者模式)或 VU 模式(虚拟用户模式),则同步将 sstatus.SDT 位设为 0;

  3. 若目标特权级为 VU 模式,额外将 vsstatus.SDT 位设为 0(确保虚拟机内陷阱状态同步重置)。

3.7 调试模式集成(cetrig 字段)

Smdbltrp 扩展在 dcsr(调试控制状态寄存器)[4] 中新增 cetrig(critical-error-trigger,严重错误触发位) 字段(第 19 位),支持调试严重错误状态的 hart:

  • 字段属性:读写位,默认值为 0;

  • 功能触发:当 cetrig 位设为 1 时,处于严重错误状态的 hart 不会向平台断言严重错误信号,而是直接进入调试模式

  • 调试模式状态配置:进入调试模式时,dcsr.cause 字段设为 7(标识 “严重错误触发”),dcsr.extcause 字段设为 0;

  • 优先级:该调试模式进入原因的优先级高于所有其他调试触发条件;

  • 恢复行为:从该场景的调试模式恢复后,hart 会回到之前的严重错误状态(而非正常执行状态)。

3.8 调试模式恢复后的状态重置

当 hart 从调试模式恢复时:

  1. 若恢复后的目标特权级非 M 模式,则将 mstatus.MDT 位设为 0;

  2. 若目标特权级为 U 模式、VS 模式或 VU 模式,同步将 sstatus.SDT 位设为 0;

  3. 若目标特权级为 VU 模式,额外将 vsstatus.SDT 位设为 0。


相关阅读:

特权级别和调试模式

RISC-V可恢复不可屏蔽中断扩展-Smrnmi

欢迎关注公众号,随时获取最新动态


【声明】内容源于网络
0
0
处理器+AI知识星球
计算机体系结构、RISC-V、CPU、GPU、NPU、XPU等相关知识
内容 125
粉丝 0
处理器+AI知识星球 计算机体系结构、RISC-V、CPU、GPU、NPU、XPU等相关知识
总阅读82
粉丝0
内容125