vfork.S 856 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. /* vi: set sw=4 ts=4: */
  2. /* vfork for uClibc
  3. *
  4. * Copyright (C) 2000 by Lineo, inc. and Erik Andersen
  5. * Copyright (C) 2000,2001 by Erik Andersen <andersen@uclibc.org>
  6. * Written by Erik Andersen <andersen@uclibc.org>
  7. *
  8. * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
  9. */
  10. #include <features.h>
  11. #define _ERRNO_H
  12. #include <bits/errno.h>
  13. #include <sys/syscall.h>
  14. #ifdef __NR_fork
  15. .text
  16. .global vfork
  17. .type vfork,%function
  18. .align 4
  19. vfork:
  20. #ifdef __NR_vfork
  21. swi __NR_vfork
  22. cmn r0, #4096
  23. movcc pc, lr
  24. /* Check if vfork even exists. */
  25. ldr r1, =-ENOSYS
  26. teq r0, r1
  27. bne __error
  28. #endif
  29. /* If we don't have vfork, use fork. */
  30. swi __NR_fork
  31. cmn r0, #4096
  32. /* Syscall worked. Return to child/parent */
  33. movcc pc, lr
  34. __error:
  35. b __syscall_error
  36. .size vfork,.-vfork
  37. libc_hidden_def(vfork)
  38. #endif