diff options
Diffstat (limited to 'libc/sysdeps/linux/nios2/vfork.S')
-rw-r--r-- | libc/sysdeps/linux/nios2/vfork.S | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/libc/sysdeps/linux/nios2/vfork.S b/libc/sysdeps/linux/nios2/vfork.S new file mode 100644 index 000000000..a19a90023 --- /dev/null +++ b/libc/sysdeps/linux/nios2/vfork.S @@ -0,0 +1,53 @@ +/* + * 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 <asm/unistd.h> + +#ifndef __NR_vfork +#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */ +#endif + + .text + .balign 4 + .globl errno + .globl vfork + .globl __libc_vfork +#if defined __HAVE_ELF__ + .type vfork,@function + .type __libc_vfork,@function +#endif +vfork: +__libc_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 + +#endif + ldw ra, 4(sp) + ldw r8, 0(sp) + stw r8, 0(r2) + + addi r2, r0, -1 + addi sp, sp, 8 + ret + |