| 1234567891011121314151617181920212223242526272829303132333435363738394041424344 | /* * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com) * * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball. */#include <sys/syscall.h>#include <sysdep.h>/* No legacy syscall ABI means NR_vfork is not available at all, use clone */#define _SIGNAL_H#include <bits/signum.h>       /* For SIGCHLD */#define CLONE_VM		0x00000100#define CLONE_VFORK		0x00004000#define CLONE_FLAGS_FOR_VFORK	(CLONE_VM|CLONE_VFORK|SIGCHLD)ENTRY(__vfork)#ifdef SAVE_PID	THREAD_SELF r1		; Get to struct pthread (just before TCB)	ld	r2, [r1, PTHREAD_PID]	neg.f	r3, r2	bset.z	r3, r3, 31	st	r3, [r1, PTHREAD_PID]#endif	mov	r0, CLONE_FLAGS_FOR_VFORK	mov_s	r1, sp	mov	r8, __NR_clone	ARC_TRAP_INSN	cmp	r0, 0#ifdef RESTORE_PID	bz	1f	; child continues	THREAD_SELF r1		; Get to struct pthread (just before TCB)	st	r2, [r1, PTHREAD_PID]1:#endif	jge	[blink]	; pid >=0 return, else detour via tailcall to errno	b   __syscall_errorEND(__vfork)weak_alias(__vfork,vfork)libc_hidden_def(vfork)
 |