vfork.S 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. /*
  2. Copyright 2002, 2015 Yoshinori Sato <ysato@users.sourceforge.jp>
  3. */
  4. #include <sys/syscall.h>
  5. #ifdef __H8300S__
  6. .h8300s
  7. #else
  8. .h8300h
  9. #endif
  10. .text
  11. .align 2
  12. .globl __vfork
  13. .hidden __vfork
  14. .type __vfork,@function
  15. __vfork:
  16. #ifdef __NR_vfork
  17. mov.l @sp+, er1
  18. sub.l er0,er0
  19. mov.b #__NR_vfork,r0l
  20. trapa #0
  21. mov.l #-4096, er2
  22. cmp.l er0,er2
  23. bcs fix_errno
  24. jmp @er1 /* don't return, just jmp directly */
  25. fix_errno:
  26. neg.l er0
  27. # if !defined(__PIC__)
  28. mov.l er0,@_errno
  29. # else
  30. mov.l @(_errno@GOTOFF,er5),er2
  31. mov.l er0,@er2
  32. # endif
  33. sub.l er0,er0
  34. dec.l #1,er0
  35. jmp @er1 /* don't return, just jmp directly */
  36. #else
  37. mov.l @sp+,er2 /* er2 = return address */
  38. mov.l #vfork_args,er1
  39. sub.l er0,er0
  40. mov.b #__NR_clone,r0l
  41. trapa #0
  42. mov.l #-4096,er1
  43. cmp.l er0,er1
  44. bcc done
  45. neg.l er0
  46. # if !defined(__PIC__)
  47. mov.l er0,@errno
  48. # else
  49. mov.l @(errno@GOTOFF,er5),er1
  50. mov.l er0,@er1
  51. # endif
  52. sub.l er0,er0
  53. dec.l #1,er0
  54. done:
  55. jmp @er2
  56. vfork_args:
  57. .long 0x00004111 /* CLONE_VFORK | CLONE_VM | SIGCHLD */
  58. .long 0
  59. .long 0
  60. .long 0
  61. .long 0
  62. #endif
  63. weak_alias(__vfork,vfork)
  64. libc_hidden_def(vfork)
  65. .end