中断
|
入口
|
功能
|
EMU
|
evt_emulation
|
保存当前各寄存器的值
调用irq_panic输出这些值并终止运行
|
RST
|
未处理
|
|
NMI
|
evt_evt2
|
保存寄存器的值
调用asm_do_IRQ(arch/blackfin/mach-kernel/irqchip.c)
恢复寄存器的值并从发生异常的位置继续执行
|
EVX
|
trap
|
此入口代码位于arch/blackfin/mach-common/entry.s。
它将根据SEQSTAT_EXCAUSE寄存器中的异常原因调用_extable中提供的回调函数,在entry.s中定义了64个入口,主要是以下几个处理函数:
ex_syscall:/* 0x00 – Linux系统调用异常 */
ex_soft_bp:/* 0x01 – 软件断点异常 */
ex_trap_c:/* 所有未经特殊处理的异常都将由它处理 */
ex_spinlock:/* 0x04 - User Defined */
ex_single_step:/* 0x10 – 单步执行时中断异常 */
ex_dcplb:/* 0x23 – Data CPLB异常 */
ex_icplb:/* 0x2B - Instruction CPLB异常 */
|
Reserved
|
保留
|
|
IVHW
|
evt_ivhw
|
保存当前各寄存器的值
调用irq_panic输出这些值并终止运行
|
IVTMR
|
evt_timer
|
全部跳转到__common_int_entry,在此处保存各寄存器的值,然后调用do_irq,再调用return_from_int,最后恢复各寄存器的值并返回到中断之前的位置继续执行。
|
IVG7
|
evt_evt7
|
|
IVG8
|
evt_evt8
|
|
IVG9
|
evt_evt9
|
|
IVG10
|
evt_evt10
|
|
IVG11
|
evt_evt11
|
|
IVG12
|
evt_evt12
|
|
IVG13
|
evt_evt13
|
|
IVG14
|
evt14_softirq
|
此入口代码位于arch/blackfin/mach-common/entry.s。
它将IMASK保存到R0中,并将IMASK设置为0。然后返回到中断之前的位置继续执行。
|
IVG15
|
evt_system_call
|
保存当前各寄存器的值
调用system_call
恢复各寄存器的值并返回到中断之前的位置继续执行
|