]>
Commit | Line | Data |
---|---|---|
ae1025be UD |
1 | /* Copyright (C) 1991, 92, 93, 94, 95, 97 Free Software Foundation, Inc. |
2 | This file is part of the GNU C Library. | |
6408bdde | 3 | |
ae1025be UD |
4 | The GNU C Library is free software; you can redistribute it and/or |
5 | modify it under the terms of the GNU Library General Public License as | |
6 | published by the Free Software Foundation; either version 2 of the | |
7 | License, or (at your option) any later version. | |
6408bdde | 8 | |
ae1025be UD |
9 | The GNU C Library is distributed in the hope that it will be useful, |
10 | but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
12 | Library General Public License for more details. | |
6408bdde | 13 | |
ae1025be UD |
14 | You should have received a copy of the GNU Library General Public |
15 | License along with the GNU C Library; see the file COPYING.LIB. If not, | |
16 | write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
17 | Boston, MA 02111-1307, USA. */ | |
6408bdde RM |
18 | |
19 | #include <sysdep.h> | |
20 | ||
21 | #ifndef SYS_vfork | |
22 | #define SYS_vfork 66 | |
23 | #endif | |
24 | ||
25 | /* Clone the calling process, but without copying the whole address space. | |
3081378b | 26 | The calling process is suspended until the the new process exits or is |
6408bdde RM |
27 | replaced by a call to `execve'. Return -1 for errors, 0 to the new process, |
28 | and the process ID of the new process to the old process. */ | |
29 | .globl ___vfork | |
30 | ___vfork: | |
31 | /* Pop the return PC value into A0. */ | |
32 | movel sp@+, a0 | |
33 | ||
34 | /* Push the syscall number and trap into the kernel. */ | |
35 | movel #SYS_vfork, sp@- | |
36 | trap #0 | |
37 | bcs error /* Branch forward if it failed. */ | |
38 | ||
39 | /* It succeeded. See which fork we're in. D1 is now 0 for the | |
40 | parent and 1 for the child. Decrement it to make it -1 (all | |
41 | bits set) for the parent, and 0 (no bits set) for the child. | |
42 | Then AND it with D0, so the parent gets D0&-1==R0, and the child | |
43 | gets D0&0==0. */ | |
7176f4e4 | 44 | subql #1, d1 |
6408bdde RM |
45 | andl d1, d0 |
46 | ||
47 | /* Jump to the return PC. */ | |
48 | jmp a0@ | |
49 | ||
50 | error: | |
51 | movel d0, _errno | |
52 | moveq #-1, d0 | |
53 | jmp a0@ | |
54 | ||
55 | weak_alias (__vfork, vfork) |