【MIPS CPU 体系结构概述2】连载10:

2.cause寄存器

31 30 29 28 27 16 15 8 7 6 2 1 0

|BD|0 | CE | 0 | IP7 - IP0 |0|Exc code | 0 |

异常发生时cause被自动设置
其中:
BD指示最近发生的异常指令是否在delay slot中
CE发生coprocessor unusable异常时的coprocessor编号(mips有4个cp) IP: interrupt pending, 1->pending,0->no interrupt,CPU有6个中断
引脚,加上两个软件中断(最高两个)
Exc code:异常类型,所有的外设中断为0,系统调用为8,...

3.EPC
对一般的异常,EPC包含:
. 导致异常的指令地址(virtual)
or. if 异常在delay slot指令发生,该指令前面那个跳转指令的地址 当EXL=1时,处理器不写EPC

4.和存储相关的:
context,BadVaddr,Xcontext,ECC,CacheErr,ErrorEPC
以后再说

一般异常处理程序都是先保存一些寄存器,然后清除EXL以便嵌套异常,
清除KSU保持核心态,IE位看情况而定;处理完后恢复一些保存内容以及CPU状态

*/

/* SAVE_ALL 保存所有的寄存器,分成几个部分,方便不同的需求选用*/
/*保存AT寄存器,sp是栈顶PT_R1是at寄存器在pt_regs结构的偏移量
.set xxx是汇编指示,告诉汇编器要干什么,不要干什么,或改变状态
*/

#define SAVE_AT \
.set push; \
.set noat; \
sw $1, PT_R1(sp); \
.set pop

/*保存临时寄存器,以及hi,lo寄存器(用于乘法部件保存64位结果) 可以看到mfhi(取hi寄存器的值)后并没有立即保存,这是因为
流水线中,mfhi的结果一般一拍不能出来,如果下一条指令就想
用v1则会导致硬件停一拍,这种情况下让无关的指令先做可以提高 效率.下面还有许多类似的例子
*/

#define SAVE_TEMP \
mfhi v1; \
sw $8, PT_R8(sp); \
sw $9, PT_R9(sp); \
sw v1, PT_HI(sp); \
mflo v1; \
sw $10,PT_R10(sp); \
sw $11, PT_R11(sp); \
sw v1, PT_LO(sp); \
sw $12, PT_R12(sp); \
sw $13, PT_R13(sp); \
sw $14, PT_R14(sp); \
sw $15, PT_R15(sp); \
sw $24, PT_R24(sp)

/* s0-s8 */
#define SAVE_STATIC \

sw $16, PT_R16(sp); \
sw $17, PT_R17(sp); \
sw $18, PT_R18(sp); \
sw $19, PT_R19(sp); \
sw $20, PT_R20(sp); \
sw $21, PT_R21(sp); \
sw $22, PT_R22(sp); \
sw $23, PT_R23(sp); \
sw $30, PT_R30(sp)

#define __str2(x) #x
#define __str(x) __str2(x)

/*ok,下面对这个宏有冗长的注解*/
#define save_static_function(symbol) \
__asm__ ( \
".globl\t" #symbol "\n\t" \
".align\t2\n\t" \
".type\t" #symbol ", @function\n\t" \
".ent\t" #symbol ", 0\n" \
#symbol":\n\t" \
".frame\t$29, 0, $31\n\t" \
"sw\t$16,"__str(PT_R16)"($29)\t\t\t# save_static_function\n\t" \
"sw\t$17,"__str(PT_R17)"($29)\n\t" \
"sw\t$18,"__str(PT_R18)"($29)\n\t" \
"sw\t$19,"__str(PT_R19)"($29)\n\t" \
"sw\t$20,"__str(PT_R20)"($29)\n\t" \
"sw\t$21,"__str(PT_R21)"($29)\n\t" \
"sw\t$22,"__str(PT_R22)"($29)\n\t" \
"sw\t$23,"__str(PT_R23)"($29)\n\t" \
"sw\t$30,"__str(PT_R30)"($29)\n\t" \
".end\t" #symbol "\n\t" \
".size\t" #symbol",. - " #symbol)

/* Used in declaration of save_static functions. */
#define static_unused static __attribute__((unused))

--电子创新网--
粤ICP备12070055号