异常¶
异常是在指令流水线中被同步检测到的事件。这种事件通常在逻辑上导致流水线无法继续(比如指令的要求无法被满足),必须立即转移到其他指令序列上。
异常可以同步发生在指令的执行中间,这个过程指令的部分行为可能已经生效,也可能未生效,也可能全部生效。具体情况和具体的指令和异常的类型相关。如果没有专门说明,默认特定指令发生了异常,则指令要求的所有行为都不生效,指令指针也仍停留在发生异常的指令上。
在检测到异常的时候,除非引起异常的指令来自未被接管的主动修复块,否则灵犀逻辑核会进入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。
部分扩展可能修改默认的路由行为,如果使能了这种类型的扩展,以该扩展的定义为准。(当前没有修改默认路由行为的扩展)