/* vfork for uClibc
*
* Copyright (C) 2000 by Lineo, inc. and Erik Andersen
- * Copyright (C) 2000,2001 by Erik Andersen <andersen@uclibc.org>
+ * Copyright (C) 2000-2006 by Erik Andersen <andersen@uclibc.org>
* Written by Erik Andersen <andersen@uclibc.org>
*
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
#ifdef __NR_fork
.text
-.global vfork
-.type vfork,%function
+.global __vfork
+.hidden __vfork
+.type __vfork,%function
.align 4
-vfork:
+__vfork:
#ifdef __NR_vfork
swi __NR_vfork
__error:
b __syscall_error
-.size vfork,.-vfork
+.size __vfork,.-__vfork
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
#endif
#include <asm/unistd.h>
.text
-.global _vfork
-.type _vfork,STT_FUNC;
+.global ___vfork
+.hidden ___vfork
+.type ___vfork,STT_FUNC;
.align 4
-_vfork:
+___vfork:
p0 = __NR_vfork;
excpt 0;
rts;
-.size _vfork,.-_vfork
+.size ___vfork,.-___vfork
+//weak_alias(___vfork,_vfork)
+//libc_hidden_def(_vfork)
#define __NR___libc_fork __NR_fork
_syscall0(pid_t, __libc_fork);
libc_hidden_proto(fork)
-strong_alias(__libc_fork,fork)
+weak_alias(__libc_fork,fork)
libc_hidden_def(fork)
#endif
#endif
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
/* Trivial implementation for arches that lack vfork */
#include <unistd.h>
#include <sys/types.h>
#include <sys/syscall.h>
#ifdef __NR_fork
-
-libc_hidden_proto(vfork)
-
libc_hidden_proto(fork)
-pid_t vfork(void)
+pid_t attribute_hidden __vfork(void)
{
return fork();
}
+libc_hidden_proto(vfork)
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
-
#endif
/* i dunno what the blurb above is useful for. we just return. */
__asm__("ret\n\tnop");
libc_hidden_proto(fork)
-strong_alias(__libc_fork,fork)
+weak_alias(__libc_fork,fork)
libc_hidden_def(fork)
#include <sys/syscall.h>
#include <errno.h>
+#define __NR___vfork __NR_vfork
+attribute_hidden _syscall0(pid_t, __vfork);
libc_hidden_proto(vfork)
-
-_syscall0(pid_t, vfork);
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
#include <bits/errno.h>
.text
- .globl vfork
- .type vfork,@function
+ .globl __vfork
+ .hidden __vfork
+ .type __vfork,@function
/* int vfork(void) */
-vfork:
+__vfork:
setlos.p #__NR_vfork, gr7
setlos #-4096, gr4
tra gr0, gr0
ldd @(gr14, gr15), gr14
jmpl @(gr14, gr0)
- .size vfork,.-vfork
+ .size __vfork,.-__vfork
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
#endif
.text
.align 2
- .globl _errno
- .globl _vfork
- .type vfork,@function
-_vfork:
+ .globl _errno
+ .globl ___vfork
+ .hidden ___vfork
+ .type ___vfork,@function
+___vfork:
mov.l @sp+, er1
sub.l er0,er0
mov.b #__NR_vfork,r0l
sub.l er0,er0
dec.l #1,er0
jmp @er1 /* don't return, just jmp directly */
+
+//weak_alias(___vfork,_vfork)
+//libc_hidden_def(_vfork)
/*
- * June 3, 2003 Erik Andersen
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
*
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
#include <features.h>
#include <sys/syscall.h>
#ifndef __NR_vfork
-
/* No vfork so use fork instead */
-strong_alias(fork,vfork)
-strong_alias(vfork,__libc_fork)
-
+hidden_strong_alias(__libc_fork,__vfork)
#else
-
.text
-.global vfork
-.type vfork,%function
+.global __vfork
+.hidden __vfork
+.type __vfork,%function
.align 1<<4
-vfork:
+__vfork:
popl %ecx
movl $__NR_vfork,%eax
int $0x80
jae __syscall_error
ret
-.size vfork,.-vfork
+.size __vfork,.-__vfork
#endif
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
-#
-# clone.S, part of the i960 support for the uClibc library.
-#
-# Copyright (C) 2002 by Okiok Data Ltd. http://www.okiok.com/
-#
-# This program is free software; you can redistribute it and/or modify it under
-# the terms of the GNU Library General Public License as published by the Free
-# Software Foundation; either version 2 of the License, or (at your option) any
-# later version.
-#
-# This program 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 Library General Public License for more
-# details.
-#
-# You should have received a copy of the GNU Library General Public License
-# along with this program; if not, write to the Free Software Foundation, Inc.,
-# at 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-#
-# Derived from an old port of uC-libc to the i960 by Keith Adams (kma@cse.ogi.edu).
-#
+/*
+ * clone.S, part of the i960 support for the uClibc library.
+ *
+ * Copyright (C) 2002 by Okiok Data Ltd. http://www.okiok.com/
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+/*
+ * Derived from an old port of uC-libc to the i960 by Keith Adams (kma@cse.ogi.edu).
+ */
#include <sys/syscall.h>
#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
#endif
- .globl _vfork
-_vfork:
+ .globl ___vfork
+ .hidden ___vfork
+___vfork:
mov g13, r3
ldconst __NR_vfork, g13
calls 0
1:
ret
+//weak_alias(___vfork,_vfork)
+//libc_hidden_def(_vfork)
.text
.align 2
.globl errno
- .globl vfork
- .type vfork,@function
+ .globl __vfork
+ .hidden __vfork
+ .type __vfork,@function
-vfork:
+__vfork:
movl %sp@+, %a1 /* save the return address for later */
movl IMM __NR_vfork,%d0
trap #0
movl IMM -1, %d0
jmp %a1@ /* don't return, just jmp directly */
-.size vfork,.-vfork
+.size __vfork,.-__vfork
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
/*
* libc/sysdeps/linux/microblaze/vfork.S -- `vfork' syscall for linux/microblaze
*
- * Copyright (C) 2003 John Williams <jwilliams@itee.uq.edu.au>
- * Copyright (C) 2001 NEC Corporation
- * Copyright (C) 2001 Miles Bader <miles@gnu.org>
+ * Copyright (C) 2001 NEC Corporation
+ * Copyright (C) 2001 Miles Bader <miles@gnu.org>
+ * Copyright (C) 2003 John Williams <jwilliams@itee.uq.edu.au>
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
*
- * 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.
- *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
+/*
* Written by Miles Bader <miles@gnu.org>
* Microblaze port by John Williams
*/
.global C_SYMBOL_NAME(errno)
-C_ENTRY (vfork):
+C_ENTRY (__vfork):
addi r12, r0, SYS_vfork
bralid r17, 0x08;
nop
swi r3, r0, C_SYMBOL_NAME(errno);
rtsd r15, 8 // error return
nop
-C_END(vfork)
+C_END(__vfork)
+//weak_alias(__vfork,vfork)
+//libc_hidden_def(vfork)
.text
.align 2
- .globl vfork
- .type vfork,@function
-vfork:
+ .globl __vfork
+ .hidden __vfork
+ .type __vfork,@function
+__vfork:
MOVIP %g1, __NR_vfork
trap 63
ret
restore
-.size vfork,.-vfork
+.size __vfork,.-__vfork
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
#include <bits/errno.h>
#include <sys/syscall.h>
-#ifdef __NR_fork
+#ifndef __NR_vfork
+#define __NR_vfork __NR_fork /* uClinux-2.0 only has fork which is vfork */
+#endif
+
.text
-.global vfork
-.type vfork,%function
+.global __vfork
+.hidden __vfork
+.type __vfork,%function
.align 4
-vfork:
+__vfork:
movui r2, TRAP_ID_SYSCALL
movui r3, __NR_vfork
trap
addi sp, sp, 8
ret
-.size vfork,.-vfork
+.size __vfork,.-__vfork
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
-#endif
+/*
+ * Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
+ *
+ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
+ */
#include <features.h>
#include <sys/syscall.h>
#ifndef __NR_vfork
/* No vfork so use fork instead */
-strong_alias(fork,vfork)
-strong_alias(vfork,__libc_fork)
+strong_alias(fork,__libc_fork)
+hidden_strong_alias(__libc_fork,__vfork)
#else
.text
-.global vfork
-.type vfork,@function
+.global __vfork
+.hidden __vfork
+.type __vfork,@function
.type __syscall_error,@function
-vfork:
+__vfork:
li 0, __NR_vfork
sc
bnslr+
b __syscall_error
-.size vfork,.-vfork
+.size __vfork,.-__vfork
#endif
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
#include <errno.h>
#include <sys/syscall.h>
-libc_hidden_proto(vfork)
-
#define __syscall_clobbers \
"r4", "r5", "r6", "r7", "r8", "r9", "r10", "r11", "r12"
#define __syscall_return(type) \
return (__sc_err & 0x10000000 ? errno = __sc_ret, __sc_ret = -1 : 0), \
(type) __sc_ret
-pid_t vfork(void)
+pid_t attribute_hidden __vfork(void)
{
unsigned long __sc_ret, __sc_err;
register unsigned long __sc_0 __asm__ ("r0");
__syscall_return (pid_t);
}
+libc_hidden_proto(vfork)
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
and the process ID of the new process to the old process. */
.text
-.globl vfork
-.type vfork,@function
+.globl __vfork
+.hidden __vfork
+.type __vfork,@function
.align 4
-vfork:
+__vfork:
mov.w .L2, r3
trapa #0x10
mov r0, r1
.L3:
.word __NR_fork
-.size vfork, .-vfork
+.size __vfork, .-__vfork
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
#include "syscall_error.S"
#include <sys/syscall.h>
.text
-.global fork
-.type fork,%function
+.global __libc_fork
+.type __libc_fork,%function
.align 4
-fork:
+__libc_fork:
mov __NR_fork, %g1
ta 0x10
bcc,a 9000f
retl
and %o0, %o1, %o0
-.size fork,.-fork
+.size __libc_fork,.-__libc_fork
+weak_alias(__libc_fork,fork)
libc_hidden_def(fork)
-strong_alias(fork,__libc_fork)
#ifndef __NR_vfork
/* No vfork so use fork instead */
-strong_alias(fork,vfork)
-strong_alias(vfork,__libc_fork)
+strong_alias(fork,__libc_fork)
+hidden_strong_alias(__libc_fork,__vfork)
#else
.text
-.global vfork
-.type vfork,%function
+.global __vfork
+.hidden __vfork
+.type __vfork,%function
.align 4
-vfork:
+__vfork:
mov __NR_vfork, %g1
ta 0x10
bcc,a 9000f
retl
and %o0, %o1, %o0
-.size vfork,.-vfork
+.size __vfork,.-__vfork
#endif /* __NR_vfork */
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
.global C_SYMBOL_NAME(errno)
-C_ENTRY (vfork):
+C_ENTRY (__vfork):
addi SYS_vfork, r0, r12
trap 0
addi -125, r0, r11 // minimum err value
subr r0, r10
st.w r10, 0[r11]
jmp [lp] // error return
-C_END(vfork)
+C_END(__vfork)
+//weak_alias(__vfork,vfork)
+//libc_hidden_def(vfork)
#ifndef __NR_vfork
/* No vfork so use fork instead */
-strong_alias(fork,vfork)
-strong_alias(vfork,__libc_fork)
+strong_alias(fork,__libc_fork)
+hidden_strong_alias(__libc_fork,__vfork)
#else
.text
-.global vfork
-.type vfork,%function
+.global __vfork
+.hidden __vfork
+.type __vfork,%function
.align 16
-vfork:
+__vfork:
/* Pop the return PC value into RDI. We need a register that
is preserved by the syscall and that we're allowed to destroy. */
/* Normal return. */
ret
-.size vfork,.-vfork
+.size __vfork,.-__vfork
#endif /* __NR_vfork */
+weak_alias(__vfork,vfork)
libc_hidden_def(vfork)
for (/*nothing*/; list != NULL; list = list->next) (list->handler)();
}
-extern int __libc_fork(void);
+extern __typeof(fork) __libc_fork;
-pid_t __fork(void)
+pid_t attribute_hidden __fork(void)
{
pid_t pid;
struct handler_list * prepare, * child, * parent;
}
return pid;
}
-weak_alias (__fork, fork)
+strong_alias(__fork,fork)
-pid_t __vfork(void)
+pid_t attribute_hidden __vfork(void)
{
return __fork();
}
-weak_alias (__vfork, vfork)
+strong_alias(__vfork,vfork)
#else