多核mips异常分析(1)

来源:互联网 发布:手机qq网络硬盘在哪里 编辑:程序博客网 时间:2024/06/04 00:05
*** MIPS的异常基础 ***

Copyright (C) 2006 xuhaibing : hxu@rmicorp.com(xhbdahai@126.com).This document is free; you can redistribute it and/or modify it under the term of the GNU General Public License as published by the Free Software Foundation; either version 2,or (at your option) any later version.

本文描述的MIPS64架构处理器的异常相关内容。使用RMI的XLR系列处理器作为参考。XLR处理器是基于MIPS64的多核多线程的高性能处理器。

!NOTE : 对本文的转载,重新发布必须保留以上声明。重新发布允许增加重新发布人的版权声明。


#什么是异常:
  应该说是异常事件,不过大家习惯了称为异常。顾名思义,这个事件打断了处理器的正常执行。我们把所有导致CPU中断正常处理过程(我们程序所预期的过程)的事件称为异常。

  在MIPS中,异常包括了很多,TLB Refill、Bus Error、Cache Error、Syscall、 Trap、interrupt等。

#异常的分类:
*************
  在MIPS III的架构手册中,将异常分为两类:同步(synchronous exception)和异步(asynchronous exception)两类。除reset以外,中断是唯一能够触发异步异常的手段。同步异常对于软件来说都是可以预料的。

#EPC & ErorrEPC和异常指令计数器PC的关系:
*****************************************
  CP0这两个寄存器(EPC & ErrorEPC)都可以被软件修改。 通常,CPU执行过程中如果捕获到一个异常,其根据异常的分类情况,会自动设置CP0的EPC或者(ErrorEPC)寄存器,用以记录此异常发生的指令地址。EPC
  (ErrorEPC)的设置和当前指令的执行状态和类型相关:

** EPC和异常:
  1. 同步异常:EPC的值为产生异常的指令地址PC。并且CPU需要判断这个产生异常的指令是否在一个分支跳转指令的时延槽(delay slot)中,判断Cause[BD]设否被设置(此位只读,CPU逻辑会根据当前指令位置来设置它)。
            if Cause[BD] = 1;
                EPC <-- 产生异常的指令之前的那个分支指令地址
            else
                EPC <-- 实际产生异常的指令地址
            PC <-- Exception entry address
            
  对于同步异常,当异常处理程序使用eret返回时,如果CP0的Status[EXL]状态没有被设置,则PC <-- EPC,开始继续执行。因此如果异常处理程序没有正确处理这个异常而返回后,CPU将不能继续执行后续指令。
            
  2. 异步异常,通常中断的检测发生在一条指令的最后阶段。意味这当检测到中断时,在流水线中本条指令已经执行完成,那么中断处理完成之后需要返回到下一个指令开始。因此中断发生时:
              EPC <-- 异常处理完成后继续的那一条指令地址
              PC <-- Exception entry address
              
  当异常发生后,根据异常类别。CP0 BadVAddr寄存器会记录发生异常的地址,这仅限于以下几类异常:
      • Address error (AdEL or AdES)
      • TLB/XTLB Refill
      • TLB Invalid (TLBL, TLBS)
      • TLB Modified

  NOTE:
  寄存器BadVAddr由CPU逻辑在每一次异常时自动记录并更新,软件不能改写此寄存器。另外,寄存器EPC,在发生异常到此次异常处理结束(eret返回)之前,CPU不再更新它,即使在此期间CPU检测到某一个异常发生。

** ErrorEPC和异常:
  这个寄存器记录当以下情况发生后CPU重新开始的地址:
       • Reset or Soft Reset
      • Nonmaskable Interrupt (NMI)
      • Cache Error

  当这些异常发生时,CP0的Status[ERL]被设置。表明CPU发生严重错误,并设置 ErrorEPC,设置的过程类似于EPC的处理过程。它和EPC的区别在于,这些异常发生时,并没有使用一个类似于BD的状态位来记录触发异常的指令是否在分支跳转指令的时延槽(delay slot)中。

          if(Exception Occur on Delay slot)
              ErrorEPC <-- 产生异常的指令之前的那个分支指令地址
          else
              ErrorEPC <-- 实际产生异常的指令地址

  以上是MIPS结构手册对这几类异常的描述。具体来说:
    • 对于Reset异常,它不会返回(也就是不存在返回地址),当系统上电或者软件 Reset以后,PC会被无条件的      设置到0xFFFF,FFFF,BFC0,0000这个虚拟地址上(对应物理地址0x1FC0,0000)。同时,ErrorPC可能会记录      正在执行的指令地址。 PC <-- 0xFFFF,FFFF,BFC0,000。
    • 对于Soft Reset异常,它也不存在返回地址,当软件触发这个异常时,PC会被无条件设置到
      0xFFFF,FFFF, BFC0,0000这个虚拟地址上。同时,ErrorEPC可能会记录发起软件复位请求的指令地址。
      PC <-- 0xFFFF,FFFF,BFC0,000。
    • 而对于NMI异常来说,虽然入口地址同样是0xFFFF,FFFF,BFC0,0000,但是这个异常存在返回地址。也可以      理解为:NMI属于一种比较特殊的中断,它和Reset有相同的异常入口地址。在异常返回时, 
       PC <-- ErrorPC。
    • Cache Error的异常入口应该是在非Cache的内存区域(kseg1),这个异常同样可返回,当返回时, 
      PC <-- ErrorPC。

  当异常处理完成使用eret返回时,如果Status[ERL]被设置,则 PC <-- ErrorEPC,开始继续执行。

  NOTE :
  由于MIPS将Reset、Soft Reset、NMI这几类异常的入口地址都是为虚拟地址  0xFFFF,FFFF,BFC0,000,因此,    一旦发生这几中异常的任何一个,异常的入口地址, 指令计数器PC都会被设置为0xFFFF,FFFF,BFC0,0000这个地址。因此,如果打算区分这几个异常,就需要由软件来完成。

  另外对于Reset和Soft Reset异常来说,当发生此类异常时,ErrorEPC是否准确记录了发生异常时执行的指令地址,这需要根据特定处理器的手册决定。它依赖于具体处理器的实现。而且,似乎在Reset时也没有必要去记录处理器正在执行的指令:)。

  在XLR处理器中,FLASH(ROM区域)在Reset之后会被无条件的映射到启动地址。当启动完成之后可以通过对FLASH_BAR的配置将FLASH的地址进行重新映射,将其映射对另外一段kseg1的非Cache地址。让出以0xFFFF,FFFF,BFC0,0000开始的一段地址,并将这个地址段映射到DRAM上。在DRAM中可以安装NMI处理程序。当有NMI异常发生时,对于所有的CPU来说,入口地址同样都是0xFFFF,FFFF,BFC0,000,但是实际上这段地址已经被映射到了DRAM上。当发生Reset异常之后,FLASH_BAR也被复位,之后FLASH的基地址默认被映射到虚拟地址  0xFFFF,FFFF,BFC0,0000。因此,复位之后CPU将开始从FLASH中执行指令。区分Hardware  Reset和Soft Reset的工作需要在FLASH的启动代码中进行区分(软件可以根据CP0的Status[SR]位是否被设置来区别,SR当Reset由软件触发时会被自动设置)。

  而对于不支持FLASH基地址重新映射的CPU来说,为了区分这几中异常。需要在启动代码中通过判断CP0的Status[RS]、Status[NMI]来决定处理过程。
0 0
原创粉丝点击