diff options
-rw-r--r-- | ChangeLog | 26 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc32/sysdep.h | 13 | ||||
-rw-r--r-- | sysdeps/powerpc/powerpc64/sysdep.h | 14 | ||||
-rw-r--r-- | sysdeps/unix/alpha/sysdep.h | 19 | ||||
-rw-r--r-- | sysdeps/unix/sparc/sysdep.h | 9 | ||||
-rw-r--r-- | sysdeps/unix/syscalls.list | 6 | ||||
-rw-r--r-- | sysdeps/unix/sysdep.h | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/arm/sysdep.h | 16 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/cris/sysdep.h | 14 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/hppa/sysdep.h | 15 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/i386/sysdep.h | 12 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/ia64/sysdep.h | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/m68k/sysdep.h | 10 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h | 13 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 16 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sh/sysdep.h | 12 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h | 7 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/syscalls.list | 8 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/x86_64/sysdep.h | 14 |
19 files changed, 223 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog index c01d067669..0bfd4c63d7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2003-03-23 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/unix/make-syscalls.sh: Recognize 'E' in first position of + the parameter description to denote no error checking. Generate + appropriate pseudo asm code. + * sysdeps/unix/syscalls.list: Mark getgid, getpid, getuid with 'E'. + * sysdeps/unix/sysv/linux/syscalls.list: Mark getegid, geteuid, + getpgrp, and getppid with 'E'. + * sysdeps/powerpc/powerpc32/sysdep.h: Define PSEUDO_NOERRNO, + PSEUDO_END_NOERRNO, and ret_NOERRNO. + * sysdeps/powerpc/powerpc64/sysdep.h: Likewise. + * sysdeps/unix/sysdep.h: Likewise. + * sysdeps/unix/alpha/sysdep.h: Likewise. + * sysdeps/unix/sparc/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/arm/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/cris/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/hppa/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/i386/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/ia64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/m68k/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep.h: Likewise. + 2003-03-23 Roland McGrath <roland@redhat.com> * Makeconfig (+includes): Don't use $(last-includes). diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h index bc201a80bd..338c69ae68 100644 --- a/sysdeps/powerpc/powerpc32/sysdep.h +++ b/sysdeps/powerpc/powerpc32/sysdep.h @@ -131,6 +131,19 @@ #define PSEUDO_END(name) \ END (name) +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .section ".text"; \ + ENTRY (name) \ + DO_CALL (SYS_ify (syscall_name)); + +#define PSEUDO_RET_NOERRNO \ + blr +#define ret_NOERRNO PSEUDO_RET_NOERRNO + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + /* Local labels stripped out by the linker. */ #undef L #define L(x) .L##x diff --git a/sysdeps/powerpc/powerpc64/sysdep.h b/sysdeps/powerpc/powerpc64/sysdep.h index 9b895df3f0..34c9caa5d7 100644 --- a/sysdeps/powerpc/powerpc64/sysdep.h +++ b/sysdeps/powerpc/powerpc64/sysdep.h @@ -225,6 +225,20 @@ LT_LABELSUFFIX(name,_name_end): ; \ #define PSEUDO_END(name) \ END (name) +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .section ".text"; \ + ENTRY (name) \ + DO_CALL (SYS_ify (syscall_name)); + +#define PSEUDO_RET_NOERRNO \ + blr + +#define ret_NOERRNO PSEUDO_RET_NOERRNO + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRO(name) \ + END (name) + /* Label in text section. */ /* ppc64 function descriptors which requires . notation */ #define C_TEXT(name) .##name diff --git a/sysdeps/unix/alpha/sysdep.h b/sysdeps/unix/alpha/sysdep.h index cb04cec2af..6e55061515 100644 --- a/sysdeps/unix/alpha/sysdep.h +++ b/sysdeps/unix/alpha/sysdep.h @@ -119,6 +119,21 @@ $syscall_error: \ END(sym) #endif +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .globl name; \ + .align 4; \ + .ent name,0; \ +__LABEL(name) \ + PSEUDO_PROLOGUE; \ + PSEUDO_PREPARE_ARGS \ + lda v0, SYS_ify(syscall_name); \ + call_pal PAL_callsys; + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(sym) END(sym) + +#define ret_NOERRNO ret + #define r0 v0 #define r1 a4 @@ -167,8 +182,8 @@ $syscall_error: \ /* If TLS is in use, we have a conflict between the PAL_rduniq primitive, as modeled within GCC, and explicit use of the R0 register. If we use the register via the asm, the scheduler may place the PAL_rduniq insn - before we've copied the data from R0 into _sc_ret. If this happens - we'll get a reload abort, since R0 is live at the same time it is + before we've copied the data from R0 into _sc_ret. If this happens + we'll get a reload abort, since R0 is live at the same time it is needed for the PAL_rduniq. Solve this by using the "v" constraint instead of an asm for the syscall diff --git a/sysdeps/unix/sparc/sysdep.h b/sysdeps/unix/sparc/sysdep.h index e103ba3b30..3f6a92a904 100644 --- a/sysdeps/unix/sparc/sysdep.h +++ b/sysdeps/unix/sparc/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1993, 1994, 1995, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1993, 1994, 1995, 1997, 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 @@ -52,7 +52,14 @@ jmp %g1 + %lo(syscall_error); nop; \ 1: +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .global syscall_error; \ + ENTRY (name) \ + mov SYS_ify(syscall_name), %g1; \ + ta 0 + #define ret retl; nop +#define ret_NOERRNO retl; nop #define r0 %o0 #define r1 %o1 #define MOVE(x,y) mov x, y diff --git a/sysdeps/unix/syscalls.list b/sysdeps/unix/syscalls.list index bbd068a33e..db83cee376 100644 --- a/sysdeps/unix/syscalls.list +++ b/sysdeps/unix/syscalls.list @@ -14,13 +14,13 @@ fcntl - fcntl Ci:iiF __libc_fcntl __fcntl __fcntl_internal fcntl fstatfs - fstatfs i:ip __fstatfs fstatfs fsync - fsync Ci:i __libc_fsync fsync getdomain - getdomainname i:si getdomainname -getgid - getgid i: __getgid getgid +getgid - getgid Ei: __getgid getgid getgroups - getgroups i:ip __getgroups getgroups getitimer - getitimer i:ip __getitimer getitimer -getpid - getpid i: __getpid getpid +getpid - getpid Ei: __getpid getpid getpriority - getpriority i:ii getpriority getrlimit - getrlimit i:ip __getrlimit getrlimit -getuid - getuid i: __getuid getuid +getuid - getuid Ei: __getuid getuid ioctl - ioctl i:iiI __ioctl ioctl kill - kill i:ii __kill kill link - link i:ss __link link diff --git a/sysdeps/unix/sysdep.h b/sysdeps/unix/sysdep.h index 616a9b5bd8..c19e98a4c0 100644 --- a/sysdeps/unix/sysdep.h +++ b/sysdeps/unix/sysdep.h @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 92, 93, 96, 98 Free Software Foundation, Inc. +/* Copyright (C) 1991, 92, 93, 96, 98, 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 @@ -47,6 +47,9 @@ #ifndef PSEUDO_END #define PSEUDO_END(sym) #endif +#ifndef PSEUDO_END_NOENTRY +#define PSEUDO_END_NOENTRY(sym) +#endif /* Wrappers around system calls should normally inline the system call code. But sometimes it is not possible or implemented and we use this code. */ diff --git a/sysdeps/unix/sysv/linux/arm/sysdep.h b/sysdeps/unix/sysv/linux/arm/sysdep.h index 785d3cf0d8..3e3c874e04 100644 --- a/sysdeps/unix/sysv/linux/arm/sysdep.h +++ b/sysdeps/unix/sysv/linux/arm/sysdep.h @@ -64,6 +64,22 @@ SYSCALL_ERROR_HANDLER \ END (name) +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name); \ + DO_CALL (syscall_name, args); + +#define PSEUDO_RET_NOERRNO \ + RETINSTR(movcc, pc, lr); \ + nop +#undef ret_NOERRNO +#define ret_NOERRNO PSEUDO_RET_NOERRNO + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + #if NOT_IN_libc # define SYSCALL_ERROR __local_syscall_error # define SYSCALL_ERROR_HANDLER \ diff --git a/sysdeps/unix/sysv/linux/cris/sysdep.h b/sysdeps/unix/sysv/linux/cris/sysdep.h index 4446b26f50..f22a3d24e8 100644 --- a/sysdeps/unix/sysv/linux/cris/sysdep.h +++ b/sysdeps/unix/sysv/linux/cris/sysdep.h @@ -1,5 +1,5 @@ /* Assembler macros for CRIS. - Copyright (C) 1999, 2001 Free Software Foundation, Inc. + Copyright (C) 1999, 2001, 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 @@ -106,6 +106,18 @@ PLTJUMP (syscall_error) @ \ END (name) +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + ENTRY (name) @ \ + DOARGS_##args @ \ + movu.w SYS_ify (syscall_name),$r9 @ \ + break 13 @ \ + UNDOARGS_return_##args + +#define ret_NOERRNO + +#define PSEUDO_END_NOERRNO(name) \ + END (name) + #define DOARGS_0 #define DOARGS_1 #define DOARGS_2 diff --git a/sysdeps/unix/sysv/linux/hppa/sysdep.h b/sysdeps/unix/sysv/linux/hppa/sysdep.h index 4f08cc6e39..771c55c400 100644 --- a/sysdeps/unix/sysv/linux/hppa/sysdep.h +++ b/sysdeps/unix/sysv/linux/hppa/sysdep.h @@ -1,5 +1,5 @@ /* Assembler macros for PA-RISC. - Copyright (C) 1999,2001,02 Free Software Foundation, Inc. + Copyright (C) 1999, 2001, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper, <drepper@cygnus.com>, August 1999. Linux/PA-RISC changes by Philipp Rumpf, <prumpf@tux.org>, March 2000. @@ -84,6 +84,10 @@ bv 0(2) ASM_LINE_SEP \ nop +#define ret_NOERRNO \ + bv 0(2) ASM_LINE_SEP \ + nop + #undef END #define END(name) \ 1: .size C_SYMBOL_NAME(name),1b-C_SYMBOL_NAME(name) @@ -115,6 +119,15 @@ #define PSEUDO_END(name) \ END (name) +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + ENTRY (name) \ + DO_CALL(syscall_name, args) ASM_LINE_SEP \ + nop + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + #define JUMPTARGET(name) name #define SYSCALL_PIC_SETUP /* Nothing. */ diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h index 02a78d3514..2e660c39fc 100644 --- a/sysdeps/unix/sysv/linux/i386/sysdep.h +++ b/sysdeps/unix/sysv/linux/i386/sysdep.h @@ -78,6 +78,18 @@ SYSCALL_ERROR_HANDLER \ END (name) +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + +#define ret_NOERRNO ret + #ifndef PIC # define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ #else diff --git a/sysdeps/unix/sysv/linux/ia64/sysdep.h b/sysdeps/unix/sysv/linux/ia64/sysdep.h index 556e266de5..3065782c8e 100644 --- a/sysdeps/unix/sysv/linux/ia64/sysdep.h +++ b/sysdeps/unix/sysv/linux/ia64/sysdep.h @@ -96,12 +96,21 @@ #undef PSEUDO_END #define PSEUDO_END(name) .endp C_SYMBOL_NAME(name); +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + ENTRY(name) \ + DO_CALL (SYS_ify(syscall_name)); + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) .endp C_SYMBOL_NAME(name); + #undef END #define END(name) \ .size C_SYMBOL_NAME(name), . - C_SYMBOL_NAME(name) ; \ .endp C_SYMBOL_NAME(name) #define ret br.ret.sptk.few b0 +#define ret_NOERRNO br.ret.sptk.few b0 #else /* not __ASSEMBLER__ */ diff --git a/sysdeps/unix/sysv/linux/m68k/sysdep.h b/sysdeps/unix/sysv/linux/m68k/sysdep.h index 125c584eb4..23e4202e8b 100644 --- a/sysdeps/unix/sysv/linux/m68k/sysdep.h +++ b/sysdeps/unix/sysv/linux/m68k/sysdep.h @@ -68,6 +68,16 @@ SYSCALL_ERROR_HANDLER; \ END (name) +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + #ifdef PIC # if RTLD_PRIVATE_ERRNO # define SYSCALL_ERROR_HANDLER \ diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h index af8515b195..8a98fbff8f 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h @@ -59,6 +59,16 @@ SYSCALL_ERROR_HANDLER; \ END (name) +#undef PSEUDO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + #ifndef PIC # define SYSCALL_ERROR_LABEL 0f # define SYSCALL_ERROR_HANDLER \ @@ -143,6 +153,9 @@ #define ret \ br 14 +#define ret_NOERRNO \ + br 14 + #endif /* __ASSEMBLER__ */ #undef INLINE_SYSCALL diff --git a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h index f5a074ff6f..41ec395a32 100644 --- a/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h +++ b/sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h @@ -1,5 +1,5 @@ /* Assembler macros for 64 bit S/390. - Copyright (C) 2001,02 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. Contributed by Martin Schwidefsky (schwidefsky@de.ibm.com). This file is part of the GNU C Library. @@ -72,6 +72,17 @@ SYSCALL_ERROR_HANDLER; \ END (name) +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + SYSCALL_ERROR_HANDLER; \ + END (name) + #ifndef PIC # define SYSCALL_ERROR_LABEL syscall_error # define SYSCALL_ERROR_HANDLER @@ -144,6 +155,9 @@ #define ret \ br 14 +#define ret_NOERRNO \ + br 14 + #endif /* __ASSEMBLER__ */ #undef INLINE_SYSCALL diff --git a/sysdeps/unix/sysv/linux/sh/sysdep.h b/sysdeps/unix/sysv/linux/sh/sysdep.h index ea1cffbd86..a2542fbb09 100644 --- a/sysdeps/unix/sysv/linux/sh/sysdep.h +++ b/sysdeps/unix/sysv/linux/sh/sysdep.h @@ -65,6 +65,18 @@ #define PSEUDO_END(name) \ END (name) +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name); \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + +#define ret_NOERRNO ret + #ifndef PIC # define SYSCALL_ERROR_HANDLER \ mov.l 0f,r1; \ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h index 7bf63b9c54..bc54b107c4 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h @@ -35,6 +35,7 @@ /* Linux/SPARC uses a different trap number */ #undef PSEUDO +#undef PSEUDO_NOERRNO #undef ENTRY #undef END #undef LOC @@ -108,6 +109,12 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ nop; \ SYSCALL_ERROR_HANDLER +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY(name); \ + LOADSYSCALL(syscall_name); \ + ta 0x10 + #else /* __ASSEMBLER__ */ #define __SYSCALL_STRING \ diff --git a/sysdeps/unix/sysv/linux/syscalls.list b/sysdeps/unix/sysv/linux/syscalls.list index c98297408a..f499db7da6 100644 --- a/sysdeps/unix/sysv/linux/syscalls.list +++ b/sysdeps/unix/sysv/linux/syscalls.list @@ -14,12 +14,12 @@ fdatasync - fdatasync i:i fdatasync flock - flock i:ii __flock flock fork - fork i: __libc_fork __fork fork get_kernel_syms EXTRA get_kernel_syms i:p get_kernel_syms -getegid - getegid i: __getegid getegid -geteuid - geteuid i: __geteuid geteuid +getegid - getegid Ei: __getegid getegid +geteuid - geteuid Ei: __geteuid geteuid getpgid - getpgid i:i __getpgid getpgid -getpgrp - getpgrp i: getpgrp +getpgrp - getpgrp Ei: getpgrp getpmsg - getpmsg i:ipppp getpmsg -getppid - getppid i: __getppid getppid +getppid - getppid Ei: __getppid getppid getresuid - getresuid i:ppp getresuid getresgid - getresgid i:ppp getresgid getsid - getsid i:i getsid diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h index c85c063f90..0edbe6624f 100644 --- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h +++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h @@ -81,6 +81,18 @@ SYSCALL_ERROR_HANDLER \ END (name) +#undef PSEUDO_NOERRNO +#define PSEUDO_NOERRNO(name, syscall_name, args) \ + .text; \ + ENTRY (name) \ + DO_CALL (syscall_name, args) + +#undef PSEUDO_END_NOERRNO +#define PSEUDO_END_NOERRNO(name) \ + END (name) + +#define ret_NOERRNO ret + #ifndef PIC #define SYSCALL_ERROR_HANDLER /* Nothing here; code in sysdep.S is used. */ #elif RTLD_PRIVATE_ERRNO @@ -168,7 +180,7 @@ called the stack is not aligned since the return address has just been pushed. - + Syscalls of more than 6 arguments are not supported. */ #undef DO_CALL |