uclinux-2008r1-rc8(bf561)的中断处理(3):trap

 
  
这部分代码用于处理Exception中断,对于内核而言是相当重要的,其实现在arch/blackfin/mach-common/entry.S文件中
ENTRY(_trap) /* Exception: 4th entry into system event table(supervisor mode)*/
       /* Since the kernel stack can be anywhere, it's not guaranteed to be
        * covered by a CPLB. Switch to an exception stack; use RETN as a
        * scratch register (for want of a better option).
        */
       EX_SCRATCH_REG = sp;
       sp.l = _exception_stack_top;
       sp.h = _exception_stack_top;
       /* Try to deal with syscalls quickly. */
       [--sp] = ASTAT;
       [--sp] = (R7:6, P5:4);
       DEBUG_STOP_HWTRACE(p5, r7)
       r7 = SEQSTAT;             /* reason code is in bit 5:0 */
       r6.l = lo(SEQSTAT_EXCAUSE);
       r6.h = hi(SEQSTAT_EXCAUSE);
       r7 = r7 & r6;
       p5.h = _ex_table;
       p5.l = _ex_table;
       p4 = r7;
       p5 = p5 + (p4 << 2);
       p4 = [p5];
       jump (p4);
 
.Lbadsys:
       r7 = -ENOSYS;            /* signextending enough */
       [sp + PT_R0] = r7;       /* return value from system call */
       jump .Lsyscall_really_exit;
ENDPROC(_trap)
 
在这里EX_SCRATCH_REG定义成RETN这个寄存器。
而_exception_stack_top是在本文件中定义的缓冲区的最高位置。
_exception_stack:
//     .rept 1024
//     .long 0;
//     .endr
       .byte4 _exception_stack_buffer[1024];
_exception_stack_top:
_ex_table是在本文件中定义的函数指针的数组,它指明了所有可能的64种异常的入口:
ENTRY(_ex_table)
       /* entry for each EXCAUSE[5:0]
        * This table must be in sync with the table in ./kernel/traps.c
        * EXCPT instruction can provide 4 bits of EXCAUSE, allowing 16 to be user defined
        */
       .long _ex_syscall       /* 0x00 - User Defined - Linux Syscall */
       .long _ex_soft_bp       /* 0x01 - User Defined - Software breakpoint */
_ex_table.end:
因而,这一段程序就是根据不同的EXCEPTION的类型,调用相应的入口函数进行处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嵌云阁主

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值