1/* Copyright (C) 2005 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   <http://www.gnu.org/licenses/>.  */
17
18/* vfork() is just a special case of clone().  */
19
20#include <sys/syscall.h>
21#include <sys/asm.h>
22#include <sysdep.h>
23
24#ifdef __NR_fork
25
26/* int vfork() */
27
28	.text
29	.hidden __vfork
30LOCALSZ= 1
31FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
32GPOFF= FRAMESZ-(1*SZREG)
33NESTED(__vfork,FRAMESZ,sp)
34#ifdef __PIC__
35	SETUP_GP
36#endif
37	PTR_SUBU sp, FRAMESZ
38	SETUP_GP64 (a5, __vfork)
39#ifdef __PIC__
40	SAVE_GP (GPOFF)
41#endif
42
43	PTR_ADDU	sp, FRAMESZ
44
45	li		a0, 0x4112	/* CLONE_VM | CLONE_VFORK | SIGCHLD */
46	move		a1, sp
47
48	/* Do the system call */
49	li		v0,__NR_clone
50	syscall
51
52	bnez		a3,L(error)
53
54	/* Successful return from the parent or child.  */
55	RESTORE_GP64
56	j		ra
57	nop
58
59	/* Something bad happened -- no child created.  */
60L(error):
61	move	a0, v0
62#ifdef __PIC__
63	PTR_LA		t9, __syscall_error
64	RESTORE_GP64
65	jr		t9
66#else
67	RESTORE_GP64
68	j		__syscall_error
69#endif
70	END(__vfork)
71
72weak_alias(__vfork,vfork)
73libc_hidden_def(vfork)
74
75#endif
76