vfork.S 747 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. #include <asm/unistd.h>
  2. #ifndef __NR_vfork
  3. #define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
  4. #endif
  5. #define IMM #
  6. .text
  7. .align 2
  8. .globl errno
  9. .globl vfork
  10. .globl __libc_vfork
  11. #if defined __HAVE_ELF__
  12. .type vfork,@function
  13. .type __libc_vfork,@function
  14. #endif
  15. vfork:
  16. __libc_vfork:
  17. movl %sp@+, %a1 /* save the return address for later */
  18. movl IMM __NR_vfork,%d0
  19. trap #0
  20. movl IMM -4097, %d1
  21. cmpl %d0, %d1
  22. bcs fix_errno
  23. jmp %a1@ /* don't return, just jmp directly */
  24. fix_errno:
  25. negl %d0
  26. #ifndef __PIC__
  27. movl errno, %a0
  28. #else
  29. movl errno@GOT(%a5), %a0
  30. #endif
  31. movl %d0, %a0@
  32. movl IMM -1, %d0
  33. jmp %a1@ /* don't return, just jmp directly */