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