简介:主要是翻译架构文档的Trap内容,有些专业用词解释不通可以参考英文文档。
1、Trap系统
陷阱是由非屏蔽中断(NMI)、指令异常、内存管理异常或非法访问等事件引起的。陷阱总是活跃的;它们不能被软件操作禁用。
本章介绍了可能发生的不同陷阱以及TriCore®体系结构的陷阱处理机制。
1.1、Trap类型
TriCore体系结构为陷阱指定了八个通用类。每个类都有自己的陷阱处理程序,通过每个条目32字节的陷阱向量访问,该向量由硬件定义的陷阱类编号索引。在每个类中,特定陷阱通过陷阱识别号(TIN)来区分,该陷阱识别号在陷阱处理程序的第一条指令执行之前由硬件加载到寄存器D[15]中。陷阱处理程序必须对D[15]中的值进行测试和分支,才能到达特定TIN的子处理程序。
陷阱可以进一步分类为同步或异步,以及硬件或软件生成。下表列出了陷阱类别,总结并分类了每个类别中预定义的一组特定陷阱。
下表中:TIN=Trap识别号/Synch.=同步/Asynch.=异步/HW=硬件/SW=软件。
1.1.1 同步Trap
同步陷阱与特定指令的执行或尝试执行相关联,或者与访问需要存储器管理系统干预的虚拟地址的尝试相关联。导致陷阱的指令是精确已知的。陷阱会立即被捕获并在执行超出该指令之前提供服务。
1.1.2 异步Trap
异步陷阱与中断类似,因为它们与外部检测到的硬件条件相关,并用信号发送回内核。有些指令是由先前执行的指令间接产生的,但与这些指令的直接关联已经丢失。其他事件,如非屏蔽中断(NMI),是外部事件。异步陷阱和中断之间的区别在于,异步陷阱是通过陷阱向量而不是中断向量路由的。它们不能被屏蔽,也不会改变当前的CPU中断优先级。
1.1.3 硬件Trap
硬件陷阱是响应于硬件检测到的异常条件而生成的。在大多数情况下,但不是所有情况下,异常条件都与特定指令的尝试执行相关联。
例如非法指令陷阱、内存保护陷阱和数据内存错位陷阱。在MMU陷阱(陷阱类0)的情况下,异常条件是找不到指令引用的虚拟页的TLB(Translation Lookaside Buffer)条目(VAF陷阱),或者该页的访问违规(VAP陷阱)。
1.1.4 软件Trap
软件陷阱是作为执行系统调用或断言指令的有意结果而生成的。支持的断言指令是TRAPV(Trap on overflow)和TRAPSV(Trap on stick overflow)。系统调用由SYSCALL指令生成。系统调用陷阱在第11页的“系统调用(陷阱类别6)”中有进一步描述。
1.1.5 无法恢复的Trap
不可恢复的陷阱是指软件无法从中恢复的陷阱;即引发陷阱的任务不能简单地重新启动。
在TriCore体系结构中,FCU(致命的上下文陷阱)是一个不可恢复的错误。有关更多信息,请参见第9页的“FCU-自由上下文列表不足(TIN 4)”。
1.2、Trap处理
Trap处理机制对Trap采取的操作与对外部或软件中断采取的操作略有不同。Trap不会改变CPU中断优先级,因此ICR.CCPN字段未更新。参见第12页的“异常优先级”。
1.2.1、Trap向量格式
Trap处理程序向量存储在Trap向量表的代码内存中。BTV寄存器指定Trap向量表的基址。矢量由多个短代码段组成,由八个单词均匀隔开。
如果Trap处理程序很短,它可能完全适合矢量代码段中可用的八个字。如果它不适合矢量代码段,那么它应该包含一些初始指令,然后跳转到处理程序的其余部分。
1.2.2、访问Trap向量表
当Trap发生时,硬件会生成Trap标识符。Trap标识符有两个组成部分:
- 用于索引Trap矢量表的Trap类别编号(TCN)。
- 加载到数据寄存器D[15]中的Trap识别号(TIN)。
Trap类编号左移五位,并与BTV寄存器中的地址进行“或”运算,以生成Trap处理程序的入口地址。
1.2.3、返回地址(RA)
返回地址保存在返回地址寄存器A[11]中。
对于同步Trap,返回地址是导致Trap的指令的PC。只有SYS Trap和FCD Trap不同。在由SYSCALL指令触发的SYS Trap上,返回地址指向紧接在SYSCALL之后的指令。FCD陷阱的行为在第8页的“FCD-无上下文列表消耗(TIN 1)”中进行了描述。
对于异步Trap,如果没有采用异步Trap,则返回地址是下一步执行的指令的地址。中断的返回地址遵循相同的规则。
1.2.4、Trap向量表
所有Trap服务例程的入口点都存储在Trap向量表的内存中。BTV寄存器指定存储器中Trap矢量表的基址。它可以分配给任何可用的代码存储器。在系统初始化阶段,可以使用MTCR指令修改BTV寄存器(BTV寄存器受ENDINIT报护)。这种布置使得可以具有多个Trap矢量表,并通过改变BTV寄存器的内容在它们之间切换。
当Trap事件发生时,由检测该事件的硬件生成Trap标识符。Trap标识符由Trap类别号(TCN)和Trap标识号(TIN)组成。
TCN被左移五位,并与BTV寄存器中的地址进行“或”运算,以形成TSR的入口地址。由于此操作,建议将寄存器BTV的位[7:5]设置为0(见图24)。请注意,BTV寄存器的位0始终为0,并且不能写入(指令必须在偶数字节边界上对齐)。
将TCN左移5位将在Trap Vector Table中创建平均间隔8个字的条目。如果Trap处理程序(TSR)很短,它可能完全适合陷阱向量表条目中可用的八个字。否则,入口点处的代码最终必须导致跳转到内存中其他位置的TSR的其余部分。
与中断矢量表不同,Trap矢量表中的条目不能跨越。
1.2.5、Trap的初始化
Trap发生时的初始状态定义如下:
- 上层上下文已保存。
- 更新了A[11]中的返回地址。
- TIN加载到D[15]中。
- A[10]中的堆栈指针被设置为中断堆栈指针(ISP),当处理器以前没有使用中断堆栈(在PSW.IS=0的情况下)。堆栈指针位设置为使用中断堆栈:PSW.IS = 1。
- I/O模式设置为Supervisor模式,这意味着所有权限都已启用:PSW.IO=10B。
- 当前保护寄存器集设置为0:PSW.PRS=000B。
- 清除调用深度计数器(CDC),并将调用深度限制设置为64:PSW。CDC=0000000 b。
- 调用深度计数器已启用,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保持不变。
- 访问Trap向量表以获取Trap处理程序的第一条指令。
尽管Trap离开ICR.CCPN没有改变,它们的处理程序仍然在禁用中断的情况下开始执行。他们因此可以在没有中断的情况下执行关键的初始操作,直到它们专门重新启用中断。
对于不可恢复的FCU Trap,初始状态不同。无法保存上层上下文。只有
保证以下状态:
- TIN加载到D[15]中。
- A[10]中的堆栈指针被设置为中断堆栈指针(ISP),当处理器以前没有
使用中断堆栈(在PSW.IS == 0的情况下)。 - I/O模式设置为Supervisor模式(所有权限都已启用:PSW.IO=10B)。
- 当前保护寄存器集设置为0:PSW.PRS=000B。
- PSW安全位设置为SYSCON寄存器中定义的值:PSW.S=SYSCON.TS。
- 中断系统被全局禁用:ICR.IE = 0。ICR.CCPN保持不变。
- 访问陷阱矢量表以获取FCU陷阱处理程序的第一条指令。
1.3、Trap描述
以下小节描述了第1页表8“支持的陷阱”中列出的Trap类和特定Trap。
1.3.1、MMU Traps (Trap类0)
对于那些包括内存管理单元(MMU)的实现,陷阱类0是为MMU陷阱保留的。这一类中有两个陷阱,VAF和VAP。
- VAF-虚拟地址填充(TIN 0)
当MMU被启用并且指令引用的虚拟地址在MMU翻译后备缓冲区(TLB)中没有页条目时,会生成VAF陷阱。 - VAP-虚拟地址保护(TIN 1)
VAP陷阱是由经历PTE保护设置不允许的PTE转换的存储器访问生成的(当MMU被启用时),或者由对不具有特权外围属性的上段的User-0模式访问生成的。
1.3.2、内部保护Trap(Trap类1)
Trap类1适用于与内部保护系统相关的Trap。此类内存保护陷阱MPR、MPW和MPX适用于基于范围的保护系统,独立于陷阱类0的基于页面的VAP保护陷阱。有关更多详细信息,请参阅第1页的“内存保护系统”一章。
所有内存保护陷阱(MPR、MPW、MPX、MPP和MPN)都基于经过直接转换的虚拟地址。
定义了以下内部保护陷阱:
- PRIV-违反特权(TIN 1)
以用户模式之一(用户-0或用户-1模式)执行的程序试图执行该模式不允许的指令。
本手册第2卷的“指令集”一章提供了一个仅限于Supervisor模式或User-1模式的指令表。 - MPR-内存读保护(TIN 2)
当启用内存保护系统并且加载、LDMST、SWAP或ST.T指令的有效地址不在启用读取权限的任何范围内时,会生成MPR陷阱。当上下文保存/还原操作期间发生访问冲突时,不会生成此陷阱。 - MPW-内存写保护(TIN 3)
当启用内存保护系统,并且存储、LDMST、SWAP或ST.T指令的有效地址不在启用写权限的任何范围内时,就会生成MPW陷阱。 - MPX-内存保护执行(TIN 4)
当启用内存保护系统并且PC不在启用执行权限的任何范围内时,就会生成MPX陷阱。 - MPP-内存保护外设访问(TIN 5)
在用户-0模式下执行的试图加载或存储对段的访问的程序被配置为外围段。请参阅第3页的“物理内存属性(PMA)”。 - MPN-内存保护空地址(TIN 6)
每当任何程序尝试对有效地址0进行加载/存储操作时,都会生成MPN Trap。 - GRWP-全局寄存器写保护(TIN 7)
程序试图修改全局地址寄存器之一(A[0]、A[1]、A[8]或A[9]),但没有权限这样做。
1.3.3、指令错误(Trap类2)
Trap类2用于发出各种类型的指令错误的信号。指令错误包括指令操作码、指令操作数编码或内存访问操作数地址中的错误。
- IOPC-不合理操作码(TIN 1)
遇到无效的指令操作码。无效操作码是指与实现中已知的任何指令都不对应的操作码。 - UOPC-未实现操作码(TIN 2)
遇到未实现的操作码。未实现的操作码对应于未在给定硬件实现中实现的已知指令。该指令可以通过Trap处理程序中的软件仿真来实现。
UOPC条件示例如下:
•如果MMU不存在,则为MMU指令。
•如果FPU不存在,则为FPU指令。
•如果外部协处理器不存在,则为外部协处理器指令。 - OPD-无效的操作数(TIN 3)
如果操作数说明符为奇数,则将奇偶寄存器对作为操作数的指令可能会引发OPD陷阱。对于操作数无效的其他情况,也可能引发OPD陷阱。
在体系结构上不需要实现来引发此Trap,并且可能以实现定义的方式处理无效操作数。 - ALN-数据访问对齐(TIN 4)
当数据内存操作的地址不符合所需的对齐规则时,将引发ALN Trap。有关这些规则的更多信息,请参见第4页的“对齐要求”。当循环缓冲区的大小、长度或索引不正确时,也会引发ALN Trap。有关更多详细信息,请参阅第9页的“循环寻址”。 - MEM-无效内存寻址(TIN 5)
当可以确定访问的地址违反体系结构约束或实现约束时,会引发MEM Trap。
定义的MEM Trap子类是不同的分段、分段交叉、CSFR访问、CSA限制和划痕范围。
一个实现必须定义它将引发哪个实现约束MEM Trap,或者如果没有引发MEM Trap则定义替代行为。它还必须记录它将提出的任何其他特定于实现的MEM Trap。
将引发MEM Trap的架构约束包括:
•将偏移量添加到基地址的寻址模式会导致有效地址位于与基地址不同的段中(不同的段)。
•使用地址访问数据元素,使数据对象跨越一个段的末尾和另一段的开头(段交叉)
可能引发MEM陷阱的实施约束包括
•内存地址用于访问核心SFR(CSFR),而不是使用MTCR/MFCR指令(CSFR访问)
•内存地址用于CSA访问,将CSA放置在那里对实施无效(CSA限制)
•尝试使用位于内存实现区域之外的内存地址访问暂存内存(暂存范围错误)。
1.3.4、上下文管理(Trap类3)
Trap类3适用于上下文管理子系统在执行(或试图执行)与函数调用、中断、陷阱和返回相关的上下文保存和恢复操作过程中检测到的异常情况。
- FCD-空闲上下文链表耗尽(TIN 1)
FCD Trap是在上下文保存操作之后生成的,当该操作导致空闲上下文列表变为“几乎为空”时。当用于保存操作的CSA是上下文列表限制寄存器LCX所指向的CSA时,会发出“几乎为空”条件的信号。负责上下文保存的操作正常完成,然后获取FCD Trap。
如果负责上下文保存的操作是硬件中断或Trap输入序列,则在执行原始中断或Trap处理程序的第一条指令之前,将输入FCD Trap处理程序。FCD Trap的返回地址将指向中断或Trap处理程序的第一条指令。
通常期望FCD Trap处理程序采取某种形式的操作来纠正上下文列表耗尽。该操作的性质取决于操作系统,但通常的选择是为CSA存储分配额外的内存,或者终止一个或多个任务,并将其调用链上的CSA返回到空闲列表。第三种可能性不是直接终止任何任务,而是将一个或多个非活动任务的调用链复制到不能直接用于CSA存储的未缓存的外部或辅助存储器,并将复制的CSA释放到空闲列表。在这种情况下,操作系统任务调度程序需要识别非活动任务的调用链不存在于CSA存储中,并在调度任务之前将其恢复。
FCD Trap本身在LCX寄存器指定的CSA之外使用一个额外的CSA,因此LCX不能指向自由上下文列表上的实际最后一个条目。此外,在采取FCD Trap后,可能会报告异步Trap情况,如外部总线错误,从而中断FCD Trap处理程序并使用一个以上CSA。因此,为了避免上下文列表下溢的可能性,空闲上下文列表必须至少包括两个CSA,而不是LCX寄存器所指向的CSA。如果FCD Trap处理程序进行任何调用,则需要额外的CSA预留。
为了使异步Trap的Trap处理程序能够识别何时中断了FCD Trap处理程序,每当生成FCD Trap时,都会设置SYSCON(系统配置)寄存器中的FCDSF标志。FCDSF位应该由处理程序测试,以确定在处理FCD Trap时可能采用的任何异步Trap。如果发现该位已设置,异步陷阱处理程序必须避免进行任何调用,但应以某种方式排队,使操作系统能够识别出发生了Trap。然后,它应该立即返回到中断的FCD Trap处理程序。参见第13页的“系统控制寄存器(SYSCON)”。 - CDO - 调用深度溢出(TIN 2)
程序试图在调用深度计数器启用且调用深度计数值(PSW.CDC.COUNT)为最大值的情况下执行CALL指令。调用深度计数通过使操作系统能够检测执行任务中的“失控递归”来防止上下文列表耗尽。 - CDU-调用深度不足(TIN 3)
一个程序试图在调用深度计数器启用且调用深度计数值(PSW.CDC.COUNT)为零的情况下执行RET(返回)指令。调用深度下溢并不一定反映当前执行任务中的软件错误。操作系统可以通过使用故意缩小的调用深度计数器,并在每个调用深度上溢或下溢陷阱上为当前任务递增或递减单独的软件计数器,来实现更精细的调用深度计数。只有当CDU Trap发生时软件计数器已经为零时,才会显示程序错误。 - FCU - 空闲上下文列表下溢 (TIN 4)
当试图执行上下文保存操作,但发现空闲上下文列表为空(即FCX寄存器内容为空)时,会使用FCU陷阱。如果在上下文保存或还原操作过程中遇到任何错误,也会使用FCU陷阱。无法完成上下文操作。相反,强制跳转到FCU陷阱处理程序,并用FCU TIN值更新D15。当FCU条件发生时,任何未决的异步异常都可能丢失。
如果未能完成上下文保存或还原,则体系结构状态将丢失,因此FCU陷阱的出现是不可恢复的系统错误。FCU陷阱处理程序最终应启动系统重置。 - CSU - 调用栈下溢 (TIN 5)
当尝试执行上下文还原操作并且PCX寄存器的内容为null时引发。此陷阱表示任务设置中的系统软件错误(内核或操作系统)或软件管理任务(SMT)之间的上下文切换。用户任务中的任何软件错误或错误组合都不会产生这种情况,除非该任务已被允许对上下文保存区域进行写权限,这本身就可以被视为系统软件错误。 - CTYP - 上下文类型 (TIN 6)
当试图执行上下文还原操作但上下文类型为时引发,如PCXI.UL位对于尝试的恢复类型是不正确的;即当PCXI.UL1,或者在PCXI.UL0。与CSU陷阱一样,这表示上下文列表管理中存在系统软件错误。 - NEST - 嵌套错误 (TIN 7)
程序试图在调用深度计数器启用且调用深度计数值(PSW.CDC.COUNT)为非零的情况下执行RFE(异常返回)指令。中断或陷阱处理程序的返回通常应该发生在中断或陷阱处理器本身的主体中,或者发生在处理程序分支到的代码中,而不是从处理程序调用的代码中。如果不是这样的话,在合法发布RFE之前,剩余调用链上将有一个或多个保存的上下文必须弹出并返回到空闲列表。
1.3.5、系统总线和外设错误 (Trap 类4)
- PSE - 程序获取同步错误(TIN 1)
PSE陷阱在以下情况下升起:
- 由于指令获取,出现总线错误1。
- 指令获取的目标段不具有代码获取属性。请参阅“物理内存
属性(PMA)”。
- DSE - 数据访问同步错误 (TIN 2)
DSE陷阱在以下情况下升起:
- 每当由于数据加载操作而发生总线错误时。
- 在从数据暂存RAM(DSPR)(第5页的“暂存RAM”)加载或存储数据的情况下,访问超出了内存范围的末尾。
- 如果在数据缓存重新填充的数据加载阶段出现错误。
注意:DSE有一些与实现相关的寄存器,可以对这些寄存器进行查询,以更准确地确定错误的来源。有关更多详细信息,请参阅用户手册了解特定的TriCore实现。
- DAE - 数据访问异步错误 (TIN 3)
当内存系统报告无法立即链接到当前执行的指令的错误时,会引发DAE陷阱。一般来说,这意味着系统总线上从外设或外部存储器返回的错误。
出现以下情况时,会引发此DAE陷阱:
- 由于数据存储操作,出现总线错误。
- 存在由缓存管理指令引起的错误。
- 存在由缓存线写回引起的错误。
注意:DAE有一些与实现相关的寄存器,可以查询这些寄存器以更准确地确定错误源。有关更多详细信息,请参阅用户手册了解特定的TriCore实现。
- CAE-协处理器陷阱异步错误(TIN 4)
这个CAE异步陷阱是由协处理器生成的,用于报告错误。
可能导致CAE陷阱的典型错误的例子是未实现的协处理器指令和算术错误(例如在浮点单元中发现的)。
CAE在给定系统中的所有协处理器之间共享。因此,陷阱处理程序必须检查所有协处理器,以确定陷阱的原因。 - PIE-程序内存完整性错误(TIN 5)
每当在指令提取中检测到不可纠正的内存完整性错误时,就会引发PIE陷阱。陷阱与错误指令同步。如果提取组中的任何元素包含不可恢复的错误,则会引发PIE陷阱。不需要硬件将错误定位到特定指令。
一种实现方式可以提供额外的寄存器,这些寄存器可以被询问以更精确地确定错误的源。有关更多详细信息,请参阅Tricore具体实施的用户手册。 - DIE-数据存储器完整性错误(TIN 6)
每当在数据访问中检测到不可校正的存储器完整性错误时,就会引发DIE陷阱。
实现可以选择将DIE陷阱实现为异步或同步陷阱。
如果加载或存储访问的任何元素包含不可纠正的错误,则引发DIE陷阱。不需要硬件将错误定位到操作的访问宽度。上下文操作期间引发的DIE陷阱可能导致数据丢失。
一种实现方式可以提供额外的寄存器,这些寄存器可以被询问以更精确地确定错误的源。有关更多详细信息,请参阅Tricore具体实施的用户手册。 - TAE-时间异步错误(TIN 7)
每当活动计时器减至零时,时间保护系统就会引发TAE异步陷阱。这可以用于防止时间关键型应用程序中的任务溢出。
1.3.6、断言陷阱(Trap 类5)
- OVF-算术溢出(TIN 1)
如果设置了PSW中的溢出位(PSW.V==1),则由TRAPV指令引发。 - SOVF-粘性算术溢出(TIN 2)
如果设置了PSW中的粘性溢出位(PSW.SV==1),则由TRAPSV指令引发。
1.3.7、系统调用 (Trap 类6)
- SYS-系统调用(TIN=SYSCALL中的8位无符号立即数常量)
SYS陷阱在执行SYSCALL指令后立即引发,以启动系统调用。捕获陷阱时加载到D[15]中的TIN不是固定的,而是在SYSCALL指令中指定为8位无符号立即数常量。返回地址指向SYSCALL之后的指令。
1.3.8、不可屏蔽中断(Trap 类7)
- NMI - 不可屏蔽中断(TIN 0)
引发不可屏蔽中断的原因取决于实现。通常,有一个外部引脚可用于向NMI发出信号,但它也可以响应看门狗定时器中断或即将发生的电源故障等情况而升高。有关更多详细信息,请参阅用户手册了解特定的TriCore实现。
1.3.9、Debug Trap
- BBM-接通前断开/BAM-接通后断开
有关调试陷阱的信息,请参阅“核心调试控制器”一章。请参阅第1页的“核心调试控制器”。