跳转至

中断和异常

灵犀指令集指令定义的执行序列可以被中断或者异常更改。

在本定义中,中断(Interrupt)被定义为一种发生在指令流水线外的异步事件。灵犀逻辑核(LxLC)在执行流水线的某些步骤中捕获这种事件,并改变指令的执行序列,从而让可以响应该事件的软件对象处理这种事件。

异常(Exception)被定义为指令流水线自身遇到的同步事件。灵犀逻辑核(LxLC)在执行流水线的某些步骤中检测到这种事件,通过提前中止本指令的执行,把灵犀逻辑核(LxLC)切换到新的执行位置,以让响应该事件的软件对象处理该事件。作为同步事件,异常通常可以精确定义异常产生时,指令已经完成的行为。

中断和异常改变指令执行序列的过程常常伴随着ACR和其他寄存器的改变,这种改变可以被灵犀逻辑核(LxLC)的配置所定义,进入不同的执行路径。这种被配置的执行路径选择称为中断和异常的路由。

中断和异常的检测和路由逻辑分别在中断异常两个章节中详细定义。

块状态

一个块指令的执行结果分为两种:

  • 块指令正常提交(Block Commit Success):块内微指令正常执行,未出现异常以及未被中断,块内状态成功提交。
  • 块指令异常终止(Block Exception Terminate):块内微指令未能正常执行,块内状态BSTATE指向异常终止的微指令以及该微指令的上下文。

在块出现异常时,块内状态BSTATE会被保存到 EBSTATE 空间中。

exe_model

块指令异常终止

块指令异常终止指的是:

  • 块指令异常:例如块指令初始化/提交失败异常,块头解码异常等,主动异常例如ECALL和ERET。
  • 块内微指令异常:例如页表错误,访问超过指定区间,指令解码错误,浮点,除0等异常。
  • 中断:例如被外部设备,时钟所中断。

EBSTATE

EBSTATE (Exception Block State) 是灵犀指令集用于保存和恢复异常块指令状态的存储空间。这个空间的实现根据块类型的不同可能不同。

STD、SYS、FP块

对于 STD、SYS、FP 类型的块指令,其用于标量运算或系统级控制,块内状态相对简单。其 EBSTATE 由系统寄存器与内存共同实现。

当触发异常或中断时,硬件需将 BSTATE 的相关内容保存至系统寄存器,具体为:

  • 将 BARG.BPC 写入 SSR:EBPC
  • 将 BARG.BPCN 写入 SSR:EBPCN
  • 将 BARG 的其余字段写入 SSR:EBARG
  • 将 TPC 写入 SSR:ETPC

在异常恢复时,硬件需将上述系统寄存器内容加载回对应的块内寄存器,保证块指令从异常触发点正确继续执行。

BSTATE 中其他 T/U 等标量寄存器是否保存至内存及是否恢复,由操作系统自行决定。

VPAR、VSEQ、MPAR、MSEQ块

对于 VPAR、VSEQ、MPAR、MSEQ 等类型的块指令而言,块内状态相对复杂,并且需要非常大的空间来保存EBSTATE。其 EBSTATE 由系统寄存器与Tile寄存器共同实现。

当触发异常或中断时,硬件需将 BSTATE 的相关内容保存至系统寄存器,具体为:

  • 将 BARG.BPC 写入 SSR:EBPC
  • 将 BARG.BPCN 写入 SSR:EBPCN
  • 将 BARG 的其余字段写入 SSR:EBARG
  • 将 触发异常的Group的ID记录在 SSR:EBARG

在异常恢复时,硬件需将上述系统寄存器内容加载回对应的块内寄存器,保证块指令从异常触发点正确继续执行。

BSTATE 中其他寄存器状态是否保存至Tile寄存器或内存及是否恢复,由操作系统自行决定。其中包括:

  • 可以通过调用 TSTORE 指令将所有或某一类Tile寄存器保存至内存;
  • 可以通过调用 ESAVE 模版块保存Group的TPC和LPR至Tile寄存器;
  • 可以通过调用 TSTORE 指令将ESAVE输出的Tile寄存器内容保存至内存。

异常与陷出

interrupt_model

有些场景出现异常后,后续指令还需要执行,这种异常用常规方式解决,将当前执行的块状态保存在EBSTATE中,块处理器执行的状态转移到更高特权级的块指令中执行,更高特权级的程序可以通过访问之前被中断块指令的EBSTATE,进行对低特权级的异常处理、调度和状态修改。操作系统和调试软件通过该接口进行调试。

常规的异常因需要切换特权级进行异常处理,所以响应异常的时间长。

自修复块

自修复块可以接管部分程序预期内的异常的处理。这种情况下,默认的中断路由协议会被自修复块的定义所取代。