trap是由于诸如不可屏蔽中断(NMI)、指令异常、内存管理异常或非法访问等事件而发生的。trap总是活跃的,它们不能通过软件操作禁用。本文描述了可能发生的不同trap和TriCore架构的trap处理机制。
一、 Trap 类型
TriCore体系结构为陷阱指定了8个通用类。每个类都有自己的trap处理程序,通过每个条目32字节的trap向量进行访问,并根据硬件定义的trap类号进行索引。在每个类中,通过陷阱识别码(TIN)来区分特定的陷阱,在执行陷阱处理程序的第一条指令之前,这个识别码由硬件加载到寄存器D[15]中。Trap处理程序必须对d[15]中的值进行测试和分支,以到达特定TIN的子处理程序。Trap可以进一步分为同步或异步,以及硬件或软件生成
1、 同步 Traps
同步陷阱与执行或尝试执行特定指令有关,或者与尝试访问需要内存管理系统干预的虚拟地址有关。引起陷阱的指令是已知的。在执行超出该指令之前,立即捕获并处理陷阱。
2 、异步 Traps
异步陷阱类似于中断,因为它们与外部检测到的硬件条件相关联,并向核心发送信号。有些结果是由先前执行的指令间接产生的,但与这些指令的直接联系已经丢失。其他的,如不可屏蔽中断(NMI),是外部事件。异步陷阱和中断之间的区别在于异步陷阱是通过陷阱向量而不是中断向量路由的。它们不能被屏蔽,也不会改变当前CPU中断优先级。
3 、硬件 Traps
硬件陷阱是为响应硬件检测到的异常情况而生成的。在大多数情况下,但不是所有情况下,异常条件都与尝试执行特定指令有关。
例如非法指令陷阱、内存保护陷阱和数据内存错位陷阱。在MMU trap (trap类0)的情况下,异常条件要么是无法找到由指令引用的虚拟页的TLB (Translation Lookaside Buffer)条目(VAF trap),要么是该页的访问冲突(VAP trap)。
4 、软件 Traps
软件陷阱是在执行系统调用或断言指令时故意产生的。支持的断言指令有TRAPV (Trap on overflow)和TRAPSV (Trap on sticky overflow)。系统调用由sycall指令生成。系统调用陷阱在第11页的“系统调用(陷阱6类)”中有进一步的描述。
5 、不可恢复 Traps
不可恢复的陷阱是指软件无法从中恢复的陷阱;也就是说,引发trap的任务不能简单地重新启动。在TriCore体系结构中,FCU(致命上下文陷阱)是一种不可恢复的错误。
二、 Trap Handling
陷阱处理机制对陷阱采取的操作与对外部或软件中断采取的操作略有不同。trap不会改变CPU的中断优先级,所以没有更新ICR.CCPN字段。
1 、Trap 矢量格式
陷阱处理程序向量存储在陷阱向量表中的代码内存中。BTV寄存器指定Trap向量表的基址。这些向量由许多短代码段组成,平均间隔8个单词。如果一个陷阱处理程序非常短,它可能完全适合在矢量代码段中可用的八个字。如果它不适合向量代码段,那么它应该包含一些初始指令,然后跳转到处理程序的其余部分。
2 访问 Trap 矢量表
当trap发生时,硬件会生成一个trap标识符。trap标识符有两个组成部分:Trap类号(TCN)用于索引Trap向量表。陷阱识别号(TIN),它被载入数据寄存器D[15]。Trap类号左移5位,与BTV寄存器中的地址对齐,生成Trap处理程序的入口地址。
3 返回地址 (RA)
返回地址保存在返回地址寄存器A[11]中。对于同步陷阱,返回地址是引起陷阱的指令所在的PC。只有SYS trap和FCD trap不同。在由SYSCALL指令触发的SYS陷阱中,返回地址指向紧跟在SYSCALL之后的指令。对于异步陷阱,返回地址是如果异步陷阱没有被捕获,下一个将被执行的指令的返回地址。中断的返回地址也遵循同样的规则。
4 Trap 矢量表
所有Trap服务例程的入口点都存储在Trap向量表的内存中。BTV寄存器指定内存中Trap向量表的基址。它可以分配给任何可用的代码内存。BTV寄存器可以在系统初始化阶段使用MTCR指令进行修改(BTV寄存器受ENDINIT保护)。这种安排使得可以有多个陷阱向量表,并通过改变BTV寄存器的内容在它们之间切换。当发生trap事件时,检测到该事件的硬件产生一个trap标识符。trap标识符由trap Class Number (TCN)和trap Identification Number (TIN)组成。TCN与BTV寄存器中的地址左移5位,形成TSR的入口地址。由于这个操作,建议将寄存器BTV的位[7:5]设置为0。注意,BTV寄存器的第0位始终为0,不能写入(指令必须在偶数字节边界上对齐)。
将TCN左移5位会在Trap Vector Table中创建等距8个单词的条目。如果一个trap处理程序(TSR)非常短,它可能完全适合在trap Vector Table条目中可用的八个单词。否则,入口点的代码最终必须跳转到驻留在内存其他地方的TSR的其余部分。
与中断向量表不同,Trap向量表中的表项不能被跨越。
Trap向量表项地址计算
5 Trap 初始状态
trap发生时的初始状态定义如下:
保存上层上下文。
更新了A[11]中的返回地址。
TIN被加载到d[15]。
当处理器以前没有使用中断堆栈(PSW.IS=0的情况下)时,[10]中的堆栈指针被设置为中 断堆栈指针(ISP)。堆栈指针位设置为使用中断堆栈:PSW.IS=1。
I/O模式设置为Supervisor模式,即开启所有权限:PSW.IO = 10B。
当前保护寄存器设置为0:PSW.PRS=000B。
CDC (Call Depth Counter)被清除,呼叫深度限制设置为64:PSW。
开启“呼叫深度计数器”。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的情况下)时,[10]中的堆栈指针被设 置为中断堆栈指针(ISP)
I/O模式设置为Supervisor模式(开启所有权限:PSW.IO = 10B)
当前保护寄存器设置为0:PSW.PRS = 000B
PSW安全位设置为SYSCON寄存器中定义的值:PSW.S = SYSCON.TS
中断系统全局禁用:ICR.IE = 0。ICR.CCPN保持不变
访问陷阱向量表以获取FCU陷阱处理程序的第一条指令
三、Trap描述
下面列出的陷阱类和特定的陷阱。
1 MMU Traps (Trap Class 0)
对于那些包含内存管理单元(MMU)的实现,Trap类0为MMU Trap保留。在这个类中有两个陷阱,VAF和VAP。
VAF—虚拟地址填充(TIN 0)
VAF trap是在MMU启用时产生的,并且由指令引用的虚拟地址在MMU Translation Lookaside Buffer (TLB)中没有页面条目。
VAP-虚拟地址保护(TIN 1)
VAP trap (MMU启用时)是由于PTE保护设置不允许进行PTE转换的内存访问,或者是由于User-0模式访问没有特权外设属性的上层网段而产生的。
2 Internal Protection Traps (Trap Class 1) ![](https://i-blog.csdnimg.cn/blog_migrate/fa83a5d2acb4399adcac5d001caf866e.png)
陷阱类1是用于与内部保护系统相关的陷阱。该类中的内存保护trap MPR、MPW和MPX用于基于范围的保护系统,并且独立于trap类0的基于页面的VAP保护trap。
所有的内存保护trap (MPR、MPW、MPX、MPP和MPN)都是基于经过直接转换的虚拟地址。
定义了以下内部保护陷阱:
私隐-特权违反(TIN 1)
在用户模式(User-0或User-1模式)下执行的程序试图执行该模式不允许的指令。
MPR -内存保护读取(TIN 2)
MPR trap是在内存保护系统使能的情况下,如果load、LDMST、SWAP或ST.T指令的有效地址不在读权限使能的范围内,就会产生该告警。当在上下文保存/恢复操作期间发生访问冲突时,不会产生此trap。
MPW -内存保护写(TIN 3)
MPW trap产生于内存保护系统开启,且存储的有效地址为LDMST、SWAP或ST.T指令不在任何已启用写权限的范围内。
MPX -内存保护执行(TIN 4)
告警解释当内存保护系统使能,且该PC不在任何使能执行权限的范围内时,会产生MPX告警。
内存保护外设访问(TIN 5)
在User-0模式下执行的程序试图对某个段进行加载或存储访问,该程序被配置为外设段。
MPN-内存保护空地址(TIN 6)
每当任何程序试图加载/存储操作到有效地址0时,就会产生MPN陷阱。
全局寄存器写保护(TIN 7)
一个程序试图修改全局地址寄存器(A[0], A[1], A[8]或A[9])中的一个,但它没有权限这样做。
3 Instruction Errors (Trap Class 2)
![](https://i-blog.csdnimg.cn/blog_migrate/5a52ab616f0e7cd79771872366a956e4.png)
4 Context Management (Trap Class 3)
![](https://i-blog.csdnimg.cn/blog_migrate/28c910ec3e1e0edf6bf7ec3fded16576.png)
5 System Bus and Peripheral Errors (Trap Class 4)
![](https://i-blog.csdnimg.cn/blog_migrate/b823f1b6b61ca6e0ea82ad1288bd00d9.png)
6 Assertion Traps (Trap Class 5)
![](https://i-blog.csdnimg.cn/blog_migrate/41245ceadeb87ec2b3430a12410c2bec.png)
7 System Call (Trap Class 6)
![](https://i-blog.csdnimg.cn/blog_migrate/a4e491ca04223c9f3ac25b1b8dcc593d.png)
8 Non-Maskable Interrupt (Trap Class 7) 不可屏蔽
![](https://i-blog.csdnimg.cn/blog_migrate/fac9e8a92327039796cde78a56cbd9ae.png)
9 Debug Traps
四、异常优先级
五、Trap控制寄存器
基本陷阱向量表指针(BTV)
BTV包含trap向量表的基址。当一个trap发生时,trap向量表中的入口地址由该trap的trap类生成,左移5位,然后与BTV寄存器的内容对齐。Trap Class的左移导致向量表中各个条目之间的间距为8个单词(32字节)。
程序同步错误陷阱寄存器(PSTR)
实现可以在PSTR寄存器中提供有关程序同步错误类型的信息。寄存器的内容是特定于实现的。
数据同步错误陷阱寄存器(DSTR)
实现可以提供有关DSTR寄存器中数据同步错误类型的信息。寄存器的内容是特定于实现的。
数据异步错误Trap寄存器(DATR)
实现可以在DATR寄存器中提供有关数据异步错误类型的信息。寄存器的内容是特定于实现的。
数据错误地址寄存器(DEADD)
实现可以提供有关数据错误在DEADD寄存器中的位置的信息。寄存器的内容是特定于实现的。