clone.c 891 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #include <stdarg.h>
  2. #include <sysdep.h>
  3. #include <unistd.h>
  4. extern int __syscall_error(int err_no);
  5. extern int __csky_clone (
  6. int flags,
  7. void *child_stack,
  8. pid_t *ptid,
  9. pid_t *ctid,
  10. void *tls);
  11. int __clone(
  12. int (*fn)(void *),
  13. void *child_stack,
  14. int flags,
  15. void *arg, ...)
  16. {
  17. void *ptid;
  18. void *tls;
  19. void *ctid;
  20. va_list al;
  21. int err;
  22. va_start(al, arg);
  23. ptid = va_arg(al, void *);
  24. tls = va_arg(al, void *);
  25. ctid = va_arg(al, void *);
  26. va_end(al);
  27. err = EINVAL;
  28. if (!fn)
  29. goto err;
  30. if (!child_stack)
  31. goto err;
  32. /* prepare fn&arg in child_stack */
  33. child_stack = (void *)((unsigned int)child_stack - 8);
  34. *(unsigned int *)child_stack = (unsigned int)fn;
  35. *(unsigned int *)(child_stack + 4) = (unsigned int)arg;
  36. return __csky_clone(flags, child_stack, ptid, ctid, tls);
  37. err:
  38. return __syscall_error(-err);
  39. }
  40. weak_alias(__clone, clone)