Chinaunix首页 | 论坛 | 博客
  • 博客访问: 127624
  • 博文数量: 35
  • 博客积分: 2085
  • 博客等级: 大尉
  • 技术积分: 395
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-03 10:42
文章分类

全部博文(35)

文章存档

2012年(1)

2011年(3)

2010年(15)

2009年(8)

2008年(8)

我的朋友

分类: LINUX

2010-09-21 16:54:02

39 /*
 40 * Ok, we need to do extra processing, enter the slow path.
 41 */
 42 fast_work_pending:
 43     tst r1, #_TIF_KERNEL_TRACE @ flag can be set asynchronously
 44     bne __sys_trace_return
 45     str r0, [sp, #S_R0+S_OFF]! @ returned r0
 46 work_pending:
 47     tst r1, #_TIF_NEED_RESCHED @判断该进程是否需要被调度
 48     bne work_resched           @Yes, 释放CPU
 49     tst r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME @判断是否有信号需要处理
 50     beq no_work_pending        @No, 返回.
 51     mov r0, sp @ 'regs'
 52     mov r2, why @ 'syscall'
 53     bl do_notify_resume        @去处理pending signal
 54     b ret_slow_syscall @ Check work again 跳往ret_slow_syscall,再次开始检查.
 55
 56 work_resched:
 57     bl schedule
 58 /*
 59 * "slow" syscall return path. "why" tells us if this was a real syscall.
 60 */
 61 ENTRY(ret_to_user)
 62 ret_slow_syscall:
 63     disable_irq @ disable interrupts
 64     ldr r1, [tsk, #TI_FLAGS]
 65     tst r1, #_TIF_WORK_MASK @判断该进程是否有需要处理的事物
 66     bne work_pending        @Yes, 跳往work_pending
 67 no_work_pending:
 68 /* perform architecture specific actions before user return */
 69 arch_ret_to_user r1, lr     @如果平台有特殊处理,在entry-macro.S中定义该函数。
 70
 71     restore_user_regs fast = 0, offset = 0 @顾名思义,restore user regs, usr_entry()的相反操作。下面详细介绍。
 72 ENDPROC(ret_to_user)



 91     .macro restore_user_regs, fast = 0, offset = 0
 92     ldr r1, [sp, #\offset + S_PSR] @ get calling cpsr
 93     ldr lr, [sp, #\offset + S_PC]! @ get pc
 94     msr spsr_cxsf, r1 @ save in spsr_svc
 95 #if defined(CONFIG_CPU_32v6K)
 96     clrex @ clear the exclusive monitor
 97 #elif defined (CONFIG_CPU_V6)
 98     strex r1, r2, [sp] @ clear the exclusive monitor
 99 #endif
100     .if \fast
101         ldmdb sp, {r1 - lr}^ @ get calling r1 - lr
102     .else
103         ldmdb sp, {r0 - lr}^ @ get calling r0 - lr
104     .endif
105     mov r0, r0 @ ARMv5T and earlier require a nop
106                @ after ldm {}^
107     add sp, sp, #S_FRAME_SIZE - S_PC
108     movs pc, lr @ return & move spsr_svc into cpsr
109 .endm


阅读(1657) | 评论(0) | 转发(0) |
0

上一篇:__irq_usr

下一篇:linux firmware

给主人留下些什么吧!~~