1 /* Auxiliary functions to issue the clone syscall.
2    Copyright (C) 2021-2022 Free Software Foundation, Inc.
3    This file is part of the GNU C Library.
4 
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9 
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14 
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, see
17    <https://www.gnu.org/licenses/>.  */
18 
19 #ifdef __linux__
20 # include <support/check.h>
21 # include <stackinfo.h>  /* For _STACK_GROWS_{UP,DOWN}.  */
22 # include <xsched.h>
23 
24 pid_t
xclone(int (* fn)(void * arg),void * arg,void * stack,size_t stack_size,int flags)25 xclone (int (*fn) (void *arg), void *arg, void *stack, size_t stack_size,
26 	int flags)
27 {
28   pid_t r = -1;
29 
30 # ifdef __ia64__
31   extern int __clone2 (int (*fn) (void *arg), void *stack, size_t stack_size,
32 		       int flags, void *arg, ...);
33   r = __clone2 (fn, stack, stack_size, flags, arg, /* ptid */ NULL,
34 		/* tls */ NULL, /* ctid  */ NULL);
35 # else
36 #  if _STACK_GROWS_DOWN
37   r = clone (fn, stack + stack_size, flags, arg, /* ptid */ NULL,
38 	     /* tls */ NULL, /* ctid */  NULL);
39 #  elif _STACK_GROWS_UP
40   r = clone (fn, stack, flags, arg, /* ptid */ NULL, /* tls */ NULL, NULL);
41 #  endif
42 # endif
43 
44   if (r < 0)
45     FAIL_EXIT1 ("clone: %m");
46 
47   return r;
48 }
49 #endif
50