clone.S
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:5k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Taken with thanks from LinuxThreads 0.6 */
  2. /* This is no longer necessary with glibc-2.1, which has it's own clone() */
  3. #ifdef linux
  4. /* Look to see if glibc is available, and if so, what version */
  5. #include <features.h>
  6. #if (__GLIBC__ > 2) || ((__GLIBC__ == 2) && (__GLIBC_MINOR__ >= 1))
  7. #define HAVE_CLONE
  8. #endif /* glibc 2.1 or newer */
  9. #endif /* linux */
  10. #if defined(linux) && !defined(SDL_USE_PTHREADS) && !defined(HAVE_CLONE)
  11. #if defined(__i386__)
  12. /************************************************************************/
  13. /* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
  14.    Contributed by Richard Henderson (rth@tamu.edu)
  15. The GNU C Library is free software; you can redistribute it and/or
  16. modify it under the terms of the GNU Library General Public License as
  17. published by the Free Software Foundation; either version 2 of the
  18. License, or (at your option) any later version.
  19. The GNU C Library is distributed in the hope that it will be useful,
  20. but WITHOUT ANY WARRANTY; without even the implied warranty of
  21. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  22. Library General Public License for more details.
  23. You should have received a copy of the GNU Library General Public
  24. License along with the GNU C Library; see the file COPYING.LIB.  If
  25. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  26. #ifdef SAVE_RCSID
  27. static char rcsid =
  28.  "@(#) $Id: clone.S,v 1.4 2002/04/22 21:38:03 wmay Exp $";
  29. #endif
  30. Cambridge, MA 02139, USA.  */
  31. /* clone() is even more special than fork() as it mucks with stacks
  32.    and invokes a function in the right context after its all over.  */
  33. #include <asm/errno.h>
  34. #include <asm/unistd.h>
  35. /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
  36.         .text
  37. .align 4
  38. .globl __clone
  39.         .type   __clone,@function
  40. .weak clone
  41. clone   = __clone
  42. __clone:
  43. /* Sanity check arguments.  */
  44. movl $-EINVAL,%eax
  45. movl 4(%esp),%ecx /* no NULL function pointers */
  46. testl %ecx,%ecx
  47. jz syscall_error
  48. movl 8(%esp),%ecx /* no NULL stack pointers */
  49. testl %ecx,%ecx
  50. jz syscall_error
  51. /* Insert the argument onto the new stack.  */
  52. subl $8,%ecx
  53. movl 16(%esp),%eax
  54. movl %eax,4(%ecx)
  55. /* Save the function pointer as the zeroth argument. */
  56. /* It will be popped off in the child in the ebx frobbing below.  */
  57. movl 4(%esp),%eax
  58. movl %eax,0(%ecx)
  59. /* Do the system call */
  60. pushl %ebx
  61. movl 16(%esp),%ebx
  62. movl $__NR_clone,%eax
  63. int $0x80
  64. popl %ebx
  65. test %eax,%eax
  66. jl syscall_error
  67. jz thread_start
  68. ret
  69. syscall_error:
  70. negl    %eax
  71.         pushl   %eax
  72. #ifdef __PIC__
  73.         call    __errno_location@PLT
  74. #else
  75.         call    __errno_location
  76. #endif
  77.         popl    0(%eax)
  78. movl $-1, %eax
  79. ret
  80. thread_start:
  81. subl %ebp,%ebp /* terminate the stack frame */
  82. call *%ebx
  83.         pushl   %eax
  84. #ifdef __PIC__
  85. call _exit@PLT
  86. #else
  87. call _exit
  88. #endif
  89. /************************************************************************/
  90. #elif defined(sparc)
  91. /************************************************************************/
  92. /* Copyright (C) 1996, 1997 Free Software Foundation, Inc.
  93.    Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx)
  94.    Based on code written for the Intel by Richard 
  95.    Henderson (rth@tamu.edu)
  96. The GNU C Library is free software; you can redistribute it and/or
  97. modify it under the terms of the GNU Library General Public License as
  98. published by the Free Software Foundation; either version 2 of the
  99. License, or (at your option) any later version.
  100. The GNU C Library is distributed in the hope that it will be useful,
  101. but WITHOUT ANY WARRANTY; without even the implied warranty of
  102. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  103. Library General Public License for more details.
  104. You should have received a copy of the GNU Library General Public
  105. License along with the GNU C Library; see the file COPYING.LIB.  If
  106. not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  107. Cambridge, MA 02139, USA.  */
  108. /* clone() is even more special than fork() as it mucks with stacks
  109.    and invokes a function in the right context after its all over.  */
  110. #include <asm/errno.h>
  111. #include <asm/unistd.h>
  112. /* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
  113. .text
  114. .align 4
  115. .globl __clone
  116. .type __clone,@function
  117. .weak clone
  118. clone   = __clone
  119. __clone:
  120. save %sp,-96,%sp
  121. /* sanity check arguments */
  122. tst %i0
  123. be __clone_syscall_error
  124. tst %i1
  125. be __clone_syscall_error
  126.         nop
  127. /* Do the system call */
  128. mov %i1,%o1
  129. mov %i2,%o0
  130. set __NR_clone,%g1
  131. ta 0x10
  132. bcs __clone_syscall_error
  133. tst %o1
  134. bne __thread_start
  135. nop
  136. mov %o0,%i0
  137. ret
  138. restore
  139. __clone_syscall_error:
  140. call __errno_location
  141. set EINVAL,%i0
  142. st %i0,[%o0]
  143. mov -1,%i0
  144. ret
  145. restore
  146. __thread_start:
  147. call %i0
  148. mov %i3,%o0
  149. call _exit,0
  150. nop
  151. /************************************************************************/
  152. #else 
  153. #error "Unknown Linux architecture"
  154. #endif
  155. #endif /* Linux && ! SDL_USE_PTHREADS */