tricore architecture - Trap System

Trap System

陷阱(Trap)是由于某些事件触发的,例如 不可屏蔽中断(NMI)、指令异常、内存管理异常或非法访问。陷阱始终处于使能状态,无法通过软件操作禁用。

1 陷阱类型

TriCore 架构定义了 八种陷阱类别。每个类别都有各自的 陷阱处理程序,可通过 32 字节 的陷阱向量条目访问,并由 硬件定义的陷阱类别编号 进行索引。在每个类别中,具体的陷阱由 陷阱识别号(TIN,Trap Identification Number) 进行区分,Trap发生时,该编号由硬件加载到 D[15] 寄存器,然后执行陷阱处理程序的第一条指令。陷阱处理程序必须检查 D[15] 的值,并根据其分支到对应的子处理程序来处理特定的 TIN。

此外,陷阱可以进一步分类:

  • 同步(Synchronous)或异步(Asynchronous)
  • 硬件触发(Hardware)或软件触发(Software)

支持的 Trap 类型汇总:

  • Class 0 — MMU:

    • TIN = 0 : VAF(同步、硬件触发),Virtual Address Fill
    • TIN = 1 : VAF(同步、硬件触发),Virtual Address Protection
  • Class 1 — Internal Protection Traps:

    • TIN = 1 : PRIV(同步、硬件触发),Privileged Instruction.
    • TIN = 2 : MPR(同步、硬件触发),Memory Protection Read.
    • TIN = 3 : MPW(同步、硬件触发),Memory Protection Write.
    • TIN = 4 : MPX(同步、硬件触发),Memory Protection Execution.
    • TIN = 5 : MPP(同步、硬件触发),Memory Protection Peripheral Access.
    • TIN = 6 : MPN(同步、硬件触发),Memory Protection Null Address.
    • TIN = 7 : GRWP(同步、硬件触发),Global Register Write Protection.
  • Class 2 — Instruction Errors:

    • TIN = 1 : IOPC(同步、硬件触发),Illegal Opcode.
    • TIN = 2 : UOPC(同步、硬件触发),Unimplemented Opcode.
    • TIN = 3 : OPD(同步、硬件触发),Invalid Operand specification.
    • TIN = 4 : ALN(同步、硬件触发),Data Address Alignment.
    • TIN = 5 : MEM(同步、硬件触发),Invalid Local Memory Address
  • Class 3 — Context Management:

    • TIN = 1 : FCD(同步、硬件触发),Free Context List Depletion (FCX = LCX)
    • TIN = 2 : CDO(同步、硬件触发),Call Depth Overflow.
    • TIN = 3 : CDU(同步、硬件触发),Call Depth Underflow.
    • TIN = 4 : FCU(同步、硬件触发),Free Context List Underflow (FCX = 0).
    • TIN = 5 : CSU(同步、硬件触发),Call Stack Underflow (PCX = 0).
    • TIN = 6 : CTYP(同步、硬件触发),Context Type (PCXI.UL wrong).
    • TIN = 7 : NEST(同步、硬件触发),Nesting Error: RFE with non-zero call depth.
  • Class 4 — System Bus and Peripheral Errors:

    • TIN = 1 : PSE(同步、硬件触发),Program Fetch Synchronous Error.
    • TIN = 2 : DSE(同步、硬件触发),Data Access Synchronous Error.
    • TIN = 3 : DAE(异步、硬件触发),Data Access Asynchronous Error.
    • TIN = 4 : CAE(异步、硬件触发),Coprocessor Trap Asynchronous Error.
    • TIN = 5 : PIE(同步、硬件触发),Program Memory Integrity Error.
    • TIN = 6 : DIE(异步、硬件触发),Data Memory Integrity Error.
    • TIN = 7 : TAE(异步、硬件触发),Temporal Asynchronous Error
  • Class 5— Assertion Traps:

    • TIN = 1 : OVF(同步、软件触发),Arithmetic Overflow.
    • TIN = 2 : SOVF(同步、软件触发),Sticky Arithmetic Overflow
  • Class 6 — System Call

    • TIN = X : SYS(同步、软件触发),System Call。TIN 取自 SYSCALL 指令中指定的立即数常量[0-255]。
  • Class 7 — Non-Maskable Interrupt

    • TIN = 1 : NMI(异步、硬件触发),Non-Maskable Interrupt.

