]> git.ipfire.org Git - thirdparty/glibc.git/blame - sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
2.5-18.1
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / sparc / sparc32 / clone.S
CommitLineData
e853ea00
UD
1/* Copyright (C) 1996, 1997, 1998, 2000, 2003, 2004
2 Free Software Foundation, Inc.
41bdb6e2 3 This file is part of the GNU C Library.
9d187dd4 4 Contributed by Richard Henderson (rth@tamu.edu).
84384f5b 5
0c5ecdc4 6 The GNU C Library is free software; you can redistribute it and/or
41bdb6e2
AJ
7 modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
84384f5b 10
0c5ecdc4
UD
11 The GNU C Library is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
41bdb6e2 14 Lesser General Public License for more details.
84384f5b 15
41bdb6e2
AJ
16 You should have received a copy of the GNU Lesser General Public
17 License along with the GNU C Library; if not, write to the Free
18 Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
19 02111-1307 USA. */
84384f5b
UD
20
21/* clone() is even more special than fork() as it mucks with stacks
22 and invokes a function in the right context after its all over. */
0c5ecdc4 23
84384f5b
UD
24#include <asm/errno.h>
25#include <asm/unistd.h>
e853ea00 26#include <tcb-offsets.h>
0ecb606c 27#include <sysdep.h>
e853ea00
UD
28
29#define CLONE_VM 0x00000100
30#define CLONE_THREAD 0x00010000
84384f5b 31
b5bc52ef
UD
32/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
33 pid_t *ptid, void *tls, pid_t *ctid); */
84384f5b
UD
34
35 .text
0ecb606c 36ENTRY (__clone)
84384f5b 37 save %sp,-96,%sp
0ecb606c
JJ
38 cfi_def_cfa_register(%fp)
39 cfi_window_save
40 cfi_register(%o7, %i7)
0c5ecdc4 41
84384f5b 42 /* sanity check arguments */
0ecb606c 43 orcc %i0,%g0,%g2
4194bc66 44 be .Lerror
09bf6406 45 orcc %i1,%g0,%o1
4194bc66 46 be .Lerror
09bf6406 47 mov %i2,%o0
0ecb606c
JJ
48
49 /* The child_stack is the top of the stack, allocate one
50 whole stack frame from that as this is what the kernel
51 expects. */
52 sub %o1, 96, %o1
53 mov %i3, %g3
54 mov %i2, %g4
55
b5bc52ef
UD
56 /* ptid */
57 mov %i4,%o2
58 /* tls */
59 mov %i5,%o3
60 /* ctid */
61 ld [%fp+92],%o4
84384f5b 62
0c5ecdc4 63 /* Do the system call */
84384f5b
UD
64 set __NR_clone,%g1
65 ta 0x10
bf47fa23 66 bcs .Lerror
4194bc66 67 tst %o1
84384f5b 68 bne __thread_start
4194bc66 69 nop
0ecb606c 70 jmpl %i7 + 8, %g0
09bf6406 71 restore %o0,%g0,%o0
0c5ecdc4 72
4194bc66 73.Lerror:
84384f5b 74 call __errno_location
bf47fa23 75 or %g0,EINVAL,%i0
84384f5b 76 st %i0,[%o0]
0ecb606c 77 jmpl %i7 + 8, %g0
09bf6406 78 restore %g0,-1,%o0
0ecb606c 79END(__clone)
4194bc66
RH
80
81 .type __thread_start,@function
84384f5b 82__thread_start:
0ecb606c
JJ
83 cfi_startproc
84
e853ea00
UD
85#ifdef RESET_PID
86 sethi %hi(CLONE_THREAD), %l0
0ecb606c 87 andcc %g4, %l0, %g0
e853ea00 88 bne 1f
0ecb606c 89 andcc %g4, CLONE_VM, %g0
e853ea00
UD
90 bne,a 2f
91 mov -1,%o0
92 set __NR_getpid,%g1
93 ta 0x10
0ecb606c
JJ
942:
95 st %o0,[%g7 + PID]
e853ea00
UD
96 st %o0,[%g7 + TID]
971:
98#endif
0ecb606c
JJ
99 mov %g0, %fp /* terminate backtrace */
100 call %g2
101 mov %g3,%o0
84384f5b 102 call _exit,0
4194bc66
RH
103 nop
104
0ecb606c
JJ
105 cfi_endproc
106
4194bc66
RH
107 .size __thread_start, .-__thread_start
108
0ecb606c 109weak_alias (__clone, clone)