diff options
Diffstat (limited to 'libc/sysdeps/linux/nios2/vfork.S')
-rw-r--r-- | libc/sysdeps/linux/nios2/vfork.S | 100 |
1 files changed, 52 insertions, 48 deletions
diff --git a/libc/sysdeps/linux/nios2/vfork.S b/libc/sysdeps/linux/nios2/vfork.S index 2aee81e6c..99e4a73e1 100644 --- a/libc/sysdeps/linux/nios2/vfork.S +++ b/libc/sysdeps/linux/nios2/vfork.S @@ -1,50 +1,54 @@ -/* - * libc/sysdeps/linux/nios2/vfork.S -- `vfork' syscall for linux/nios2 - * - * Copyright (C) 2004 Microtronix Datacom Ltd - * - * This file is subject to the terms and conditions of the GNU Lesser - * General Public License. See the file COPYING.LIB in the main - * directory of this archive for more details. - * - * Written by Wentao Xu <wentao@microtronix.com> - */ - -#include <sys/syscall.h> - -#define __NR_vfork 1071 - -.text -.global __vfork -.hidden __vfork -.type __vfork,%function -.align 4 -__vfork: - movui r2, TRAP_ID_SYSCALL - movui r3, __NR_vfork - trap - movi r8, -4096 - bltu r8, r2, fix_errno - ret -fix_errno: - sub r8, r0, r2 - - addi sp, sp, -8 - stw ra, 4(sp) - stw r8, 0(sp) -#ifndef __PIC__ - call __errno_location -#else - +/* vfork for Nios II Linux. + Copyright (C) 2005-2016 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <http://www.gnu.org/licenses/>. */ + +#include <sysdep.h> + +#ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <tcb-offsets.h> +#endif + +ENTRY(__vfork) + +#ifdef RESET_PID + ldw r6, PID_OFFSET(r23) + sub r7, zero, r6 + bne r7, zero, 2f + movhi r7, %hi(0x80000000) +2: + stw r7, PID_OFFSET(r23) #endif - ldw ra, 4(sp) - ldw r8, 0(sp) - stw r8, 0(r2) - - addi r2, r0, -1 - addi sp, sp, 8 - ret - -.size __vfork,.-__vfork -weak_alias(__vfork,vfork) + + movi r4, 0x4111 /* (CLONE_VM | CLONE_VFORK | SIGCHLD) */ + mov r5, zero + + /* Do the system call. */ + movi r2, SYS_ify(clone) + + trap + + beq r2, zero, 1f +#ifdef RESET_PID + stw r6, PID_OFFSET(r23) +#endif +1: + ret + +END(__vfork) + +weak_alias(__vfork, vfork) libc_hidden_def(vfork) |