Add support/ code for checking file contents
[glibc.git] / sysdeps / unix / sysv / linux / sparc / sparc32 / clone.S
blobc9cf9bb055bc0c5cba57d14cbe27d44877e28dd3
1 /* Copyright (C) 1996-2024 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, see
16    <https://www.gnu.org/licenses/>.  */
18 /* clone() is even more special than fork() as it mucks with stacks
19    and invokes a function in the right context after its all over.  */
21 #include <asm/errno.h>
22 #include <tcb-offsets.h>
23 #include <sysdep.h>
25 /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
26              pid_t *ptid, void *tls, pid_t *ctid); */
28         .text
29 ENTRY (__clone)
30         save    %sp,-96,%sp
31         save    %sp,-96,%sp
32         flushw
33         restore
34         cfi_def_cfa_register(%fp)
35         cfi_window_save
36         cfi_register(%o7, %i7)
38         /* sanity check arguments */
39         orcc    %i0,%g0,%g2
40         be      .Leinval
41          orcc   %i1,%g0,%o1
42         be      .Leinval
43          mov    %i2,%o0
45         /* The child_stack is the top of the stack, allocate one
46            whole stack frame from that as this is what the kernel
47            expects.  */
48         sub     %o1, 96, %o1
49         mov     %i3, %g3
51         /* ptid */
52         mov     %i4,%o2
53         /* tls */
54         mov     %i5,%o3
55         /* ctid */
56         ld      [%fp+92],%o4
58         /* Do the system call */
59         set     __NR_clone,%g1
60         ta      0x10
61         bcs     .Lerror
62          tst    %o1
63         bne     __thread_start
64          nop
65         jmpl    %i7 + 8, %g0
66          restore %o0,%g0,%o0
68 .Leinval:
69         mov     EINVAL, %o0
70 .Lerror:
71         call    HIDDEN_JUMPTARGET(__errno_location)
72          mov    %o0, %i0
73         st      %i0,[%o0]
74         jmpl    %i7 + 8, %g0
75          restore %g0,-1,%o0
76 END(__clone)
78         .type   __thread_start,@function
79 __thread_start:
80         mov     %g0, %fp        /* terminate backtrace */
81         call    %g2
82          mov    %g3,%o0
83         set     __NR_exit, %g1
84         ta      0x10
85          nop
87         .size   __thread_start, .-__thread_start
89 libc_hidden_def (__clone)
90 weak_alias (__clone, clone)