跳转至

异常

异常是在指令流水线中被同步检测到的事件。这种事件通常在逻辑上导致流水线无法继续(比如指令的要求无法被满足),必须立即转移到其他指令序列上。

异常可以同步发生在指令的执行中间,这个过程指令的部分行为可能已经生效,也可能未生效,也可能全部生效。具体情况和具体的指令和异常的类型相关。如果没有专门说明,默认特定指令发生了异常,则指令要求的所有行为都不生效,指令指针也仍停留在发生异常的指令上。

在检测到异常的时候,除非引起异常的指令来自未被接管的主动修复块,否则灵犀逻辑核会进入SERVICE_REQUEST流程。

异常的陷入代号

不同的异常原因可以其 陷入代号陷入参数 区分。下表列出所有被支持的 陷入代号

异常大类 子编码 描述
E_INST(0) 指令相关异常
0 指令访问异常 (EC_ACCESS_FAULT)
1 指令翻译异常 (EC_TRANS_FAULT)
2 指令不对齐 (EC_MISALIGNED)
3 非法指令 (EC_ILLEGAL)
4 指令权限异常 (EC_PERM)
5 指令页非法 (EC_PF)
6 总线异常 (EC_BUS)
7 非法参数 (EC_PARAM)
8 非法操作 (EC_NV)
9 除以零 (EC_DZ)
10 上溢 (EC_OF)
11 下溢 (EC_UF)
12 不精确 (EC_NX)
E_DATA(1) 数据访问相关异常。发生这种异常时,系统寄存器TRAPARG0总等于做访问的数据的地址。
0 内存读取异常 (EC_LOAD)
1 内存读取不对齐 (EC_MISALIGNED)
2 内存读取页异常 (EC_LOAD_PAGE)
3 内存写访问异常 (EC_STORE_A_ACCESS)
4 内存写地址不对齐 (EC_STORE_A_MISALIGNED)
5 写操作页非法 (EC_STORE_A_PF)
6 访问范围非法 (EC_RANGE)
7 总线异常 (EC_BUS)
E_BLOCK(4) 块格式异常
0 输出未指定的输出寄存器 (EC_INVAL_SET)
1 读取未指定的输入寄存器 (EC_INVAL_GET)
2 非法参数 (EC_INVAL_PARM)
3 块内重复设置寄存器 (EC_INVAL_DOUBLESET)
4 不正确的子修复块参数 (EC_INVAL_FIXUP)
5 不正确的块类型 (EC_TYPE)
5-14 保留
E_ASSERT(15) 断言异常 (详见assert指令)
E_SCALL(16) 软件主动异常(系统调用)
E_BREAKPOINT(17) 软件断点
18-61 保留
E_ISSR(62) 非法SSR异常
E_NIL(63) 异常分类无效

未说明原因参数的类别,原因参数总为0。

更多不具有通用性的具体 陷入参数 请参考具体的异常行为的描述上下文。

异常路由

默认的异常 路由 策略由下表定义:

异常类型 当前执行在ACR0 当前执行在ACR1 当前执行在ACR2
E_INST ACR0 ACR1 ACR1
E_DATA ACR0 ACR1 ACR1
E_BLOCK ACR0 ACR1 ACR1
E_ASSERT ACR0 ACR1 ACR1
E_BREAKPOINT ACR0 ACR1 ACR1
E_ISSR ACR0 ACR1 ACR1
E_SCALL ACR0 - -

E_SCALL的路由策略由请求指令的service_type(参考:acrc)决定:

  • service_type为SCT_SYS时,ACR2路由到ACR1。
  • 其他所有的有效类型都路由到ACR0。

部分扩展可能修改默认的路由行为,如果使能了这种类型的扩展,以该扩展的定义为准。(当前没有修改默认路由行为的扩展)