LoongArch: Update ulps
[glibc.git] / sysdeps / unix / sysv / linux / sh / clone.S
blob355a542bc59451dfc06395044706515ab52437e4
1 /* Copyright (C) 1999-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>
24 #include <tcb-offsets.h>
26 /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
27              pid_t *ptid, void *tls, pid_t *ctid); */
29         .text
30 ENTRY(__clone)
31         /* sanity check arguments.  */
32         tst     r4, r4
33         bt/s    0f
34          tst    r5, r5
35         bf      1f
37         bra     .Lsyscall_error
38          mov    #-EINVAL,r0
40         /* insert the args onto the new stack */
41         mov.l   r7, @-r5
42         /* save the function pointer as the 0th element */
43         mov.l   r4, @-r5
45         /* do the system call */
46         mov     r6, r4
47         mov.l   @r15, r6
48         mov.l   @(8,r15), r7
49         mov.l   @(4,r15), r0
50         mov     #+SYS_ify(clone), r3
51         trapa   #0x15
52         mov     r0, r1
53         mov     #-12, r2
54         shad    r2, r1
55         not     r1, r1                  // r1=0 means r0 = -1 to -4095
56         tst     r1, r1                  // i.e. error in linux
57         bf      .Lclone_end
58 .Lsyscall_error:
59         SYSCALL_ERROR_HANDLER
60 .Lclone_end:
61         tst     r0, r0
62         bt      2f
63 .Lpseudo_end:
64         rts
65          nop
67         /* terminate the stack frame */
68         mov     #0, r14
70         /* thread starts */
71         mov.l   @r15, r1
72         jsr     @r1
73          mov.l  @(4,r15), r4
75         /* we are done, passing the return value through r0  */
76         mov     r0, r4
77         mov     #+SYS_ify(exit), r3
78         trapa   #0x15
79         .align  2
80 .LG:
81         .long   _GLOBAL_OFFSET_TABLE_
82 .L3:
83         .long   PLTJMP(C_SYMBOL_NAME(_exit))
84 PSEUDO_END (__clone)
86 libc_hidden_def (__clone)
87 weak_alias (__clone, clone)