PowerPC 体系结构之中断异常
- 格式:doc
- 大小:108.00 KB
- 文档页数:5
PowerPC 体系结构之中断异常
取BOOKE 之精要。
1. 异常类型
00Critical Interrupt 来自于外部中断控制器,具有较高的优先级
01Machine Check 严重的内部状态错误,如Cache 数据的校验失败
02 Data Storage 数据读写异常,如:用户态读一个非用户态的页(UR=0)
03 Instruction Storage 读指令异常,如:用户态时取一个用户态不可执行的页(UX=0)
04External Interrupt 来自于外部中断控制器
05 Alignment 非对齐访问异常
06Program 程序异常,如:执行非法指令,用户态执行特权指令
07 Floating-Point unavailable 在无浮点部件的CPU 上执行浮点指令即会触发此异常
08System call 系统调用
09 Auxiliary Processor Unavailable 在无协处理器的CPU 上执行协处理器指令即触发此异常
10 Decrementer DEC 寄存器归零异常,DEC 是一个内部时钟计数器,Linux 用之实现时钟中断
11 Fixed-interval timer interrupt
12Watchdog timer interrupt
13Data TLB error 数据TLB Miss 异常
14Instruction TLB error 指令TLB Miss 异常
15Debug 调试异常,用于支持调试
16 - 31 Reserved for future use 保留给将来体系结构升级用
32 - 63 Allocated for implementation-dependent use 具体实现相关
其中0,1,12,15 为Critical Exception,当其发生时,使用CSRR0 & CSRR1 保存当前PC 或(PC + 4) 和MSR;其他异常发生时,则使用SRR0 & SRR1 保存当前PC 或(PC + 4) 和MSR
可以看到BOOKE 体系结构层面规定的异常即为前16 个,这其中的有些异常是个笼统的抽象(比如Data Storage 就需要区分是读还是写导致的),为了更细地描述发生异常的原因,PowerPC 引入了一个ESR (Exception Syndrome Register),让硬件在异常发生时,在其中指出更具体的原因。
比如若ESR[40] 被置位,则说明异常是由写操作引起的。
2. 异常入口(向量)
BOOKE 使用可读写的内部寄存器IVPR 和IVOR 来指定异常的入口。
其中IVPR (Interrupt Vector Prefix Register) 为64 bit,指定所有异常入口基地址的高48 bit,
即IVPR[48:63] 始终为0
IVOR (Interrupt Vector Offset Register) 为32 bit,指定具体异常入口相对异常基地址的偏移,每个异常一个,只使用其低16 位。
则其IVOR[32:40] 为0;又因所有入口16 字节对齐,实际上IVOR[60:63] 亦始终0:
IVOR00 Critical Interrupt
IVOR01 Machine Check
IVOR02 Data Storage
IVOR03 Instruction Storage
IVOR04 External Interrupt
IVOR05 Alignment
IVOR06 Program
IVOR07 Floating-Point unavailable
IVOR08 System call
IVOR09 Auxiliary Processor Unavailable
IVOR10 Decrementer
IVOR11 Fixed-interval timer interrupt
IVOR12 Watchdog timer interrupt
IVOR13 Data TLB error
IVOR14 Instruction TLB error
IVOR15 Debug
IVOR16 ~ IVOR31
IVOR32 ~ IVOR63
则Data TLB Miss 的异常入口即为:IVPR[0:47] || IVOR[48:59] || 0b0000
注意:PowerPC 没有RESET 异常这个概念,故没有RESET 的入口,上电后处理器直接到固定地址去取指令(E500 上为0xFFFF FFFC)。
3. 相关寄存器
3.0 MSR (Machine Status Register)
内含部分异常使能位,清位则屏蔽相应的异常:
MSR[46], CE (Critical Enable) --- Critical Input and Watchdog Timer Interrupts Enable
MSR[48], EE (External Enable) --- External Input, Decrementer and Fixed-Interval Timer Interrupts Enable
MSR[51], ME (Machine Check Enable) --- Machine Check Enable
MSR[54], DE (Debug Enable) --- Debug Enable
MSR[49], PR (Proble State) --- 置1 表示处理器处于用户态,置0 则为核心态
当Critical Exception 发生时,硬件将MSR 保存于CSRR1 后,仅保持ME 不变,自动将MSR 之其它位清零(PR = 0,进入核心态)
当一般异常发生时,硬件将MSR 保存于SRR1 后,保持CE,DE,ME 不变,自动将其它位清零
3.1 SRR0 (Save/Restore Register 0)
64 bit,用于异常发生时保存引起异常指令的地址(异常)或其下一条指令的地址(中断)。
保存过程硬件自动做
执行rfi 从异常返回时,处理器会跳转到SRR0 保存的地址处继续执行。
3.2 SRR1 (Save/Restore Register 1)
32 bit,用于异常发生时硬件自动保存MSR (Machine Status Register)
执行rfi 从异常返回时,处理器会将SRR1 值恢复入MSR
3.3 CSRR0 (Critical Save/Restore Register 0)
64 bit,用于Critical Exception (0, 1, 12, 15)
其它与SRR0 同,只是该类型异常使用指令rfci 返回
3.4 CSRR1 (Critical Save/Restore Register 1)
32 bit,用于Critical Exception (0, 1, 12, 15)
其它与SRR1 同,只是该类型异常使用指令rfci 返回
3.5 DEAR (Data Exception Address Register)
64 bit,用于记录访存失败的地址,类似MIPS 之BadV Addr 或x86 之CR2
3.6 IVPR & IVORi
64 bit & 32 bit,异常入口寄存器
3.7 ESR (Exception Syndrome Register)
4. 完整的例子
以外设中断为例:
a. 外部中断控制器通过中断引脚(#int) 触发处理器进入External Input 异常
b. 保存当前PC + 4 入SRR0 (异步,无需重新执行之,故下一条指令即可)
c. 保存当前MSR 入SRR1,保持MSR 之CE, DE, ME,其余清除
d. 跳转到入口IVPR + IVOR4 处(interrupt handler 之所在)
e. interrupt handler 使用指令rfi 返回,处理器在执行该指令时自动把SRR1 恢复入MSR,SRR0 入PC
最后给一个BOOKE 之异常的全家福:
参考文献:
[1] Book E: Enhanced PowerPC Architecture, V1.0, 2002.5。