跳转至

异常

异常是在处理指令时同步检测到的事件。除非具体指令另有规定,异常指令不提交体系结构可见副作用,保存的执行位置指向该指令,以便处理完成后重试。

TRAPNO 保存异常大类和原因;当 TRAPNO.ARGV=1 时,TRAPARG0 保存附加参数。线级格式见 TRAPNO

块执行过程中的可恢复异常

块进入执行后发生可恢复异常时,硬件必须冻结异常块,并保留继续执行所需的全部状态。在软件保存状态或明确终止该块之前,硬件不得覆盖或释放这些资源。

至少需要保留:

  • 块寄存器内容;
  • 块执行和序列进度;
  • 谓词及控制状态;
  • 未完成操作状态;
  • 重新执行所需的其他体系结构游标。

软件可以使用 ESAVE 等状态保存块导出内部状态。实现必须为 ESAVE 提供独立通路,或者预留足够的寄存器、队列项和发射资源,保证异常块占满普通资源时 ESAVE 仍能前向执行。

当前 profile 对块内部异常作如下区分:

  1. VECTOR 块可以产生体系结构定义的可恢复内部异常。
  2. CUBE 块进入执行后不产生 CUBE 自有的可恢复异常。
  3. TLSU 块不产生 TLSU 自有的可恢复异常;地址翻译、权限和总线错误仍由访存系统报告为 E_DATA
  4. 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.MPARBSTART.MSEQBSTART.VPARBSTART.VSEQ
  • 对应的 C.BSTART.* 形式。

BSTART.VECBSTART.SFU 是 TEPL 汇编别名,不属于本 VECTOR 首次使用集合。

CUBE 触发集合从规范 PTO 操作表中 family=CUBEengine=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。