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

到底是哪个中断呢?从主板寄存器读*/

int_status = BONITO_INTISR & BONITO_INTEN & ~(1 << (P6032INT_ISAIRQ-16))
;
/* Scan all pending interrupt bits and execute appropriate actions */ for (i=0; i<32 && int_status; i++) {
if (int_status & 1< irq = i + 16; /* 0-15 assigned to 8259int,16-48 bonito*/
/* Clear bit to optimise loop exit */
int_status &= ~(1< do_IRQ(irq,regs);

}
}

return;
}

8259控制器的代码类似,不再列出.

更高层一点的通用irq代码在arch/mips/kernel/irq.c arch/mips/kernel/i8259.c

总之,p6032上一个中断的过程是:

1.外设发出中断,通过北桥在cpu中断引脚上(mips CPU有多个中断引脚)引起异常

2. cpu自动跳转到0x80000180的通用异常入口,根据cause寄存器查表找到中断 处理函数入口p6032IRQ

3. p6032IRQ保存上下文,识别中断类别,把中断转交给相应的中断控制器

4. 中断控制器的代码进一步识别出具体的中断号,做出相应的应答并调用 中断处理do_irq

现在还有不少平台没有使用这种irq_desc[],controller,action的代码,阅读的时候 可能要注意.

下面把include/asm-mips/stackframe.h
对着注解一下,希望能说清楚一些.
(因为时间关系,笔者写的文档将主要以这种文件注解为主,加上笔者认为有用的背景知识 或者分析.)
/*
一些背景知识

一.mips汇编有个约定(后来也有些变化,我们不管,o32,n32),32个通用寄存器不是一视同仁 的,而是分成下列部分:

寄存器号 符号名 用途
0 始终为0 看起来象浪费,其实很有用
1 at 保留给汇编器使用
2-3 v0,v1 函数返回值
4-7 a0-a3 前头几个函数参数
8-15 t0-t7 临时寄存器,子过程可以不保存就使用
24-25 t8,t9 同上
16-23 s0-s7 寄存器变量,子过程要使用它必须先保存
然后在退出前恢复以保留调用者需要的值
26,27 k0,k1 保留给异常处理函数使用
28 gp global pointer;用于方便存取全局或者静态变量
29 sp stack pointer
30 s8/fp 第9个寄存器变量;子过程可以用它做frame pointer
31 ra 返回地址

硬件上这些寄存器并没有区别(除了0号),区分的目的是为了不同的编译器产生的代码 可以通用

二. r4k MIPS CPU中和异常相关的控制寄存器(这些寄存器由协处理器cp0控制,有独立的 存取方法)有:

1.status 状态寄存器
31 28 27 26 25 24 16 15 8 7 6 5 4 3 2 1 0

| cu0-3|RP|FR|RE| Diag Status| IM7-IM0 |KX|SX|UX|KSU|ERL|EXL|IE|

其中KSU,ERL,EXL,IE位在这里很重要:

KSU: 模式位 00 -kernel 01--Supervisor 10--User ERL: error level,0->normal,1->error
EXL: exception level,0->normal,1->exception,异常发生是EXL自动置1 IE: interrupt Enable, 0 -> disable interrupt,1->enable interrupt
(IM位则可以用于enbale/disable具体某个中断,ERL||EXL=1 也使得中断不能响应) 系统所处的模式由KSU,ERL,EXL决定:
User mode: KSU = 10 && EXL=0 && ERL=0
Supervisor mode(never used): KSU=01 && EXL=0 && ERL=0 Kernel mode: KSU=00 || EXL=1 || ERL=1

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