Musel's blog

OS-Pre-Cause SR EPC BadVaddr

字数统计: 1.9k阅读时长: 6 min
2022/03/11

《IDT R30xx Family Software Reference Manual》 Chapter 3 翻译

Cause

查询Cause寄存器以决定异常类型并调用哪一种异常处理进程。

BD [31] 分支延迟

  • 置位表示EPC没有指向实际异常指令,指向直接前序分支指令。
  • 异常重进点为分支指令后的延迟槽时,EPC指向分支指令。这对重新执行分支是无害的,但是如果CPU从异常中返回分支延迟指令,则没有跳转分支,且异常会破坏中断的程序。
  • 软件唯一可能注意BD位的时间是:如果它必须分析‘冒犯’指令(如果BD = 1,则该指令位于EPC + 4 )。如果需要对指令进行仿真(例如在没有FPA的设备中使用浮点指令),就会出现这种情况;或放置在分支延迟槽中的断点)。

    CE [29:28] 协处理器错误

  • 如果异常是因为 协处理器指令是针对SR中CUx位未启用的CP,那么CE就有来自该指令的协处理器编号。

    IP [15:8] 中断待决断

  • 显示当前生效的中断(但可能在实际表征异常的情况下被掩盖)。
  • 这些位在六个硬件层次上都遵循CPU的输入。
  • 位9和位8是可读/可写的,保存最后写入的值。
  • 当8位中的任何一个被合适的IM位使能以及SR中全局中断使能标志IEc激活时,都会引起中断。
  • IP与其他Cause寄存器字段存在微妙不同:它并不表明异常发生时发生了什么,而是表明现在正在发生什么。

    ExcCode [6:2]

ExcCode Value 注记符 描述
0 Int 中断
1 Mod TLB修改
2 TLBL TLB load
3 TLBS TLB store
4 AdEL load/I-fetch时,用户态下地址超出kuseg或在非对齐地址读字/半字
5 AdES store时,用户态下地址超出kuseg或在非对齐地址读字/半字
6 IBE 取指令总线错误。外部硬件已经预示着某种错误;合适的异常处理是系统依赖。R30xx家族CPU不能在一个存储上采取总线错误;写缓冲区会使这样的异常‘不精确’。
7 DBE load数据总线错误。外部硬件已经预示着某种错误;合适的异常处理是系统依赖。R30xx家族CPU不能在一个存储上采取总线错误;写缓冲区会使这样的异常‘不精确’。
8 Syscall 系统指令无条件生成
9 Bp 断点指令
10 RI 未定义指令
11 CpU 协处理器不可用
12 Ov 算术溢出。无符号计算如addu不会导致异常
13-31 未定义或在后续版本中定义

EPC

  • 异常的32位返回地址。引起(或遭受)异常的指令位于EPC。
  • Cause中BD置位时,EPC指向前序分支指令。

BadVaddr

  • 存放32位导致异常的不合法的引用地址。
  • 设置在任何MMU相关的异常上,由用户程序试图访问kuseg以外的地址,或者如果某个地址对引用的基准大小错误对齐。
  • 在其他任何异常后,此寄存器是未定义的。
    特别要注意,它不是在一次总线错误后设置的。

SR:存储MIPS CPU的各种模式

注:以下标题格式为:[位名称] [在寄存器中的位数] [作用]

