or1200处理器的异常处理类指令介绍

以下内容摘自《步步惊芯——软核处理器内部设计分析》一书

我们在计算机体系结构的学习中知道:中断实质上包括由外部事件引起的硬中断(又称外中断)和由内部预先安排的特定指令或内部异常引起的软中断(又称内中断或异常)两大类。在OR1200处理器中将中断称之为异常(exception),硬中断是其中的一种异常,当然这只是说法的不同而已。当异常发生时,有关处理器的状态信息被存储到某些寄存器,OR1200处理器转移到事先定义好的一个地址,在那个地址中往往有异常处理例程,在其中进行异常处理,这个地址称为异常处理例程入口地址。OR1200中有32个异常处理例程入口地址,其中明确定义使用了前14个,后18个作为将来扩展使用。异常类型下表所示。

参照计算机体系结构中关于中断的定义,也可以将OR1200中的异常区分为:硬中断、内部异常、特定指令引发的异常。如下:

  • 硬中断:硬复位、计时器中断、外部中断
  • 内部异常:软复位、总线错误、数据页失效、指令页失效、对齐异常、无效指令、数据TLB失靶、指令TLB失靶、溢出
  • 特定指令引发的异常:系统调用、自陷

本章将只对特定指令引发的异常进行分析,其余类型异常在处理器中的处理过程与此类似,将在本书后面对具体模块分析的时候再作讨论,比如:在分析IMMU模块的时候就会讨论指令TLB失靶异常以及指令页失效异常的处理过程。

OR1200中的异常处理过程

当异常发生时,OR1200会进行如下操作:

(1)设置EPCR:如果当前指令不在延迟槽中,那么当前指令(或下一条指令)地址被存储到EPCR寄存器中,如果当前指令在延迟槽中,那么当前指令的上一条转移指令地址被存储到EPCR寄存器中。

(2)设置EEAR:如果发生的异常是总线错误、指令页失效、数据页失效、指令TLB失靶、数据TLB失靶等异常,那么会把例外发生时正在访问的指令或数据的有效地址EA(Effective Address)保存到EEAR寄存器。

(3)保存SR到ESR寄存器。

(4)设置新的SR值:使得IMMU、DMMU都禁用,计时器中断、外部中断也禁止,并且进入特权模式,即设置SR[DME]=0、SR[IME]=0、SR[TEE]=0、SR[IEE]=0、SR[SM]=1。

(5)转移到相应的异常处理例程继续执行。

当异常处理结束后,需要使用指令l.rfe从异常返回,l.rfe指令会将ESR的值恢复到SR,同时将EPCR的值恢复到PC,处理器回到异常发生前的状态继续执行。

此处对异常发生时保存到EPCR、EEAR的值进行说明,如表7.1所示。针对不同的异常类型保存到EPCR的值不同,并且该值与异常发生时处于执行阶段的指令是否位于延迟槽中也有关系。

读者朋友可能会有一个疑问:为什么当异常发生,且处于执行阶段的指令是延迟槽中的指令时保存在EPCR中的返回地址是上一条转移指令的地址呢?这是因为在引入延迟槽之前,处理器执行转移指令的顺序是:

转移指令->转移目标地址的指令

引入延迟槽之后,处理器执行转移指令的顺序是:

转移指令->延迟槽指令->转移目标地址的指令

在中间插入了延迟槽指令,当异常发生,且处于执行阶段的指令是延迟槽中的指令时,如果在EPCR中保存延迟槽指令地址,那么当从异常处理例程返回时,将回到延迟槽指令地址,重新执行的指令顺序是:

延迟槽指令->延迟槽指令的下一条指令

可见没有发生转移,这样就完全不是被打断之前的指令顺序,所以为了恢复原来的指令顺序,在这里将延迟槽之前的转移指令地址保存到EPCR中。

表7.1中还有一列显示异常的优先级,数字越小表示优先级越高,表中的优先级与OR1200手册给的不一样,笔者是从代码中总结出这些优先级的,OR1200手册对各个异常的优先级表述与实现不符。

异常处理类指令说明

OR1200中异常处理类指令共有3条,表7.2给出了所有的异常处理类指令及其说明。

关于异常处理类指令有如下几点补充说明:

(1)l.sys指令中的立即数K,在ORBIS32说明中指出这个K是一个参数,操作系统可以利用该值确定如何处理这个系统调用请求,但在OR1200的实现中并没有保存这个参数,也没有使用这个参数。

(2)l.trap指令中的立即数K,在ORBIS32说明中指出只有在SR[K]为1时,才会进入自陷异常的处理例程,但从本章对l.trap的分析中可以发现OR1200处理器并没有实现这一判断过程,立即数K没有作用。

时间: 2024-10-10 07:05:02

or1200处理器的异常处理类指令介绍的相关文章

OR1200处理器的计时器模块TT介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 16.2.1 TT介绍 计时器模块(Tick Timer:TT)一般用在操作系统的进程调度.用户程序的定时参考等.TT内部会对时钟周期计数,当计数值达到一个预设值时,会产生中断,通知处理器进行处理.其实现的主体是两个特殊寄存器:计时器单元计数寄存器TTCR.计时器单元模式寄存器TTMR,通过这两个SPR的不同配置,实现不同的工作模式,以及计时中断的产生.TTCR.TTMR是第10组特殊寄存器,如表16.4所示.TTCR.TTMR的格式分别

