summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/csky/clone.c
diff options
context:
space:
mode:
authorGuo Ren <ren_guo@c-sky.com>2017-10-15 20:59:34 +0800
committerWaldemar Brodkorb <wbx@uclibc-ng.org>2017-11-19 09:20:11 +0100
commit2fcffe26e815b7125a357c83b59617ab93c16b41 (patch)
treefe5a973dc4bbf38bce8468a4497f5f656f082a9f /libc/sysdeps/linux/csky/clone.c
parent9e38e0aa45cca21d5023d0af94377f0e1e41d2f4 (diff)
csky: port to uclibc-ng
Follow the steps to build c-sky uclibc linux system: 1. git clone https://github.com/c-sky/buildroot.git 2. cd buildroot 3. make qemu_csky_ck810_uclibc_defconfig 4. make Follow the buildroot/board/qemu/csky/readme.txt to run. This buildroot toolchain is pre-build, But you can rebuild the c-sky uclibc-ng alone and install it to the buildroot sysroot manually. We'll try our best to improve the uclibc-ng continuously. Signed-off-by: Guo Ren <ren_guo@c-sky.com>
Diffstat (limited to 'libc/sysdeps/linux/csky/clone.c')
-rw-r--r--libc/sysdeps/linux/csky/clone.c47
1 files changed, 47 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/csky/clone.c b/libc/sysdeps/linux/csky/clone.c
new file mode 100644
index 000000000..97c30d027
--- /dev/null
+++ b/libc/sysdeps/linux/csky/clone.c
@@ -0,0 +1,47 @@
+#include <stdarg.h>
+#include <sysdep.h>
+#include <unistd.h>
+
+extern int __syscall_error(int err_no);
+
+extern int __csky_clone (
+ int flags,
+ void *child_stack,
+ pid_t *ptid,
+ pid_t *ctid,
+ void *tls);
+
+int __clone(
+ int (*fn)(void *),
+ void *child_stack,
+ int flags,
+ void *arg, ...)
+{
+ void *ptid;
+ void *tls;
+ void *ctid;
+ va_list al;
+ int err;
+
+ va_start(al, arg);
+ ptid = va_arg(al, void *);
+ tls = va_arg(al, void *);
+ ctid = va_arg(al, void *);
+ va_end(al);
+
+ err = EINVAL;
+ if (!fn)
+ goto err;
+ if (!child_stack)
+ goto err;
+
+ /* prepare fn&arg in child_stack */
+ child_stack = (void *)((unsigned int)child_stack - 8);
+ *(unsigned int *)child_stack = (unsigned int)fn;
+ *(unsigned int *)(child_stack + 4) = (unsigned int)arg;
+
+ return __csky_clone(flags, child_stack, ptid, ctid, tls);
+err:
+ return __syscall_error(-err);
+}
+weak_alias(__clone, clone)