异常¶
异常是在处理指令时同步检测到的事件。除非具体指令另有规定,异常指令不提交体系结构可见副作用,保存的执行位置指向该指令,以便处理完成后重试。
TRAPNO 保存异常大类和原因;当 TRAPNO.ARGV=1 时,TRAPARG0 保存附加参数。线级格式见 TRAPNO。
块执行过程中的可恢复异常¶
块进入执行后发生可恢复异常时,硬件必须冻结异常块,并保留继续执行所需的全部状态。在软件保存状态或明确终止该块之前,硬件不得覆盖或释放这些资源。
至少需要保留:
- 块寄存器内容;
- 块执行和序列进度;
- 谓词及控制状态;
- 未完成操作状态;
- 重新执行所需的其他体系结构游标。
软件可以使用 ESAVE 等状态保存块导出内部状态。实现必须为 ESAVE 提供独立通路,或者预留足够的寄存器、队列项和发射资源,保证异常块占满普通资源时 ESAVE 仍能前向执行。
当前 profile 对块内部异常作如下区分:
- VECTOR 块可以产生体系结构定义的可恢复内部异常。
- CUBE 块进入执行后不产生 CUBE 自有的可恢复异常。
- TLSU 块不产生 TLSU 自有的可恢复异常;地址翻译、权限和总线错误仍由访存系统报告为
E_DATA。 - VECTOR/CUBE 首次使用异常发生在块执行之前,不属于块内部异常。
TMA 是 TLSU 的历史名称,活动规范统一使用 TLSU。
通过 B.IOR 提供的 TLSU 全局内存地址,是发起 ACR 中的数据虚拟地址;当
IOTCR 未使能 I/O 翻译时,它使用当前任务的普通 CPU 地址翻译和权限上下文。
该地址不会被隐式解释为 I/O 虚拟地址;只有 IOTCR 明确使能 I/O 地址空间时
才使用 IOMMU 翻译。TLSU 访存
beat 失败时,TRAPARG0 保存原始虚拟地址,并进入普通的精确 E_DATA 路径。
VECTOR/CUBE 首次使用异常¶
首次使用机制使 ACR1 内核只在 ACR2 任务真正使用 VECTOR 或 CUBE 时分配、初始化或恢复对应上下文。该异常是精确的指令执行前异常。
触发集合¶
VECTOR 首次使用检查覆盖:
BSTART.MPAR、BSTART.MSEQ、BSTART.VPAR、BSTART.VSEQ;- 对应的
C.BSTART.*形式。
BSTART.VEC 和 BSTART.SFU 是 TEPL 汇编别名,不属于本 VECTOR 首次使用集合。
CUBE 触发集合从规范 PTO 操作表中 family=CUBE 且 engine=CUBE 的行派生,不维护独立手写名称表。
精确异常信封¶
| 字段 | VECTOR | CUBE |
|---|---|---|
TRAPNO.E |
1 |
1 |
TRAPNO.ARGV |
1 |
1 |
TRAPNO.TRAPNUM |
E_INST (0) |
E_INST (0) |
TRAPNO.CAUSE |
EC_PERM (4) |
EC_PERM (4) |
TRAPARG0 |
TRAPARG0 = 0 |
TRAPARG0 = 1 |
ECSTATE.BI |
0 |
0 |
归档 v0.55 材料中存在 EC_PERM 的拼写错误;该旧拼写不是活动别名。
触发顺序和精确性¶
处理器先完成合法译码和 ACR 权限检查,再执行首次使用检查。首次使用检查必须早于 BARG/BSTATE 修改、扩展上下文分配、队列接纳、访存请求或任何其他副作用。
因此,非法编码或非法块目标仍保持原有异常优先级。首次使用异常返回位置指向原始块头;软件处理完成后可重试同一块头,不会产生重复副作用。
内核处理¶
对于从未使用过的扩展,内核分配并初始化任务上下文,标记其已驻留,只清除对应的 ECONFIG_ACR1.V 或 .C 位,然后重试原始块头。
对于已经使用但尚未恢复的扩展,内核恢复已有上下文,标记其已驻留,只清除对应位,然后重试。处理 VECTOR 时不得清除 CUBE 位;处理 CUBE 时不得清除 VECTOR 位。
任务软件必须区分:
| 状态 | 已分配上下文 | 已驻留硬件 | 使能位 |
|---|---|---|---|
NEVER_USED |
否 | 否 | 1 |
SAVED_NOT_RESTORED |
是 | 否 | 1 |
LIVE |
是 | 是 | 0 |
任务切换时,软件只保存已经使用且当前驻留的上下文。返回 ACR2 之前,必须根据下一个任务重新写入 ECONFIG_ACR1.V/C;只在内核启动时配置一次不满足要求。
路由¶
首次使用异常是同步异常(TRAPNO.E=1),遵循普通 E_INST 路由。当前未发布的 v0.58 主线契约中,ACR2 产生的该异常路由到 ACR1。