1.1 同步陷阱(Synchronous Traps)

同步陷阱与特定指令的执行或尝试执行相关,或者与访问需要内存管理系统介入的虚拟地址相关。触发陷阱的指令是精确可识别的。陷阱会立即触发,并且在处理完成之前,执行不会继续超出该指令。

1.2 异步陷阱(Asynchronous Traps)

异步陷阱类似于中断,因为它们与外部检测到的硬件条件相关,并且会反馈到 CPU 。
有些异步陷阱是间接由先前执行的指令导致的,但与这些指令的直接关联已经丢失。
其它异步陷阱,例如不可屏蔽中断(NMI),属于外部事件。
异步陷阱与中断的区别在于:它们通过陷阱向量而不是中断向量进行路由。它们不能被屏蔽,并且不会改变当前 CPU 的中断优先级。

1.3 硬件陷阱(Hardware Traps)

硬件陷阱是由硬件检测到的异常条件触发的。在大多数情况下,这些异常条件与尝试执行某个指令相关。常见的例子包括非法指令陷阱、内存保护陷阱和数据内存未对齐陷阱。

1.4 软件陷阱(Software Traps)

软件陷阱是执行系统调用或断言指令的有意结果。受支持的断言指令包括TRAPV(溢出陷阱)和TRAPSV(粘性溢出陷阱)。系统调用由SYSCALL 指令触发。

1.5 不可恢复的陷阱(Unrecoverable Traps)

不可恢复的陷阱是软件无法恢复的错误,即触发陷阱的任务无法简单地重新启动。 在 TriCore 体系结构中,FCU(一个致命上下文异常)是一种不可恢复的错误。

2 陷阱处理(Trap Handling)

陷阱处理机制对陷阱采取的操作与对外部或软件中断采取的操作略有不同。处理陷阱时,不会改变 CPU 的中断优先级,因此 ICR.CCPN 字段不会被更新

2.1 陷阱向量格式(Trap Vector Format)

陷阱处理程序向量,存储在代码存储器中的 陷阱向量表(Trap Vector Table)中。BTV(Base Trap Vector)寄存器的值指定了陷阱向量表的基地址。 这些向量由多个短代码段组成,每段代码之间间隔八个字。 如果陷阱处理程序较短,则可能完全适应向量代码段中的八个字。如果它不能完全适应,则应包含一些初始指令,并随后跳转到完整的处理程序代码。

2.2 访问陷阱向量表(Accessing the Trap Vector Table)

当发生陷阱时,硬件会生成一个 陷阱标识符(Trap Identifier),该标识符由两个组成部分构成:

  • 陷阱类别编号(TCN,Trap Class Number),用于索引陷阱向量表。
  • 陷阱识别编号(TIN,Trap Identification Number),该编号会被加载到数据寄存器 D[15]。

陷阱类别编号会左移 5 位,然后与 BTV 寄存器中的地址进行 OR 运算,以生成陷阱处理程序的入口地址。

2.3 返回地址(Return Address, RA)

返回地址保存在 A[11] 寄存器中。对于大多数同步陷阱,返回地址是触发陷阱的指令所在的 PC(程序计数器)。仅 SYS 陷阱和 FCD 陷阱有所不同:

  • 对于 SYS 陷阱(由 SYSCALL 指令触发),返回地址指向 SYSCALL 之后的下一条指令。
  • 对于 FCD 陷阱,FCD Trap会在触发上下文保存指令完成后立刻触发。因此,FCD 陷阱的返回地址(Return Address)将会是:陷阱、 中断 或 被调用例程的第一条指令,或者 SVLCX 或 BISR 指令后面的指令(这样,在FCD trap处理中,通过合适的扩容,可以正常返回,并继续正常执行)。

对于异步陷阱,返回地址是如果未发生该陷阱,接下来应该执行的指令地址。 中断的返回地址规则与异步陷阱相同

