Update.
authorUlrich Drepper <drepper@redhat.com>
Sun, 31 Aug 2003 17:24:25 +0000 (17:24 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 31 Aug 2003 17:24:25 +0000 (17:24 +0000)
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.

* 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.

(CFLAGS-rcmd.c): Likewise.

16 files changed:
ChangeLog
inet/Makefile
sunrpc/Makefile
sunrpc/rpc/auth.h
sunrpc/rpc/clnt.h
sysdeps/generic/sysdep.h
sysdeps/unix/sysv/linux/sparc/bits/setjmp.h
sysdeps/unix/sysv/linux/sparc/sparc32/Makefile
sysdeps/unix/sysv/linux/sparc/sparc32/clone.S
sysdeps/unix/sysv/linux/sparc/sparc32/getpagesize.c
sysdeps/unix/sysv/linux/sparc/sparc32/sigaction.c
sysdeps/unix/sysv/linux/sparc/sparc32/socket.S
sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list
sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
sysdeps/unix/sysv/linux/sparc/system.c [new file with mode: 0644]

index f991599..bf2e402 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,8 +1,48 @@
+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.
index 747b680..944bd97 100644 (file)
@@ -59,6 +59,7 @@ ifeq ($(have-thread-library),yes)
 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
 
index b7492e4..305bd68 100644 (file)
@@ -118,6 +118,9 @@ CFLAGS-xspray.c = -Wno-unused
 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
index 6612957..7c931d8 100644 (file)
@@ -159,8 +159,8 @@ extern struct opaque_auth _null_auth;
  *     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)
@@ -194,14 +194,14 @@ extern int netname2host (__const char *, char *, __const int) __THROW;
  * 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.
index a19fc77..cf271c5 100644 (file)
@@ -368,18 +368,18 @@ extern int _rpc_dtablesize (void) __THROW;
 /*
  * 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 */
index 9535c18..58c7928 100644 (file)
@@ -63,6 +63,7 @@
 #  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
@@ -78,6 +79,7 @@
 #  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__ */
index 664a06f..dac9ac5 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
 
@@ -78,3 +80,5 @@ typedef int __jmp_buf[3];
   ((int) (address) < (jmpbuf)[JB_SP])
 
 #endif
+
+#endif  /* bits/setjmp.h */
index 734b39d..05fd852 100644 (file)
@@ -9,8 +9,3 @@ CFLAGS-rtld.c += -mv8
 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
index 647519a..5bebe35 100644 (file)
@@ -1,4 +1,4 @@
-/* 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).
 
@@ -23,7 +23,8 @@
 #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
@@ -39,6 +40,12 @@ __clone:
         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
index 6ae341f..42ef9d3 100644 (file)
@@ -1,4 +1,4 @@
-/* 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
@@ -19,6 +19,7 @@
 #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)
index af34740..7fb6459 100644 (file)
 #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);
@@ -64,9 +61,8 @@ __libc_sigaction (int sig, __const struct sigaction *act,
 
       /* 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)
        {
index 94b46e1..3c12278 100644 (file)
@@ -79,7 +79,11 @@ ENTRY (__socket)
 
 #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
@@ -93,6 +97,7 @@ ENTRY (__socket)
         mov %l0, %o0
        jmpl %i7 + 8, %g0
         restore %g0, %l1, %o0
+       cfi_endproc
        SYSCALL_ERROR_HANDLER2
 #endif
 
index cb4971f..6d8e32f 100644 (file)
@@ -1,27 +1,8 @@
 # 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
index 6dcf0cd..5ba9f3f 100644 (file)
@@ -181,6 +181,22 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler)                       \
        " 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;"                                                    \
index 5340fca..7e88ea5 100644 (file)
@@ -152,6 +152,18 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler)                       \
        "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;"                                           \
diff --git a/sysdeps/unix/sysv/linux/sparc/system.c b/sysdeps/unix/sysv/linux/sparc/system.c
new file mode 100644 (file)
index 0000000..22bef62
--- /dev/null
@@ -0,0 +1,34 @@
+/* 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"