*参照元 [#re495ec0] #backlinks *説明 [#r62ab32a] -パス: [[linux-2.6.33/arch/arm/kernel/entry-common.S]] -FIXME: これは何? --説明 **引数 [#de2367c2] - -- **返り値 [#q4954290] - -- **参考 [#q7662905] *実装 [#jc8c2a63] .align 5 /* * This is the fast syscall return path. We do as little as * possible here, and this includes saving r0 back into the SVC * stack. */ ret_fast_syscall: UNWIND(.fnstart ) UNWIND(.cantunwind ) - --[[linux-2.6.33/UNWIND()]] disable_irq @ disable interrupts - --[[linux-2.6.33/disable_irq()]] ldr r1, [tsk, #TI_FLAGS] tst r1, #_TIF_WORK_MASK bne fast_work_pending - --[[linux-2.6.33/TI_FLAGS]] --[[linux-2.6.33/_TIF_WORK_MASK]] --[[linux-2.6.33/fast_work_pending()]] /* perform architecture specific actions before user return */ arch_ret_to_user r1, lr - --[[linux-2.6.33/arch_ret_to_user()]] restore_user_regs fast = 1, offset = S_OFF UNWIND(.fnend ) - --[[linux-2.6.33/S_OFF]] --[[linux-2.6.33/restore_user_regs()]] /* * Ok, we need to do extra processing, enter the slow path. */ fast_work_pending: str r0, [sp, #S_R0+S_OFF]! @ returned r0 work_pending: tst r1, #_TIF_NEED_RESCHED bne work_resched - --[[linux-2.6.33/S_R0]] --[[linux-2.6.33/_TIF_NEED_RESCHED]] --[[linux-2.6.33/work_resched()]] tst r1, #_TIF_SIGPENDING|_TIF_NOTIFY_RESUME beq no_work_pending - --[[linux-2.6.33/_TIF_SIGPENDING]] --[[linux-2.6.33/_TIF_NOTIFY_RESUME]] --[[linux-2.6.33/no_work_pending()]] mov r0, sp @ 'regs' mov r2, why @ 'syscall' bl do_notify_resume - --[[linux-2.6.33/do_notify_resume()]] b ret_slow_syscall @ Check work again - --[[linux-2.6.33/ret_slow_syscall()]] work_resched: bl schedule - --[[linux-2.6.33/schedule()]] *コメント [#k3d01376]