aboutsummaryrefslogtreecommitdiff
path: root/sysdeps
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2003-03-23 19:44:31 +0000
committerUlrich Drepper <drepper@redhat.com>2003-03-23 19:44:31 +0000
commit9eb88290df0c6522a7a52fa44ed821a6fba60a5a (patch)
tree4c663f4b2c765faefbece43109e24415b0b014fc /sysdeps
parentf9ad605a05633387c0bb4048158f047a3c2df014 (diff)
downloadglibc-9eb88290df0c6522a7a52fa44ed821a6fba60a5a.zip
glibc-9eb88290df0c6522a7a52fa44ed821a6fba60a5a.tar.gz
glibc-9eb88290df0c6522a7a52fa44ed821a6fba60a5a.tar.bz2
Update.
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.
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/powerpc/powerpc32/sysdep.h13
-rw-r--r--sysdeps/powerpc/powerpc64/sysdep.h14
-rw-r--r--sysdeps/unix/alpha/sysdep.h19
-rw-r--r--sysdeps/unix/sparc/sysdep.h9
-rw-r--r--sysdeps/unix/syscalls.list6
-rw-r--r--sysdeps/unix/sysdep.h5
-rw-r--r--sysdeps/unix/sysv/linux/arm/sysdep.h16
-rw-r--r--sysdeps/unix/sysv/linux/cris/sysdep.h14
-rw-r--r--sysdeps/unix/sysv/linux/hppa/sysdep.h15
-rw-r--r--sysdeps/unix/sysv/linux/i386/sysdep.h12
-rw-r--r--sysdeps/unix/sysv/linux/ia64/sysdep.h9
-rw-r--r--sysdeps/unix/sysv/linux/m68k/sysdep.h10
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h13
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h16
-rw-r--r--sysdeps/unix/sysv/linux/sh/sysdep.h12
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h7
-rw-r--r--sysdeps/unix/sysv/linux/syscalls.list8
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sysdep.h14
18 files changed, 197 insertions, 15 deletions
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, <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 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