sparc64: Remove unwind information from signal return stubs [BZ#31244]
[glibc.git] / sysdeps / unix / sysv / linux / alpha / clone.S
blob747a68d7fe1ecc9c7031e53587ecb399faa2eb91
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 <sysdep.h>
22 #define _ERRNO_H        1
23 #include <bits/errno.h>
25 /* int clone(int (*fn)(void *arg), void *child_stack, int flags,
26              void *arg, pid_t *ptid, void *tls, pid_t *ctid);
28    Note that everything past ARG is technically optional, based
29    on FLAGS, and that CTID is arg 7, and thus is on the stack.
30    However, since a load from top-of-stack better be legal always,
31    we don't bother checking FLAGS.  */
33         .text
34         .align  4
35         .globl  __clone
36         .ent    __clone
37         .usepv  __clone, USEPV_PROF
39         cfi_startproc
40 __clone:
41 #ifdef PROF
42         .set noat
43         ldgp    gp,0(pv)
44         lda     AT, _mcount
45         jsr     AT, (AT), _mcount
46         .set at
47 #endif
49         /* Sanity check arguments.  */
50         ldiq    v0, EINVAL
51         beq     a0, SYSCALL_ERROR_LABEL /* no NULL function pointers */
52         beq     a1, SYSCALL_ERROR_LABEL /* no NULL stack pointers */
54         /* Save the fn ptr and arg on the new stack.  */
55         subq    a1, 32, a1
56         stq     a0, 0(a1)
57         stq     a3, 8(a1)
58         stq     a2, 16(a1)
60         /* The syscall is of the form clone(flags, usp, ptid, ctid, tls).
61            Shift the flags, ptid, ctid, tls arguments into place; the
62            child_stack argument is already correct.  */
63         mov     a2, a0
64         mov     a4, a2
65         ldq     a3, 0(sp)
66         mov     a5, a4
68         /* Do the system call.  */
69         ldiq    v0, __NR_clone
70         call_pal PAL_callsys
72         bne     a3, SYSCALL_ERROR_LABEL
73         beq     v0, thread_start
75         /* Successful return from the parent.  */
76         ret
78 PSEUDO_END(__clone)
79         cfi_endproc
81 /* Load up the arguments to the function.  Put this block of code in
82    its own function so that we can terminate the stack trace with our
83    debug info.  */
85         .align  4
86         .ent thread_start
87         cfi_startproc
88 thread_start:
89         mov     0, fp
90         cfi_def_cfa_register(fp)
91         cfi_undefined(ra)
93         /* Load up the arguments.  */
94         ldq     pv, 0(sp)
95         ldq     a0, 8(sp)
96         addq    sp, 32, sp
98         /* Call the user's function.  */
99         jsr     ra, (pv)
100         ldgp    gp, 0(ra)
102         mov     v0, a0
103         ldiq    v0, __NR_exit
104         call_pal PAL_callsys
106         /* Die horribly.  */
107         .align  4
108         halt
110         .align  4
111         cfi_endproc
112         .end thread_start
114 libc_hidden_def (__clone)
115 weak_alias (__clone, clone)