1/* Copyright (C) 1999-2022 Free Software Foundation, Inc.
2   This file is part of the GNU C Library.
3
4   The GNU C Library is free software; you can redistribute it and/or
5   modify it under the terms of the GNU Lesser General Public
6   License as published by the Free Software Foundation; either
7   version 2.1 of the License, or (at your option) any later version.
8
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   Lesser General Public License for more details.
13
14   You should have received a copy of the GNU Lesser General Public
15   License along with the GNU C Library.  If not, see
16   <https://www.gnu.org/licenses/>.  */
17
18#include <sysdep.h>
19#define _ERRNO_H	1
20#include <bits/errno.h>
21#include <tcb-offsets.h>
22
23/* Clone the calling process, but without copying the whole address space.
24   The calling process is suspended until the new process exits or is
25   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
26   and the process ID of the new process to the old process.  */
27
28ENTRY (__vfork)
29
30	/* Pop the return PC value into A0.  */
31	movel	%sp@+, %a0
32	cfi_adjust_cfa_offset (-4)
33	cfi_register (%pc, %a0)
34
35	/* Stuff the syscall number in D0 and trap into the kernel.  */
36	movel	#SYS_ify (vfork), %d0
37	trap	#0
38
39	tstl	%d0
40	jmi	.Lerror		/* Branch forward if it failed.  */
41
42	/* Jump to the return PC.  */
43	jmp	%a0@
44
45.Lerror:
46	/* Push back the return PC.  */
47	movel	%a0,%sp@-
48	cfi_adjust_cfa_offset (4)
49	cfi_rel_offset (%pc, 0)
50
51#ifndef PIC
52	jbra	SYSCALL_ERROR_LABEL
53#endif
54
55PSEUDO_END (__vfork)
56libc_hidden_def (__vfork)
57
58weak_alias (__vfork, vfork)
59strong_alias (__vfork, __libc_vfork)
60