···7474void start_thread(struct pt_regs *regs, unsigned long fdptr, unsigned long sp);7575void release_thread(struct task_struct *);76767777-/* Create a new kernel thread. */7878-extern long kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);7979-8077/* Lazy FPU handling on uni-processor */8178extern struct task_struct *last_task_used_math;8279extern struct task_struct *last_task_used_altivec;
+11
arch/powerpc/kernel/entry_32.S
···435435 li r3,0436436 b ret_from_syscall437437438438+ .globl ret_from_kernel_thread439439+ret_from_kernel_thread:440440+ REST_NVGPRS(r1)441441+ bl schedule_tail442442+ mtlr r14443443+ mr r3,r15444444+ PPC440EP_ERR42445445+ blrl446446+ li r3,0447447+ b do_exit # no return448448+438449/* Traced system call support */439450syscall_dotrace:440451 SAVE_NVGPRS(r1)
+10
arch/powerpc/kernel/entry_64.S
···370370 li r3,0371371 b syscall_exit372372373373+_GLOBAL(ret_from_kernel_thread)374374+ bl .schedule_tail375375+ REST_NVGPRS(r1)376376+ REST_GPR(2,r1)377377+ mtlr r14378378+ mr r3,r15379379+ blrl380380+ li r3,0381381+ b .do_exit # no return382382+373383 .section ".toc","aw"374384DSCR_DEFAULT:375385 .tc dscr_default[TC],dscr_default
-33
arch/powerpc/kernel/misc_32.S
···663663 sub r3,r3,r4664664 blr665665666666-/*667667- * Create a kernel thread668668- * kernel_thread(fn, arg, flags)669669- */670670-_GLOBAL(kernel_thread)671671- stwu r1,-16(r1)672672- stw r30,8(r1)673673- stw r31,12(r1)674674- mr r30,r3 /* function */675675- mr r31,r4 /* argument */676676- ori r3,r5,CLONE_VM /* flags */677677- oris r3,r3,CLONE_UNTRACED>>16678678- li r4,0 /* new sp (unused) */679679- li r0,__NR_clone680680- sc681681- bns+ 1f /* did system call indicate error? */682682- neg r3,r3 /* if so, make return code negative */683683-1: cmpwi 0,r3,0 /* parent or child? */684684- bne 2f /* return if parent */685685- li r0,0 /* make top-level stack frame */686686- stwu r0,-16(r1)687687- mtlr r30 /* fn addr in lr */688688- mr r3,r31 /* load arg and call fn */689689- PPC440EP_ERR42690690- blrl691691- li r0,__NR_exit /* exit if function returns */692692- li r3,0693693- sc694694-2: lwz r30,8(r1)695695- lwz r31,12(r1)696696- addi r1,r1,16697697- blr698698-699666#ifdef CONFIG_SMP700667_GLOBAL(start_secondary_resume)701668 /* Reset stack */
-34
arch/powerpc/kernel/misc_64.S
···407407408408409409/*410410- * Create a kernel thread411411- * kernel_thread(fn, arg, flags)412412- */413413-_GLOBAL(kernel_thread)414414- std r29,-24(r1)415415- std r30,-16(r1)416416- stdu r1,-STACK_FRAME_OVERHEAD(r1)417417- mr r29,r3418418- mr r30,r4419419- ori r3,r5,CLONE_VM /* flags */420420- oris r3,r3,(CLONE_UNTRACED>>16)421421- li r4,0 /* new sp (unused) */422422- li r0,__NR_clone423423- sc424424- bns+ 1f /* did system call indicate error? */425425- neg r3,r3 /* if so, make return code negative */426426-1: cmpdi 0,r3,0 /* parent or child? */427427- bne 2f /* return if parent */428428- li r0,0429429- stdu r0,-STACK_FRAME_OVERHEAD(r1)430430- ld r2,8(r29)431431- ld r29,0(r29)432432- mtlr r29 /* fn addr in lr */433433- mr r3,r30 /* load arg and call fn */434434- blrl435435- li r0,__NR_exit /* exit after child exits */436436- li r3,0437437- sc438438-2: addi r1,r1,STACK_FRAME_OVERHEAD439439- ld r29,-24(r1)440440- ld r30,-16(r1)441441- blr442442-443443-/*444410 * disable_kernel_fp()445411 * Disable the FPU.446412 */