1/* vfork for Linux.
2   Copyright (C) 2022 Free Software Foundation, Inc.
3
4   This file is part of the GNU C Library.
5
6   The GNU C Library is free software; you can redistribute it and/or
7   modify it under the terms of the GNU Lesser General Public License as
8   published by the Free Software Foundation; either version 2.1 of the
9   License, or (at your option) any later version.
10
11   The GNU C Library is distributed in the hope that it will be useful,
12   but WITHOUT ANY WARRANTY; without even the implied warranty of
13   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14   Lesser General Public License for more details.
15
16   You should have received a copy of the GNU Lesser General Public
17   License along with the GNU C Library; if not, see
18   <https://www.gnu.org/licenses/>.  */
19
20#include <sysdep.h>
21#define _ERRNO_H  1
22#include <bits/errno.h>
23
24/* Clone the calling process, but without copying the whole address space.
25   The calling process is suspended until the new process exits or is
26   replaced by a call to `execve'.  Return -1 for errors, 0 to the new process,
27   and the process ID of the new process to the old process.  */
28
29ENTRY (__vfork)
30
31	li.d	a0, 0x4111 /* CLONE_VM | CLONE_VFORK | SIGCHLD */
32	add.d   a1, zero, sp
33
34	/* Do the system call.  */
35	li.d	a7, __NR_clone
36	syscall	0
37
38	blt	a0, zero ,L (error)
39
40	ret
41
42L (error):
43	b	__syscall_error
44
45END (__vfork)
46
47libc_hidden_def (__vfork)
48
49weak_alias (__vfork, vfork)
50strong_alias (__vfork, __libc_vfork)
51