MIPS 异常诊断

本文介绍了MIPS架构中常见的异常类型,如TLB Refill、TLB Invalid、Bus Error、Address Error和Reserved Instruction等,并提供了异常处理时的寄存器信息和分析方法,帮助开发者诊断和解决MIPS系统中的异常问题。

 

下边是一个典型的MIPS异常信息表:

备注:在32位CPU(BCM5836)中上述寄存器是32位的;在64位CPU(Bcm1250)上是64位的。

【如何阅读】

● 异常类型(ExType)

打印该异常的类型名

如:TLB invalid exception (load or instruction fetch)

 

● 异常线程(current thread)

出现异常的线程名,即current->name和线程栈起止地址。

 

● CP0异常相关寄存器

MIPS协处理器0负责中断/异常处理,如下几个寄存器都是跟异常或中断相关:

 

寄存器

说明

Cause

cause[2..6]记录了异常码,即异常类型,上面的异常类型名就是根据这个打印

出来的,所以用户可以不用关心这个。

Status

主要跟中断相关,设置中断屏蔽码和异常向量表基址,可不关心。

EPC

引起异常的指令的地址,根据该地址你可以找到引起异常的函数。

ErrPC

与PC相似,只有在(soft)Reset,NMI,Cache Error时记录引起异常的PC指针。

RA

异常所在函数的返回地址,根据这个可以找到引起异常的函数的调用函数。

BadAddr

只在TLB异常中有用,引起TLB异常的逻辑地址。如果发现BadAddr值较小

说明是使用程序中用到了空指针。

ErrCtrl

处理器相关,对异常判断涌出不大。

CacheErr

处理器相关,对异常判断用处不大。

 

● 通用寄存器(GPRs)

打印异常发生时MIPS的32个通用寄存器GPR的值,对异常诊断作用不大。

 

● MIPS函数堆栈回溯

根据现有MIPS ABI 暂不支持堆栈回溯。

 

 

【常见异常】

MIPS中如下几个异常是最常见的:

● TLB Refill Exception

出现该异常是因为程序访问了一个没有经TLB映射的地址空间,可以根据EPC到相应函数中查找出错的地方。

 

● TLB Invalid Exception

BCM5836和BCM1250中都将内存的低64K地址空间(0x0à0x10000)映射为NULL区,访问这段地址空间的时候会产生TLB invalid的异常。正常情况下,程序是不会访问这段地址空间的,除非出现了空指针,所以碰到这类异常的时候,最好看看Baddaddr寄存器的值是不是小于0x10000,然后根据EPC到相应函数中查找哪里使用了空指针。

 

● Bus Error Exception

发起总线请求时,非正常中止。引起Bus Error的原因很多,如PCI控制器还没有初始化,

就去访问对应的PCI空间,肯定会引起Bus Error的。碰到具体问题还是根据EPC找到相应函数,然后用printf来定位问题。

 

● Address Error exception

 即“so called”不对齐访问异常。主要是如下面引起的:

 1)不在word自然对齐的边界上取指令。

 2)数据访问的时候不是自然对其的,如访问int时不是在四字节对齐的地址上。

 

 MIPS中对不对齐访问都做了处理,所以出现该异常的可能性较小,下面介绍一下MIPS中

 在处理不对齐访问时打印的调试信息的含义:

 

    handling unaligned load exception
        ... new_pc = 0x000000000049E12C, need_new_ra = 0x0000000000000000
        ... instruction address 0x000000000049E11C
        ... instruction code is 0x8C820000
        ... OP 2, 0(4)
        ... ea = 0x0000000000D84A9A
        ... returning to PC = 0x000000000049E12C

 

new_pc : 异常返回时开始执行的地址。

Need_new_ra: 有没有重新设置函数返回地址ra,这一般是在jal这类指令时用到。

Instruction address: 引起不对齐访问的指令的地址。

Instruction code :引起不对齐访问的指令的机器码。

ea: 试图访问的不对齐地址。

 

● Reserved Instruction Exception

该异常是使用了无法解析的指令引起的,即程序跑飞掉了。一般是程序跳动一个合法的地址,执行了一条CPU无法解析的指令。

 

● Machine Check Exception

该异常一般是CPU检测到内部出现了某种不一致造成的。如一个逻辑地址被映射到了多个TLB entry时,就有可能出现这种异常。

 

 

NULL保护】

BCM1250 和 BCM5836都把内存的低64K(0x0->0x10000)映射为NULL区,对该段地址的访问将会引起TLB invalid异常。程序的正常执行不会使用到该段地址,除非用到了空指针。

 

 

【附表】

MIPS中共定义了32种异常,除了上面的常见异常外,还有其他异常,如下:

 

 

 

ExcCode

(Cause[2..6])

Mnemnonic

Description

0

Int

Interrupt

1

Mod

TLB modification exception

2

TLBL

TLB exception (load or instruction fetch)

3

TLBS

TLB exception (store)

4

AdEL

Address error exception (load or instruction fetch)

5

AdES

Address error exception (store)

6

IBE

Bus error exception (instruction fetch)

7

DBE

Bus error exception (data reference: load or store)

8

Sys

Syscall exception

9

Bp

Breakpoint exception. If EJTAG is implemented and an SDBBP instruction is executed while the processor is running in EJTAG Debug Mode, this value is written to the Debug  field to DExcCode denote an SDBBP in Debug Mode.

10

RI

Reserved instruction exception

11

CpU

Coprocessor Unusable exception

12

Ov

Arithmetic Overflow exception

13

Tr

Trap exception

14

--

Reserved

15

FPE

Floating point exception

16-17

--

Available for implementation dependent use

18

C2E

Reserved for precise Coprocessor 2 exceptions

19-21

--

Reserved

22

MDMX

MDMX Unusable Exception.

23

WATCH

Reference to WatchHi/WatchLo address

24

MCheck

Machine check

25-29

--

Reserved

30

CacheErr

Cache error. In normal mode, a cache error exception has a

dedicatedvectorandtheCauseregisterisnotupdated.IfEJTAGis

implemented and a cache error occurs while in Debug Mode, this code iswriten to the Debug  field to indicate that re-entry DExcCode to Debug Mode was caused by a cache error.

31

--

Reserved

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值