1 /*
2  * Copyright (C) 2017 Hangzhou C-SKY Microsystems co.,ltd.
3  *
4  * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB
5  * in this tarball.
6  */
7 
8 #include <stdarg.h>
9 #include <sysdep.h>
10 #include <unistd.h>
11 
12 extern long __syscall_error(int err_no);
13 
14 extern int __csky_clone (
15   int flags,
16   void *child_stack,
17   pid_t *ptid,
18   pid_t *ctid,
19   void *tls);
20 
__clone(int (* fn)(void *),void * child_stack,int flags,void * arg,...)21 int __clone(
22   int (*fn)(void *),
23   void *child_stack,
24   int flags,
25   void *arg, ...)
26 {
27   void *ptid;
28   void *tls;
29   void *ctid;
30   va_list al;
31   int err;
32 
33   va_start(al, arg);
34   ptid = va_arg(al, void *);
35   tls = va_arg(al, void *);
36   ctid = va_arg(al, void *);
37   va_end(al);
38 
39   err = EINVAL;
40   if (!fn)
41     goto err;
42   if (!child_stack)
43     goto err;
44 
45   /* prepare fn&arg in child_stack */
46   child_stack = (void *)((unsigned int)child_stack - 8);
47   *(unsigned int *)child_stack = (unsigned int)fn;
48   *(unsigned int *)(child_stack + 4) = (unsigned int)arg;
49 
50   return __csky_clone(flags, child_stack, ptid, ctid, tls);
51 err:
52   return __syscall_error(-err);
53 }
54 weak_alias(__clone, clone)
55