NMI概述
NMI(非屏蔽中断)是处理器核心的一种特殊输入信号,通常用于指示系统级紧急错误(如外部硬件故障等)。遇到NMI后,处理器应立即中止当前程序的执行,转而处理NMI错误。
NMI掩蔽
在RISC-V体系结构中,NMI不能被屏蔽,这意味着如果内核遇到NMI,它必须停止当前执行并转向处理NMI。
进入NMI处理模式
以NMI为例,Nuclei处理器内核的硬件行为如NMI的总体过程所示。请注意,以下操作在一个周期内同时进行:
•更新CSR寄存器:mepc和mstatus。
–这些行为遵循RISC-V标准特权体系结构规范。本文档不会重复其内容,请参阅RISC V标准权限或体系结构规范以获取更多详细信息。
•更新CSR寄存器:mcause。
–NMI的mcause值在Nuclei处理器核心中是唯一的。
•停止执行当前程序,并从CSR mnvec定义的PC地址开始。
–mnvec的值在Nuclei处理器核心中是唯一的。
•更新核心的特权模式和机器子模式。
从mnvec定义的PC执行
Nuclei处理器核心在遇到NMI后跳转到CSR mnvec定义的PC。CSR mnvec
由CSR寄存器mmisc_ctl控制的两个潜在值:
•当mmisc_ctl[9]=1时,mnvec的值等于mtvec的数值,这意味着NMI和异常
共享相同的陷阱条目地址。
•当mmisc_ctl[9]=0时,mnvec的值等于重置后的PC值reset_vector的值。
reset_vector是核心的输入信号。请参阅Nuclei处理器核心的具体数据表
有关此信号的详细信息。
更新CSR mcause
Nuclei处理器核心将把NMI代码保存到CSR mcause中。EXCCODE由硬件自动执行时采取NMI。中断、异常和NMI都有自己指定的陷阱ID。NMI的陷阱ID有两个由CSR寄存器mmisc_ctl控制的潜在值:
•当mmisc_ctl[9]=1时,NMI的陷阱ID为0xfff。
•当mmisc_ctl[9]=0时,NMI的陷阱ID为0x1。
该软件可以通过查询Trap ID来识别Trap原因,并构建相应的Trap处理程序
针对不同类型的陷阱。
更新特权模式
NMI是在机器模式下移交的,因此当核心进行NMI时,特权模式将切换到机器模式。
更新机器子模式
Nuclei处理器核心的机器子模式在msubm中指示。TYP实时存档。当核心采取NMI时,Machine Sub Mode(机器子模式)将更新为NMI处理模式,因此:
•提交的msubm。TYP更新为NMI处理模式,如进入/退出NMI时CSR mstatus和msubm更新所述(第20页),以反映当前机器子模式为“NMI处理方式”。
•msubm的值。PTYP将更新为msub的值。获取NMI之前的TYP,如进入/退出NMI时CSR mstatus和msubm更新所示(第20页)。msubm的值。将使用PTYP
以恢复msubm的值。退出NMI处理程序后的PTYP。
退出NMI处理模式
在处理完NMI后,他们再次从NMI中退出,并转而执行主程序。
由于NMI是在机器模式下处理的,软件必须执行mret才能退出NMI处理程序。
处理器在执行mret指令后的硬件行为如退出NMI的整个过程所示。请注意,以下硬件行为在一个周期内同时完成:
•停止执行当前程序,并从CSR mepc定义的PC地址开始。更新CSR mstatus。更新特权模式。
–这些行为遵循RISC-V标准特权体系结构规范。并且这些行为与“退出异常处理模式”的行为完全相同,本文在此不再赘述其内容,更多细节请参阅RISC-V标准特权架构规范。
•更新机器子模式。
更新机器子模式
msubm的值。TYP实时指示Nuclei处理器核心的机器子模式。执行mret指令后,硬件将根据msubm的值自动恢复core的Machine Sub Mode。PTYP:
•取NMI,msubm的值。在采取NMI之前,PTYP更新为Machine Sub Mode(机器子模式)。执行mret指令后,硬件将使用msubm值自动恢复机器子模式。PTYP,如进入/退出NMI时CSR mstatus和msubm更新中所示。通过这种机制,核心的机器子模式恢复到采取NMI之前的相同模式。
NMI服务程序
当核心获取一个NMI时,它会跳转到mnvec定义的地址执行程序,该地址通常是NMI服务例程。
注意:由于没有硬件可以在获取或退出NMI时自动保存和恢复执行上下文,因此软件需要明确使用指令(汇编语言)来保存和恢复上下文。