+2003-08-30 Jakub Jelinek <jakub@redhat.com>
+
+ * sysdeps/generic/sysdep.h (cfi_window_save, CFI_WINDOW_SAVE): Define.
+ * sysdeps/unix/sysv/linux/sparc/bits/setjmp.h: Allow file to be
+ included multiple times.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/clone.S (__clone): Pass
+ ptid, tls, ctid arguments to the kernel.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c (__getpagesize):
+ Use INTERNAL_SYSCALL instead of __syscall_getpagesize.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c
+ (__libc_sigaction): Use INLINE_SYSCALL instead of
+ __syscall_rt_sigaction.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
+ (__syscall_getgroups, __syscall_getpagesize, __syscall__llseek,
+ __syscall_setfsgid, __syscall_setfsuid, __syscall_setgid,
+ __syscall_setgroups, __syscall_setregid, __syscall_setreuid,
+ __syscall_ipc, __syscall_setuid, __syscall_rt_sigaction,
+ __syscall_rt_sigpending, __syscall_rt_sigprocmask,
+ __syscall_rt_sigqueueinfo, __syscall_rt_sigsuspend,
+ __syscall_rt_sigtimedwait): Remove unneeded syscall stubs.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/Makefile (sysdep_routines):
+ Remove rt_sigsuspend, rt_sigprocmask, rt_sigtimedwait,
+ rt_sigqueueinfo, rt_sigaction and rt_sigpending.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+ (__CLONE_SYSCALL_STRING): Define.
+ * sysdeps/unix/sysv/linux/sparc/sparc32/socket.S (__socket): Add
+ CFI directives.
+ * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+ (__CLONE_SYSCALL_STRING): Define.
+ * sysdeps/unix/sysv/linux/sparc/sysdep.h (INLINE_CLONE_SYSCALL):
+ Define.
+ * sysdeps/unix/sysv/linux/sparc/system.c: New file.
+
2003-08-30 Ulrich Drepper <drepper@redhat.com>
+ * sunrpc/rpc/clnt.h: Remove a few __THROW.
+ * sunrpc/Makefile (CFLAGS-auth_unix.c): Add -fexceptions.
+ (CFLAGS-key_call.c): Likewise.
+ (CFLAGS-pmap_rmt.c): Likewise.
+ * sunrpc/rpc/auth.h: Remove serveral __THROW.
+
* inet/Makefile (CFLAGS-gethstbyad_r.c): Add -fexceptions.
(CFLAGS-gethstbynm_r.c): Likewise.
(CFLAGS-gethstbynm2_r.c): Likewise.
+ (CFLAGS-rcmd.c): Likewise.
* resolv/Makefile (CFLAGS-res_hconf.c): Add -fexceptions.
* argp/Makefile (CFLAGS-argp-help.c): Add -fexceptions.
CFLAGS-gethstbyad_r.c = -DUSE_NSCD=1 -fexceptions
CFLAGS-gethstbynm_r.c = -DUSE_NSCD=1 -fexceptions
CFLAGS-gethstbynm2_r.c = -DUSE_NSCD=1 -fexceptions
+CFLAGS-rcmd.c = -fexceptions
endif
CFLAGS-xnfs_prot.c = -Wno-unused
CFLAGS-xrquota.c = -Wno-unused
CFLAGS-xkey_prot.c = -Wno-unused
+CFLAGS-auth_unix.c = -fexceptions
+CFLAGS-key_call.c = -fexceptions
+CFLAGS-pmap_rmt.c = -fexceptions
ifeq (yes,$(have_doors))
CPPFLAGS-key_call.c += -DHAVE_DOORS=1
* int *aup_gids;
*/
extern AUTH *authunix_create (char *__machname, __uid_t __uid, __gid_t __gid,
- int __len, __gid_t *__aup_gids) __THROW;
-extern AUTH *authunix_create_default (void) __THROW;
+ int __len, __gid_t *__aup_gids);
+extern AUTH *authunix_create_default (void);
extern AUTH *authnone_create (void) __THROW;
extern AUTH *authdes_create (const char *__servername, u_int __window,
struct sockaddr *__syncaddr, des_block *__ckey)
* These routines interface to the keyserv daemon
*
*/
-extern int key_decryptsession (char *, des_block *) __THROW;
-extern int key_decryptsession_pk (char *, netobj *, des_block *) __THROW;
-extern int key_encryptsession (char *, des_block *) __THROW;
-extern int key_encryptsession_pk (char *, netobj *, des_block *) __THROW;
-extern int key_gendes (des_block *) __THROW;
-extern int key_setsecret (char *) __THROW;
-extern int key_secretkey_is_set (void) __THROW;
-extern int key_get_conv (char *, des_block *) __THROW;
+extern int key_decryptsession (char *, des_block *);
+extern int key_decryptsession_pk (char *, netobj *, des_block *);
+extern int key_encryptsession (char *, des_block *);
+extern int key_encryptsession_pk (char *, netobj *, des_block *);
+extern int key_gendes (des_block *);
+extern int key_setsecret (char *);
+extern int key_secretkey_is_set (void);
+extern int key_get_conv (char *, des_block *);
/*
* XDR an opaque authentication struct.
/*
* Print why creation failed
*/
-extern void clnt_pcreateerror (__const char *__msg) __THROW; /* stderr */
+extern void clnt_pcreateerror (__const char *__msg); /* stderr */
extern char *clnt_spcreateerror(__const char *__msg) __THROW; /* string */
/*
* Like clnt_perror(), but is more verbose in its output
*/
-extern void clnt_perrno (enum clnt_stat __num) __THROW; /* stderr */
+extern void clnt_perrno (enum clnt_stat __num); /* stderr */
/*
* Print an English error message, given the client error code
*/
-extern void clnt_perror (CLIENT *__clnt, __const char *__msg) __THROW;
+extern void clnt_perror (CLIENT *__clnt, __const char *__msg);
/* stderr */
extern char *clnt_sperror (CLIENT *__clnt, __const char *__msg) __THROW;
/* string */
# define cfi_undefined(reg) .cfi_undefined reg
# define cfi_remember_state .cfi_remember_state
# define cfi_restore_state .cfi_restore_state
+# define cfi_window_save .cfi_window_save
# else
# define cfi_startproc
# define cfi_endproc
# define cfi_undefined(reg)
# define cfi_remember_state
# define cfi_restore_state
+# define cfi_window_save
# endif
#else /* ! ASSEMBLER */
".cfi_remember_state"
# define CFI_RESTORE_STATE \
".cfi_restore_state"
+# define CFI_WINDOW_SAVE \
+ ".cfi_window_save"
# else
# define CFI_STARTPROC
# define CFI_ENDPROC
# define CFI_UNDEFINED(reg)
# define CFI_REMEMBER_STATE
# define CFI_RESTORE_STATE
+# define CFI_WINDOW_SAVE
# endif
#endif /* __ASSEMBLER__ */
-/* Copyright (C) 1997,1999,2000 Free Software Foundation, Inc.
+/* Copyright (C) 1997,1999,2000,2003 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
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
+#ifndef _BITS_SETJMP_H
+#define _BITS_SETJMP_H 1
-#ifndef _SETJMP_H
+#if !defined _SETJMP_H && !defined _PTHREAD_H
# error "Never include <bits/setjmp.h> directly; use <setjmp.h> instead."
#endif
((int) (address) < (jmpbuf)[JB_SP])
#endif
+
+#endif /* bits/setjmp.h */
sysdep-others += lddlibc4
install-bin += lddlibc4
endif # elf
-
-ifeq ($(subdir),signal)
-sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait \
- rt_sigqueueinfo rt_sigaction rt_sigpending
-endif
-/* Copyright (C) 1996, 1997, 1998, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1996, 1997, 1998, 2000, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson (rth@tamu.edu).
#include <asm/errno.h>
#include <asm/unistd.h>
-/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg); */
+/* int clone(int (*fn)(void *arg), void *child_stack, int flags, void *arg,
+ pid_t *ptid, void *tls, pid_t *ctid); */
.text
.align 4
orcc %i1,%g0,%o1
be .Lerror
mov %i2,%o0
+ /* ptid */
+ mov %i4,%o2
+ /* tls */
+ mov %i5,%o3
+ /* ctid */
+ ld [%fp+92],%o4
/* Do the system call */
set __NR_clone,%g1
-/* Copyright (C) 1997, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 2002, 2003 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
#include <unistd.h>
#include <sys/param.h>
#include <ldsodefs.h>
+#include <sysdep.h>
/* Return the system page size. This value will either be 4k or 8k depending
on whether or not we are running on Sparc v9 machine. */
via the AT_PAGESZ auxiliary argument. If we are a static program, we
use the getpagesize system call. */
-extern size_t __syscall_getpagesize(void);
-
int
__getpagesize ()
{
if (GL(dl_pagesize) == 0)
- GL(dl_pagesize) = __syscall_getpagesize();
+ {
+ INTERNAL_SYSCALL_DECL (err);
+ GL(dl_pagesize) = INTERNAL_SYSCALL (getpagesize, err, 0);
+ }
return GL(dl_pagesize);
}
libc_hidden_def (__getpagesize)
#include <sys/signal.h>
#include <errno.h>
#include <kernel_sigaction.h>
-
-extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *,
- struct kernel_sigaction *, unsigned long,
- size_t);
+#include <sysdep.h>
static void __rt_sigreturn_stub (void);
static void __sigreturn_stub (void);
/* XXX The size argument hopefully will have to be changed to the
real size of the user-level sigset_t. */
- ret = __syscall_rt_sigaction (sig, act ? &kact : 0,
- oact ? &koact : 0,
- stub, _NSIG / 8);
+ ret = INLINE_SYSCALL (rt_sigaction, 5, sig, act ? &kact : 0,
+ oact ? &koact : 0, stub, _NSIG / 8);
if (ret >= 0 || errno != ENOSYS)
{
#if defined NEED_CANCELLATION && defined CENABLE
.Lsocket_cancel:
+ cfi_startproc
save %sp, -96, %sp
+ cfi_def_cfa_register (%fp)
+ cfi_window_save
+ cfi_register (%o7, %i7)
CENABLE
nop
mov %o0, %l0
mov %l0, %o0
jmpl %i7 + 8, %g0
restore %g0, %l1, %o0
+ cfi_endproc
SYSCALL_ERROR_HANDLER2
#endif
# File name Caller Syscall name # args Strong name Weak names
-s_getgroups getgroups getgroups 2 __syscall_getgroups
-s_getpagesize getpagesize getpagesize 0 __syscall_getpagesize
-s_llseek llseek _llseek 5 __syscall__llseek
-s_setfsgid setfsgid setfsgid 1 __syscall_setfsgid
-s_setfsuid setfsuid setfsuid 1 __syscall_setfsuid
-s_setgid setgid setgid 1 __syscall_setgid
-s_setgroups setgroups setgroups 2 __syscall_setgroups
-s_setregid setregid setregid 2 __syscall_setregid
-s_setreuid setreuid setreuid 2 __syscall_setreuid
setrlimit - setrlimit 2 __setrlimit setrlimit
getrlimit - getrlimit 2 __getrlimit getrlimit
-s_ipc msgget ipc 5 __syscall_ipc
-s_setuid setuid setuid 1 __syscall_setuid
setresuid - setresuid32 3 __setresuid setresuid
setresgid - setresgid32 3 __setresgid setresgid
getresuid - getresuid32 3 getresuid
getresgid - getresgid32 3 getresgid
-
-# System calls with wrappers.
-rt_sigaction - rt_sigaction 4 __syscall_rt_sigaction
-rt_sigpending - rt_sigpending 2 __syscall_rt_sigpending
-rt_sigprocmask - rt_sigprocmask 4 __syscall_rt_sigprocmask
-rt_sigqueueinfo - rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo
-rt_sigsuspend - rt_sigsuspend 2 __syscall_rt_sigsuspend
-rt_sigtimedwait - rt_sigtimedwait 4 __syscall_rt_sigtimedwait
" restore %%g0, -1, %%o0;" \
".previous;"
+#define __CLONE_SYSCALL_STRING \
+ "ta 0x10;" \
+ "bcs 2f;" \
+ " sub %%o1, 1, %%o1;" \
+ "and %%o0, %%o1, %%o0;" \
+ "1:" \
+ ".subsection 2;" \
+ "2:" \
+ "save %%sp, -192, %%sp;" \
+ "call __errno_location;" \
+ " nop;" \
+ "st %%i0, [%%o0];" \
+ "ba 1b;" \
+ " restore %%g0, -1, %%o0;" \
+ ".previous;"
+
#define __INTERNAL_SYSCALL_STRING \
"ta 0x10;" \
"bcs,a 1f;" \
"restore %%g0, -1, %%o0;" \
"1:"
+#define __CLONE_SYSCALL_STRING \
+ "ta 0x6d;" \
+ "bcc,pt %%xcc, 1f;" \
+ " sub %%o1, 1, %%o1;" \
+ "save %%sp, -192, %%sp;" \
+ "call __errno_location;" \
+ " mov -1, %%i1;" \
+ "st %%i0,[%%o0];" \
+ "restore %%g0, -1, %%o0;" \
+ "1:" \
+ "and %%o0, %%o1, %%o0"
+
#define __INTERNAL_SYSCALL_STRING \
"ta 0x6d;" \
"bcs,a,pt %%xcc, 1f;" \
--- /dev/null
+/* Copyright (C) 2003 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, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA. */
+
+#include <kernel-features.h>
+
+/* We have to and actually can handle cancelable system(). The big
+ problem: we have to kill the child process if necessary. To do
+ this a cleanup handler has to be registered and is has to be able
+ to find the PID of the child. The main problem is to reliable have
+ the PID when needed. It is not necessary for the parent thread to
+ return. It might still be in the kernel when the cancellation
+ request comes. Therefore we have to use the clone() calls ability
+ to have the kernel write the PID into the user-level variable. */
+#ifdef __ASSUME_CLONE_THREAD_FLAGS
+# define FORK() \
+ INLINE_CLONE_SYSCALL (CLONE_PARENT_SETTID | SIGCHLD, 0, &pid, NULL, NULL)
+#endif
+
+#include "../system.c"