免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1408 | 回复: 0
打印 上一主题 下一主题

多核MIPS异常分析(2) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-30 12:32 |只看该作者 |倒序浏览
*** MIPS异常入口 ***
Copyright (C) 2006 xuhaibing : hxu@razamicro.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 : 对本文的转载,重新发布必须保留以上声明。重新发布允许增加重新发布人的版权声明。
#异常入口:
**********
  异常中除Cache Error、Reset、NMI外,在Status[BEV]没有被设置的情况下。其他所有异常处理的入口地址都被规定在Cached\Unmap的地址上(kseg0)。对于一个多核架构、实现了EBASE(此寄存器在MIPS III R2规范中被指定)的处理器来说,为了保证这一点,要求每一个CPU的EBASE[31...30]最高两位的值必须有固定的值0b10,以保证所有CPU的异常入口地址在不需要转换(Unmap)的地址空间(kseg0/kseg1)。
  一个多核处理器,每一个处理器需要有独立的异常入口地址。通常在MIPS中,为每一个处理器分配的异常处理代码的安装空间大小为4Kbyte(每一个异常处理过程最大为0x80byte)。EBASE这个寄存器记录了对应处理器的异常入口的基地址。每一龃?砥餍枰??斐0沧霸诙杂诘钠?莆恢蒙暇涂梢粤恕?LR系列处理器作为Multi-core&Multi-thread,为每一个vCPU实现了独立的EBASE寄存器。
  需要特殊注意的是Cache Error这个异常。其入口地址无论Status[BEV]设置与否都被安排在不可Cache的地址上(kseg1)。对一个多核的处理器,任何一个CPU的这个异常入口地址都需要满足EBASE[29]=0b1,这样可以保证这个异常的入口地址在kseg1。
  
  CPU的每一个异常都存在一个用以处理这个异常的代码入口地址(MIPS中,为虚拟地址),这个地址我们将其称为异常入口。MIPS规定,每一个异常入口都是相对基地址的偏移量。就是说,任何一个异常的入口都是由CPU的异常基地址和具体的异常类型的入口偏移量来共同决定。异常入口(ENTRY[EXC])、异常基地址(EBASE[CPU])和异常入口偏移量(OFFSET[EXC])满足关系:
              ENTRY[EXC] = EBASE[CPU] + OFFSET[EXC]
** 异常基地址:
  除Reset、Soft Reset、NMI、EJTAG以外,其他异常基地址都和CP0 Status[BEV]有关。 状态寄存器的这一位决定基地址的取值。当然Status[BEV]为一个二元变量,那么决定了异常的基地址存在两组取值。
  1. 以下分单处理器(SP)系统和多处理器(MP)两种情况说明。两种系统下,只有在 BEV=0时其基地址才存在差别:
    EEV = 1    : 0xFFFF,FFFF,BFC0,0200    (系统启动地址空间 : kseg1)
    BEV = 0 :
  [SP]: 0xFFFF,FFFF,8000,0000 (物理内存0地址 :  kseg0)
  [MP]: 0xFFFF,FFFF || EBASE[31...12] || 0x000 (物理内存0地址 :  kseg0)
  2. 对Cache Error这个特殊的异常来说,需要给他安排一个任何时候都是Uncached的基地址了。因为发生这个异常时Cache已经不可靠了,在处理它是就不能使用它了。因此这个异常的入口基地址为:
    BEV = 1 : 0xFFFF,FFFF,BFC0,0300    (系统启动地址空间 : kseg1)
    BEV = 0 :
  [SP]: 0xFFFF,FFFF,A000,0000 (物理内存0地址 :  kseg1)
  [MP]: 0xFFFF,FFFF || EBASE[31.30] || 1 || EBASE[28...12] || 0x000
                                    (物理内存0地址 :  kseg1)
  
  XLR系列处理器中,支持MIPS III R2 CP0 EBASE寄存器的使用。处理器上电之后,多个CPU的COP0的EBASE[31..12]相同,默认所有CPU在Status[BEV]=0时使用相同的异常入口基地址。OS在初始化(trap_init)时需要对不同的CPU设置相互独立的异常入口基地址,各个处理器以此基准安装各自的异常处理过程。保证各个CPU的异常处理独立、互不影响。
  NOTE:
  EBASE寄存器保存各个CPU的异常入口基地址,同时也包含了对应CPU的CPUID信息,CPUID 域为BASE[9...0],因此可以通过这个寄存器来获取当前CPUID信息,XLR系统处理器是一个Mult-core/Multi-thread,最大支持8个core,每个core支持四个硬件线程。OS可以将每个线程作为一个独立的CPU对待,因此OS看到的将是32个CPU。EBASE[1...0]表示线程 ID,EBASE[4...2]表示CoreID,EBASE[9...5]=0。因此,直接可以通过EBASE[4...0]获取到当前CPUID信息,而EBASE[31...12]就表示这个CPU的异常基地址。
  3. Reset、Soft Reset、NMI的异常入口不受Status[BEV]的影响,只存在一个取值,保证在任何情况下都进入同样的入口。异常入口地址: 0xFFFF,FFFF,BFC0,0000    (MIPS的启动地址 : kseg1)
  
  4. EJTAG调试异常基地址分两种情况,同样存在两个基地址。根据ProbEn状态来决定到底使用那个基地址。这一部分不是很熟悉,需要学习。大家可以参考EJTAG 的规范和MIPS  III的架构手册。
** 异常偏移
  前面讲过,CPU存在一个异常基地址,同时对于各类异常有不同的入口偏移。在MIPS64中, 分配了5个偏移量给所有的异常,其中有三个作为特殊异常偏移(这三类异常需要快速或者特殊处理)。这三类的异常和偏移如下:
      Exception                                Offset
      TLB Refill & EXL = 0       :    0x000 (TLB 重添异常)
      XTLB Refill & EXL = 0    :    0x080 (64bits模式下的TLB重添异常)
      Cache Error                        : 0x100
   NOTE:
   对于TLB异常,只有在Status[EXL]=0的情况下,以上偏移有效,当Status[EXL]=1时,其 偏移将将不再是这个地址。在TLB/XTLB Refill异常一部分将详细讨论。
   除以上三类异常外,所有其它异常使用的偏移地址相同。MIPS III为这类分配了两个偏移入口,在异常发生时到底使用那个入口,取决于Cause[IV]的状态。
       Exception & IV = 0    :  0x180
       Exception & IV = 1    :  0x200
   当异常发生时,CPU根据Cause[IV]状态来决定入口偏移量。这要求OS在trap_init时根据需要设置Casue[IV]状态并将异常处理安装在对应的位置上。
   影响异常处理入口的寄存器状态包括:Status[BEV]、Status[EXL]、Cause[IV],Status[EXL]影响TLB refill异常的处理地址。另外,对于EJTAG异常,ProbEn状态决定其处理入口地址,这个状态对其它没有任何影响。这几中状态的组合决定的异常处理入口地址可参考文档MIPS64 Architecture For Programmers Volum III。這里将其进行罗列只是重复,没有意义的工作。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/9858/showart_289628.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP