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