clone.s
来自「它通过提供glibc兼容使得应用程序移植到较小的c 库时相当得容易. 它能够应用」· S 代码 · 共 86 行
S
86 行
/* Adapted from glibc *//* Copyright (C) 1996, 1997 Free Software Foundation, Inc. *//* clone is even more special than fork as it mucks with stacks and invokes a function in the right context after its all over. */#define _ERRNO_H#include <bits/errno.h>#include <sys/syscall.h>/* int _clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */.text.align 4.type clone,@function.globl clone;clone:.type __clone,@function.globl __clone;__clone: /* Sanity check arguments. */ movel #-EINVAL, %d0 movel 4(%sp), %d1 /* no NULL function pointers */ movel %d1, %a0 tstl %d1 beq.w __syscall_error movel 8(%sp), %d1 /* no NULL stack pointers */ movel %d1, %a1 tstl %d1 beq.w __syscall_error /* Allocate space and copy the argument onto the new stack. */ movel 16(%sp), -(%a1) /* Do the system call */#if 1 /* defined (CONFIG_COLDFIRE) */ movel %d2, %d1 /* save %d2 and get stack pointer */ movel %a1, %d2 movel %d1, %a1#else exg %d2, %a1 /* save %d2 and get stack pointer */#endif movel 12(%sp), %d1 /* get flags */ movel #__NR_clone, %d0 trap #0#if 1 /* defined (CONFIG_COLDFIRE) */ movel %d2, %d1 /* restore %d2 */ movel %a1, %d2 movel %d1, %a1#else exg %d2, %a1 /* restore %d2 */#endif tstl %d0 bmi.w __syscall_error beq.w thread_start rts__syscall_error: negl %d0 movel %d0, %sp@- lea __errno_location-.-8, %a0 jsr %pc@(%a0) movel %d0, %a0 movel %sp@+, %a0@ moveq #-1, %d0 rtsthread_start: /*subl %fp, %fp*/ /* terminate the stack frame */ jsr (%a0) movel %d0, -(%sp) movel #__NR_exit, %d0 trap #0 /*jsr exit*/#if defined(__HAVE_ELF__) .weak clone clone = __clone#else .set clone,__clone#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?