6092bd9fd4375e0ce4ef32a24ae68c11b49ae17d
[kopensolaris-gnu/glibc.git] / linuxthreads / sysdeps / unix / sysv / linux / arm / vfork.S
1 /* Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3    Contributed by Philip Blundell <philb@gnu.org>.
4
5    The GNU C Library is free software; you can redistribute it and/or
6    modify it under the terms of the GNU Lesser General Public
7    License as published by the Free Software Foundation; either
8    version 2.1 of the License, or (at your option) any later version.
9
10    The GNU C Library is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13    Lesser General Public License for more details.
14
15    You should have received a copy of the GNU Lesser General Public
16    License along with the GNU C Library; if not, write to the Free
17    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
18    02111-1307 USA.  */
19
20 #include <sysdep-cancel.h>
21 #define _ERRNO_H        1
22 #include <bits/errno.h>
23
24 /* Clone the calling process, but without copying the whole address
25 pace.
26    The calling process is suspended until the new process exits or is
27    replaced by a call to `execve'.  Return -1 for errors, 0 to the new
28 rocess,
29    and the process ID of the new process to the old process.  */
30
31         PSEUDO_PROLOGUE
32
33 ENTRY (__vfork)
34
35 #ifdef __NR_vfork
36         SINGLE_THREAD_P
37         bne     HIDDEN_JUMPTARGET (__fork)
38         swi     __NR_vfork
39         cmn     a1, #4096
40         RETINSTR(movcc, pc, lr)
41
42         /* Check if vfork syscall is known at all.  */
43         ldr     a2, =-ENOSYS
44         teq     a1, a2
45         bne     PLTJMP(C_SYMBOL_NAME(__syscall_error))
46 #endif
47
48         /* If we don't have vfork, fork is close enough.  */
49         swi     __NR_fork
50         cmn     a1, #4096
51         RETINSTR(movcc, pc, lr)
52         b       PLTJMP(C_SYMBOL_NAME(__syscall_error))
53
54 PSEUDO_END (__vfork)
55 libc_hidden_def (__vfork)
56
57 weak_alias (__vfork, vfork)