aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/x86_64/sysdep.h
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-10-24 18:49:00 +0000
committerRoland McGrath <roland@gnu.org>2002-10-24 18:49:00 +0000
commit369b849f1a382df2c1ee5d3a997bf318950cf5ab (patch)
treed39acd6080d24649012bd3862ca8837d2438a822 /sysdeps/unix/sysv/linux/x86_64/sysdep.h
parent90d598708199f0506e390bb9866e4bdb592f858a (diff)
downloadglibc-369b849f1a382df2c1ee5d3a997bf318950cf5ab.tar
glibc-369b849f1a382df2c1ee5d3a997bf318950cf5ab.tar.gz
glibc-369b849f1a382df2c1ee5d3a997bf318950cf5ab.tar.bz2
glibc-369b849f1a382df2c1ee5d3a997bf318950cf5ab.zip
* sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h (INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros. (INLINE_SYSCALL): Use that. * sysdeps/unix/sysv/linux/s390/s390-64/sysdep.h (INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros. (INLINE_SYSCALL): Use that. * sysdeps/unix/sysv/linux/x86_64/sysdep.h (INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros. (INLINE_SYSCALL): Use that. * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h: Include dl-sysdep.h. (SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant. (__INTERNAL_SYSCALL_STRING): Define. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h: Include dl-sysdep.h. (SYSCALL_ERROR_HANDLER): Define RTLD_PRIVATE_ERRNO variant. (__INTERNAL_SYSCALL_STRING): Define. * sysdeps/unix/sysv/linux/sparc/sysdep.h (INLINE_SYSCALL): Pass __SYSCALL_STRING to inline_syscall*. (INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO): New macros. (inline_syscall0, inline_syscall1, inline_syscall2, inline_syscall3, inline_syscall4, inline_syscall5, inline_syscall6): Add string argument. 2002-10-24 Roland McGrath <roland@redhat.com> * libio/bug-wfflush.c: New file. * libio/Makefile (tests): Add bug-wfflush.
Diffstat (limited to 'sysdeps/unix/sysv/linux/x86_64/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/x86_64/sysdep.h22
1 files changed, 17 insertions, 5 deletions
diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index 2da4d41fac..5c4c7082d1 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -186,6 +186,17 @@
#undef INLINE_SYSCALL
#define INLINE_SYSCALL(name, nr, args...) \
({ \
+ unsigned long resultvar = INTERNAL_SYSCALL (name, nr, args); \
+ if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (resultvar), 0)) \
+ { \
+ __set_errno (INTERNAL_SYSCALL_ERRNO (resultvar)); \
+ resultvar = (unsigned long) -1; \
+ } \
+ (long) resultvar; })
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, nr, args...) \
+ ({ \
unsigned long resultvar; \
LOAD_ARGS_##nr (args) \
asm volatile ( \
@@ -193,13 +204,14 @@
"syscall\n\t" \
: "=a" (resultvar) \
: "i" (__NR_##name) ASM_ARGS_##nr : "memory", "cc", "r11", "cx"); \
- if (resultvar >= (unsigned long) -4095) \
- { \
- __set_errno (-resultvar); \
- resultvar = (unsigned long) -1; \
- } \
(long) resultvar; })
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val) ((unsigned long) (val) >= -4095L)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val) (-(val))
+
#define LOAD_ARGS_0()
#define ASM_ARGS_0