vfork.S 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. /* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
  2. Copyright (C) 2001 Hewlett-Packard Australia
  3. This program is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU Library General Public License as published by the Free
  5. Software Foundation; either version 2 of the License, or (at your option) any
  6. later version.
  7. This program is distributed in the hope that it will be useful, but WITHOUT
  8. ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  9. FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
  10. details.
  11. You should have received a copy of the GNU Library General Public License
  12. along with this program; if not, write to the Free Software Foundation, Inc.,
  13. 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  14. Derived in part from the Linux-8086 C library, the GNU C Library, and several
  15. other sundry sources. Files within this library are copyright by their
  16. respective copyright holders.
  17. */
  18. #include <features.h>
  19. #define _SYSCALL_H
  20. #include <bits/sysnum.h>
  21. #define _ERRNO_H 1
  22. #include <bits/errno.h>
  23. #include <bits/sysnum.h>
  24. /* Clone the calling process, but without copying the whole address space.
  25. The calling process is suspended until the new process exits or is
  26. replaced by a call to `execve'. Return -1 for errors, 0 to the new process,
  27. and the process ID of the new process to the old process. */
  28. .text
  29. .globl __vfork
  30. .hidden __vfork
  31. .type __vfork,@function
  32. .align 4
  33. __vfork:
  34. mov.w .L2, r3
  35. trapa #__SH_SYSCALL_TRAP_BASE
  36. mov r0, r1
  37. #ifdef __CONFIG_SH2__
  38. // 12 arithmetic shifts for the crappy sh2, because shad doesn't exist!
  39. shar r1
  40. shar r1
  41. shar r1
  42. shar r1
  43. shar r1
  44. shar r1
  45. shar r1
  46. shar r1
  47. shar r1
  48. shar r1
  49. shar r1
  50. shar r1
  51. #else
  52. mov #-12, r2
  53. shad r2, r1
  54. #endif
  55. not r1, r1 // r1=0 means r0 = -1 to -4095
  56. tst r1, r1 // i.e. error in linux
  57. bf 2f
  58. mov.w .L1, r1
  59. cmp/eq r1, r0
  60. bf/s __syscall_error
  61. mov r0, r4
  62. /* If we don't have vfork, use fork. */
  63. mov.w .L3, r3
  64. trapa #__SH_SYSCALL_TRAP_BASE
  65. mov r0, r1
  66. #ifdef __CONFIG_SH2__
  67. // 12 arithmetic shifts for the crappy sh2, because shad doesn't exist!
  68. shar r1
  69. shar r1
  70. shar r1
  71. shar r1
  72. shar r1
  73. shar r1
  74. shar r1
  75. shar r1
  76. shar r1
  77. shar r1
  78. shar r1
  79. shar r1
  80. #else
  81. mov #-12, r2
  82. shad r2, r1
  83. #endif
  84. not r1, r1 // r1=0 means r0 = -1 to -4095
  85. tst r1, r1 // i.e. error in linux
  86. bt/s __syscall_error
  87. mov r0, r4
  88. 2:
  89. rts
  90. nop
  91. .align 2
  92. .L1:
  93. .word -ENOSYS
  94. .L2:
  95. .word __NR_vfork
  96. .L3:
  97. .word __NR_fork
  98. .size __vfork, .-__vfork
  99. weak_alias(__vfork,vfork)
  100. libc_hidden_weak(vfork)
  101. #include "syscall_error.S"