linux: Add posix_spawnattr_{get, set}cgroup_np (BZ 26371)
[glibc.git] / sysdeps / unix / sysv / linux / mips / vfork.S
blobdc07b6652489bc0d50264173974482dcb1fd0d9b
1 /* Copyright (C) 2005-2023 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 /* vfork() is just a special case of clone().  */
20 #include <sys/asm.h>
21 #include <sysdep.h>
22 #include <sgidefs.h>
23 #include <tls.h>
26 /* int vfork() */
28         .text
29         .set            nomips16
30 LOCALSZ= 1
31 FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
32 GPOFF= FRAMESZ-(1*SZREG)
33 NESTED(__libc_vfork,FRAMESZ,sp)
34 #ifdef __PIC__
35         SETUP_GP
36 #endif
37         PTR_SUBU sp, FRAMESZ
38         cfi_adjust_cfa_offset (FRAMESZ)
39         SETUP_GP64_REG (a5, __libc_vfork)
40 #ifdef __PIC__
41         SAVE_GP (GPOFF)
42 #endif
43 #ifdef PROF
44 # if (_MIPS_SIM != _ABIO32)
45         PTR_S           a5, GPOFF(sp)
46 # endif
47         .set            noat
48         move            $1, ra
49 # if (_MIPS_SIM == _ABIO32)
50         subu            sp,sp,8
51 # endif
52         jal             _mcount
53         .set            at
54 # if (_MIPS_SIM != _ABIO32)
55         PTR_L           a5, GPOFF(sp)
56 # endif
57 #endif
59         PTR_ADDU        sp, FRAMESZ
60         cfi_adjust_cfa_offset (-FRAMESZ)
62         li              a0, 0x4112      /* CLONE_VM | CLONE_VFORK | SIGCHLD */
63         move            a1, sp
65         /* Do the system call */
66         li              v0,__NR_clone
67         syscall
69         cfi_remember_state
70         bnez            a3,L(error)
72         /* Successful return from the parent or child.  */
73         RESTORE_GP64_REG
74         ret
76         /* Something bad happened -- no child created.  */
77 L(error):
78         cfi_restore_state
79 #ifdef __PIC__
80         PTR_LA          t9, __syscall_error
81         RESTORE_GP64_REG
82         jr              t9
83 #else
84         RESTORE_GP64_REG
85         j               __syscall_error
86 #endif
87         END(__libc_vfork)
89 #if IS_IN (libc)
90 weak_alias (__libc_vfork, vfork)
91 strong_alias (__libc_vfork, __vfork)
92 libc_hidden_def (__vfork)
93 #endif