From 9eb88290df0c6522a7a52fa44ed821a6fba60a5a Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 23 Mar 2003 19:44:31 +0000 Subject: Update. 2003-03-23 Ulrich Drepper * 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. --- sysdeps/powerpc/powerpc32/sysdep.h | 13 +++++++++++++ sysdeps/powerpc/powerpc64/sysdep.h | 14 ++++++++++++++ sysdeps/unix/alpha/sysdep.h | 19 +++++++++++++++++-- sysdeps/unix/sparc/sysdep.h | 9 ++++++++- sysdeps/unix/syscalls.list | 6 +++--- sysdeps/unix/sysdep.h | 5 ++++- sysdeps/unix/sysv/linux/arm/sysdep.h | 16 ++++++++++++++++ sysdeps/unix/sysv/linux/cris/sysdep.h | 14 +++++++++++++- sysdeps/unix/sysv/linux/hppa/sysdep.h | 15 ++++++++++++++- sysdeps/unix/sysv/linux/i386/sysdep.h | 12 ++++++++++++ sysdeps/unix/sysv/linux/ia64/sysdep.h | 9 +++++++++ sysdeps/unix/sysv/linux/m68k/sysdep.h | 10 ++++++++++ sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h | 13 +++++++++++++ sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h | 16 +++++++++++++++- sysdeps/unix/sysv/linux/sh/sysdep.h | 12 ++++++++++++ sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h | 7 +++++++ sysdeps/unix/sysv/linux/syscalls.list | 8 ++++---- sysdeps/unix/sysv/linux/x86_64/sysdep.h | 14 +++++++++++++- 18 files changed, 197 insertions(+), 15 deletions(-) (limited to 'sysdeps') diff --git a/sysdeps/powerpc/powerpc32/sysdep.h b/sysdeps/powerpc/powerpc32/sysdep.h index bc201a8..338c69a 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 9b895df..34c9caa 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 cb04cec..6e55061 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 e103ba3..3f6a92a 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 bbd068a..db83cee 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 616a9b5..c19e98a 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 785d3cf..3e3c874 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 4446b26..f22a3d2 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 4f08cc6..771c55c 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, , August 1999. Linux/PA-RISC changes by Philipp Rumpf, , 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 02a78d3..2e660c3 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 556e266..3065782 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 125c584..23e4202 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 af8515b..8a98fbf 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 f5a074f..41ec395 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 ea1cffb..a2542fb 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 7bf63b9..bc54b10 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 c982974..f499db7 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 c85c063..0edbe66 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 -- cgit v1.1