2.4 陷阱向量表(Trap Vector Table)

所有陷阱服务程序(Trap Service Routine,TSR)的入口点都存储在内存中的 陷阱向量表(Trap Vector Table)。 BTV 寄存器用于指定陷阱向量表的基地址,它可以分配到任何可用的代码存储器中。
在系统初始化阶段,可以使用 MTCR 指令修改 BTV 寄存器(该寄存器受 ENDINIT 保护)。 这种机制使得系统可以有多个陷阱向量表,并且可以通过修改 BTV 寄存器内容在它们之间切换。

当陷阱事件发生时,硬件检测到该事件并生成陷阱标识符。 陷阱标识符由 陷阱类别编号(TCN)和 陷阱识别编号(TIN)组成:TCN 左移 5 位,然后与 BTV 寄存器中的地址进行 OR 运算,以形成 TSR 的入口地址。因此,建议在 BTV 寄存器的位 [7:5] 设为 0,如下图:

BTV 寄存器的位 0 始终为 0,不可写入(指令必须对齐到偶数字节边界)。

左移 TCN 5 位会创建在陷阱向量表中的条目,且条目之间间隔 8 个字。 如果陷阱处理程序 TSR 很短,它可能完全适应 陷阱向量表条目中的 8 个字。 否则,进入点代码必须最终跳转到存储器中其余部分的 TSR 代码。

与 中断向量表(Interrupt Vector Table)不同,陷阱向量表中的条目不能跨越多个存储单元。(Trap 机制都是启用状态,且不可关闭,不能像中断系统一样,关闭一些不使用的中断)

2.5 陷阱发生时的初始状态(Initial State upon a Trap)

当发生陷阱时,初始状态定义如下:

  • 上层上下文被保存。
  • 返回地址存储到 A[11] 并更新。
  • 陷阱识别编号(TIN)加载到 D[15]。
  • 如果处理器之前没有使用中断堆栈(PSW.IS = 0),则堆栈指针 A[10] 被设置为 中断堆栈指针(ISP)。同时,堆栈指针位被设置,表示使用中断堆栈:PSW.IS = 1。
  • I/O 模式被设置为监督模式,即所有权限均被启用:PSW.IO = 10B
  • 当前保护寄存器组(PRS)被设置为 0:PSW.PRS = 000B
  • 调用深度计数器(CDC)被清除,并且调用深度限制设为 64:PSW.CDC = 0000000B
  • 调用深度计数器启用:PSW.CDE = 1。
  • PSW 安全位被设置为 SYSCON 寄存器定义的值:PSW.S = SYSCON.TS。
  • 对全局寄存器 A[0]、A[1]、A[8]、A[9] 的写入权限被禁用:PSW.GW = 0。
  • 中断系统被全局禁用:ICR.IE = 0。旧的 ICR.IE 和 ICR.CCPN 被分别保存到 PCXI.PIE 和 PCXI.PCPN。ICR.CCPN 不变
  • 陷阱向量表被访问,以获取对应陷阱处理程序的第一条指令。

尽管陷阱不会改变 ICR.CCPN,但它们的处理程序仍然在禁用中断的情况下开始执行,因此可以执行关键的初始操作,直到显式重新启用中断。

对于不可恢复的 FCU 陷阱,其初始状态有所不同:上层上下文无法保存。仅保证以下状态:

  • 陷阱识别编号(TIN) 被加载到 D[15]。
  • 如果处理器之前没有使用中断堆栈(PSW.IS = 0),则堆栈指针 A[10] 被设置为 中断堆栈指针(ISP)。
  • I/O 模式 被设置为 监督模式(所有权限均启用):PSW.IO = 10B
  • 当前保护寄存器组 被设置为 0:PSW.PRS = 000B。
  • PSW 安全位 被设置为 SYSCON 寄存器定义的值:PSW.S = SYSCON.TS。
  • 中断系统被全局禁用:ICR.IE = 0,ICR.CCPN 保持不变。
  • 陷阱向量表 被访问,以获取 FCU 陷阱处理程序的第一条指令。