or1200中载入存储类指令说明

下面内容摘自<步步惊芯--软核处理器内部设计分析>一书 OR1200中实现的载入存储类指令有8条,每条指令的作用与说明如表9.1所看到的. 说明一点:在第2章建立的最小系统没有配置使用MMU,所以有效地址等于物理地址. 载入存储类指令的助记符也非常好理解记忆.第一位是's'表示存储指令,'l'表示载入指令.第二位是'b'表示对字节操作,'h'表示对半字操作,'w'表示对字操作:第三位是'z'表示零扩展,'s'表示符号扩展.据此能够对指令进行简称,如:l.sb指令能够简称为存储字节指令.l.lw

or1200处理器的数据流图

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 完整的OR1200处理器流水线数据通路图,如图9.12所示,图中显示了数据处理类.特殊寄存器访问类.转移类.异常处理类.乘法除法类.加载存储类指令处理过程中流水线各个阶段的数据流转. (1)取指阶段:GENPC模块计算指令地址,然后通过指令Wishbone总线从指令存储器中取得指令,取得的指令送入IF模块,该指令进入流水线. (2)译码阶段:取出指令需要的通用寄存器的值dataa.datab,同时对指令中可能有的立即数进行符号扩展或零扩展

or1200中加载存储类指令说明

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 OR1200中实现的加载存储类指令有8条,每条指令的作用与说明如表9.1所示. 说明一点:在第2章建立的最小系统没有配置使用MMU,所以有效地址等于物理地址. 加载存储类指令的助记符也很好理解记忆,第一位是's'表示存储指令,'l'表示加载指令:第二位是'b'表示对字节操作,'h'表示对半字操作,'w'表示对字操作:第三位是'z'表示零扩展,'s'表示符号扩展.据此可以对指令进行简称,如:l.sb指令可以简称为存储字节指令.l.lwz指令

OR1200处理器中Wishbone总线接口模块WB_BIU介绍

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 WB_BIU模块是OR1200处理器与外部Wishbone总线连接的接口模块,15.1节给出了WB_BIU模块的对外连接关系,并指出WB_BIU模块的三个作用.因为OR1200处理器支持Wishbone B3版本,所以在15.2节介绍了Wishbone B3版本中的寄存反馈总线周期,重点说明了其中的周期类型识别地址标签CTI_O/CTI_I.突发类型扩展地址标签BTE_O/BTE_I的作用. 15.1 WB_BIU模块的对外连接关系 通过

ARM汇编初探---汇编代码中都有哪几类指令---ARM伪指令介绍

要学习一个东西首先要把概念搞清楚,下面只是自己的一些关于汇编的理解. 可执行文件中的01码是机器码,机器码不等于汇编码,虽然机器码可以很容易翻译成汇编码. 汇编码中包含很多汇编指令.伪指令和宏指令等,这些是不可以直接在机器上运行的. 机器指令是ARM指令集和Thumb指令集这些arm硬件支持的指令集组成的. 汇编码中的伪指令和宏指令这些都是汇编语言这个级别的指令,在汇编文件编译的时候汇编编译器as会去处理这些指令,在编译期间也会对宏进行展开,类似于gcc编译的时候对C代码中的宏展开一样.个人感觉

面向对象中关于元类的介绍与异常处理

一.异常处理 1. 什么是异常处理     异常是错误发生的信号,一旦程序出错就会产生一个异常,如果该异常     没有被应用程序处理,那么该异常就会抛出来,程序的执行也随之终止 异常包含三个部分:         1. traceback异常的追踪信息         2. 异常的类型         3. 异常的信息 错误分为两大类:         1. 语法上的错误:在程序运行前就应该立即修正         2. 逻辑上的错误 2. 为何要异常处理 避免程序因为异常而崩溃,所以在应用程

OR1200处理器的可编程中断控制器PIC分析

以下内容摘自<步步惊芯--软核处理器内部设计分析>一书 16.3可编程中断控制器PIC分析 16.3.1 PIC介绍 可编程中断控制器Programmable Interrupt Controller(PIC)用来响应各种中断事件,如:键盘事件.串口数据到达等,PIC收集所有的中断,并通知CPU中断到达,后者转入到中断处理例程进行处理.OR1200最多支持32个中断.其功能实现主要依靠两个特殊寄存器:中断屏蔽寄存器PICMR.中断状态寄存器PICSR.通过PICMR可以设置是否屏蔽某些中断,通

64位开源处理器Rocket的源代码简单介绍

最近大概阅读了一下UCB发布的Rocket处理器的源码,对源代码各个文件的功能有了一些大致的了解,Mark一下. Rocket是一款64bit的标量处理器,5级流水线,采用的是risc-v指令集,集成FPU,并有许多or1200没有的特性,比如:无阻塞缓存.分支预测.返回地址堆栈.硬件页表填充.cache支持ECC.支持多核等. Rocket的源代码是使用Chisel编写的,Chisel是UCB发布的基于Scala的领域特定语言.可以在https://github.com/ucb-bar/roc