| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 | /* Copyright (C) 2003, 2004 Free Software Foudnation, Inc.   This file is part of the GNU C Library.   Contributed by Alexandre Oliva <aoliva@redhat.com>, 2003.   The GNU C Library is free software; you can redistribute it and/or   modify it under the terms of the GNU Lesser General Public   License as published by the Free Software Foundation; either   version 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 of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   Lesser General Public License for more details.   You should have received a copy of the GNU Lesser General Public   License along with the GNU C Library; if not, write to the Free   Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307 USA.  *//* clone() is even more special than fork() as it mucks with stacks   and invokes a function in the right context after its all over.  */#include <features.h>#include <asm/unistd.h>#define _ERRNO_H	1#include <bits/errno.h>	.text	.globl	clone	.type clone,@function/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg) */clone:	/* Sanity check arguments.  */	cmp.p	gr8, gr0, icc0	cmp	gr9, gr0, icc1	mov.p	gr8, gr4	beq	icc0, #0, .Lerror	mov.p	gr11, gr5	beq	icc1, #0, .Lerror	mov.p	gr10, gr8	setlos	#__NR_clone, gr7	tra	gr0,gr0	cmp.p	gr8, gr0, icc0	setlos #-4096, gr6	cmp.p	gr8, gr6, icc1	beq	icc0, #0, .Lthread_start	blslr	icc1, #2.Lsys_error:	sethi.p	#gotofffuncdeschi(__syscall_error), gr14	setlo	#gotofffuncdesclo(__syscall_error), gr14	ldd	@(gr14, gr15), gr14	jmpl	@(gr14, gr0).Lerror:	setlos.p #-EINVAL, gr8	bra	.Lsys_error################################################################################# come here as the new thread [GR4 is fn, GR5 is arg]################################################################################.Lthread_start:	/* Save the PIC register.  */	mov	gr15, gr17	/* Call the user's function.  */	ldd.p	@(gr4, gr0), gr14	mov	gr5, gr8	calll	@(gr14, gr0)	/* Call _exit, rather simply inlining the syscall, such that	   breakpoints work.*/	mov.p	gr17, gr15	call	HIDDEN_JUMPTARGET(_exit)	/* Should never get here.  */	jmpl	@(gr0, gr0)	.size	clone,.-clone
 |