URL
https://opencores.org/ocsvn/or1k/or1k/trunk
Subversion Repositories or1k
[/] [or1k/] [trunk/] [linux/] [uClibc/] [libc/] [sysdeps/] [linux/] [i386/] [clone.S] - Rev 1765
Compare with Previous | Blame | View Log
/* Copyright (C) 1996,1997,98,99,2000,02,03 Free Software Foundation, Inc.This file is part of the GNU C Library.Contributed by Richard Henderson (rth@tamu.edu)The GNU C Library is free software; you can redistribute it and/ormodify it under the terms of the GNU Lesser General PublicLicense as published by the Free Software Foundation; eitherversion 2.1 of the License, or (at your option) any later version.The GNU C Library is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULesser General Public License for more details.You should have received a copy of the GNU Lesser General PublicLicense along with the GNU C Library; if not, write to the FreeSoftware Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA02111-1307 USA. *//* clone() is even more special than fork() as it mucks with stacksand invokes a function in the right context after its all over.Hacked up for uClibc by Erik Andersen <andersen@codepoet.org>*/#define _ERRNO_H 1#include <features.h>#include <bits/errno.h>/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,pid_t *ptid, struct user_desc *tls, pid_t *ctid); */#define LINKAGE 4#define PTR_SIZE 4#define PARMS LINKAGE /* no space for saved regs */#define FUNC PARMS#define STACK FUNC+4#define FLAGS STACK+PTR_SIZE#define ARG FLAGS+4#define PTID ARG+PTR_SIZE#define TLS PTID+PTR_SIZE#define CTID TLS+PTR_SIZE#define __NR_clone 120#define __NR_exit 1.text.type clone,@function;.weak clone ; clone = __clone.type __clone,@function;.globl __clone;__clone:/* Sanity check arguments. */movl $-EINVAL,%eax/* no NULL function pointers */movl FUNC(%esp),%ecxjecxz .Lclone_error/* no NULL stack pointers */movl STACK(%esp),%ecxjecxz .Lclone_error/* Insert the argument onto the new stack. Make sure the newthread is started with an alignment of (mod 16). */andl $0xfffffff0, %ecxsubl $24,%ecxmovl ARG(%esp),%eax /* no negative argument counts */movl %eax,12(%ecx)/* Save the function pointer as the zeroth argument.It will be popped off in the child in the ebx frobbing below. */movl FUNC(%esp),%eaxmovl %eax,8(%ecx)/* Don't leak any information. */movl $0,4(%ecx)movl $0,(%ecx)/* Do the system call */pushl %ebxpushl %esipushl %edimovl TLS+12(%esp),%esimovl PTID+12(%esp),%edxmovl FLAGS+12(%esp),%ebxmovl CTID+12(%esp),%edimovl $__NR_clone,%eaxint $0x80popl %edipopl %esipopl %ebxtest %eax,%eaxjl .Lclone_errorjz .Lthread_start.Lpseudo_end:ret.Lthread_start:subl %ebp,%ebp /* terminate the stack frame */call *%ebx#ifdef __PIC__call .Lhere.Lhere:popl %ebxaddl $_GLOBAL_OFFSET_TABLE_+[.-.Lhere], %ebx#endifmovl %eax, %ebxmovl $__NR_exit, %eaxint $0x80#ifdef __PIC__.Lthere:movl (%esp), %ebxret.Lclone_error:pushl %ebxcall .Lthereaddl $_GLOBAL_OFFSET_TABLE_, %ebxxorl %edx, %edxsubl %eax, %edxpushl %edxcall __errno_location@PLTpopl %ecxpopl %ebxmovl %ecx, (%eax)orl $-1, %eaxjmp .Lpseudo_end#else /* __PIC__ */.Lclone_error:negl %eaxpushl %eaxcall __errno_locationpopl %ecxmovl %ecx, (%eax)xorl %eax, %eaxdecl %eax#endif.size __clone,.-__clone