CU3,CU2 [31:30] CP3CP2使用权

  • 软件使用BrCond[3:2]用于轮询的输入引脚 或 者加速异常解码。

    CU1 [29] CP1使用权,能否使用FPA浮点协处理器

    • 置零时,内核态与用户态下运行FPA指令都会导致异常。
    • 可用于停用空闲FPA。
    • 如果使用BrCond[1]用于轮询的输入,没有FPA的CU1也会被置位。

      CU0 [28] CP0使用权

    • 用户态使用nominally-priviledged指令(少)
    • CP0内核态保持可使用状态,无视CU0位。

      RE [25] 用户态时反转大小端即字节顺序

    • 保证大小端系统间的移植性。
    • 嵌入式系统实现反转字节序需要大量软件工作。

      BEV [22] 引导异常向量

    • 置位:CPU使用ROM kseg2异常入口点。
    • 通常置零
    • 将异常向量重新定位到RAM地址,加快访问速度,允许使用”用户提供”的异常服务例程。

      TS [21] 置位时关闭TLB

    • 程序地址同时匹配两个TLB条目
    • 长时间此状态时损坏芯片
    • TLB关闭是永久的,只能被硬件复位清除。
    • 软件依此判断硬件是否支持TLB

      PE [20] 如果发生缓存奇偶错误,则置位

  • 这个条件不会导致异常,真正只对诊断有用。
  • MIPS架构具有缓存诊断功能,因为早期版本的CPU使用外部缓存,这为验证特定系统的时序提供了一种方法。
  • 对于这些实现,缓存奇偶错误位是必不可少的设计调试工具。
  • 单片缓存不需要这个特性,R3071、R3081

    CM [19] 显示用隔离D-cache执行的最后一次load操作的结果

    CM是指如果缓存中确实包含了地址存储器位置的数据(即使缓存没有被隔离,缓存中的负载也会被击中)。

    PZ [18] 置位时缓存奇偶位写0并且不被检查

  • 对早期需要外部RAM缓存的R3000A系统有价值。

    SwC IsC [17][16]对内存管理和诊断的内存模式位

    SwC [17] 交换缓存

  • 所有load和store只能访问数据缓存,不访问内存。
  • 此模式下局部字store(lb)使缓存条目无效
  • 总线中不会出现未缓存的数据访问
  • 此位不被reset初始化,故启动程式软件必须确保此位在依赖外部数据引用之前被正确初始化

    IsC [16] 隔离缓存

  • 反转I-缓存和D-缓存功能,所以软件能够访问并使指令高速缓存条目无效

    IM [15:8] 中断掩码 定义中断源,作为允许异常的标志

  • 六种中断源是外部引脚
    • 其中之一会被FPA使用,虽然与其他同属一个芯片,但逻辑层面是外在的
    • 其余两种是Cause寄存器中软件写的中断位。
  • CPU不提供中断优先级。硬件处理所有中断时一视同仁。[见异常处理章节]

    KUc IEc [1][0]计算机保护位

    KUc [1] 内核态置位

  • 内核状态下,软件可以在整个程序地址空间内得到并使用特权指令(CP0)。用户模式限制软件在kuseg地址空间内,运行权限指令时会被拒绝。违反此项规则会导致异常。

    IEc [0] 置位允许计算机接受中断

    KUp IEp [3][2]

  • 在异常时,硬件接受 KUc IEc 的值并保存在 KUp IEp。
  • 同时修改KUc IEc为1和0。此时内核态下拒绝接受中断。
  • rfe指令可以被用于复制KUp IEp返还到KUc IEc。

    KUo IEo [5][4]

  • 异常时KUp IEp在此处保存。
  • 六个KU/IE位被一个三位深度,两位位宽的栈操作。
  • 堆栈遇到异常时push,遇到ref指令pop。
  • 这很早地在异常处理过程中 提供了从异常中干净恢复的机会 以至于第一个异常还未在SR中完成保存。
  • 此类操作可以被完成的情况受限,仅用于允许用户TLB充填短一些的代码。[见内存管理章节]
CATALOG
  1. 1. Cause
    1. 1.1. BD [31] 分支延迟
    2. 1.2. CE [29:28] 协处理器错误
    3. 1.3. IP [15:8] 中断待决断
    4. 1.4. ExcCode [6:2]
  2. 2. EPC
  3. 3. BadVaddr
  4. 4. SR:存储MIPS CPU的各种模式
    1. 4.1. CU3,CU2 [31:30] CP3CP2使用权
    2. 4.2. CU1 [29] CP1使用权,能否使用FPA浮点协处理器
    3. 4.3. CU0 [28] CP0使用权
    4. 4.4. RE [25] 用户态时反转大小端即字节顺序
    5. 4.5. BEV [22] 引导异常向量
    6. 4.6. TS [21] 置位时关闭TLB
    7. 4.7. PE [20] 如果发生缓存奇偶错误,则置位
    8. 4.8. CM [19] 显示用隔离D-cache执行的最后一次load操作的结果
    9. 4.9. PZ [18] 置位时缓存奇偶位写0并且不被检查
    10. 4.10. SwC IsC [17][16]对内存管理和诊断的内存模式位
    11. 4.11. SwC [17] 交换缓存
    12. 4.12. IsC [16] 隔离缓存
    13. 4.13. IM [15:8] 中断掩码 定义中断源,作为允许异常的标志
    14. 4.14. KUc IEc [1][0]计算机保护位
    15. 4.15. KUc [1] 内核态置位
    16. 4.16. IEc [0] 置位允许计算机接受中断
    17. 4.17. KUp IEp [3][2]
    18. 4.18. KUo IEo [5][4]