about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/s390/s390-32/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/s390/s390-32/sysdep.h
parent90d598708199f0506e390bb9866e4bdb592f858a (diff)
downloadglibc-369b849f1a382df2c1ee5d3a997bf318950cf5ab.tar.gz
glibc-369b849f1a382df2c1ee5d3a997bf318950cf5ab.tar.xz
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/s390/s390-32/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h44
1 files changed, 28 insertions, 16 deletions
diff --git a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
index 0a95f915ab..c26d3f1307 100644
--- a/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/s390/s390-32/sysdep.h
@@ -119,24 +119,36 @@
 #endif /* __ASSEMBLER__ */
 
 #undef INLINE_SYSCALL
-#define INLINE_SYSCALL(name, nr, args...)                                     \
-  ({                                                                          \
-    DECLARGS_##nr(args)                                                       \
-    int err;                                                                  \
-    asm volatile (                                                            \
-    LOADARGS_##nr                                                             \
-    "svc    %b1\n\t"                                                          \
-    "lr     %0,%%r2\n\t"                                                      \
-    : "=d" (err)                                                              \
-    : "I" (__NR_##name) ASMFMT_##nr                                           \
-    : "memory", "cc", "2", "3", "4", "5", "6");                               \
-    if (err >= 0xfffff001)                                                    \
-     {                                                                        \
-       __set_errno(-err);                                                     \
-       err = 0xffffffff;                                                      \
-     }                                                                        \
+#define INLINE_SYSCALL(name, nr, args...)				      \
+  ({									      \
+    unsigned int err = INTERNAL_SYSCALL (name, nr, args);		      \
+    if (__builtin_expect (INTERNAL_SYSCALL_ERROR_P (err), 0))		      \
+     {									      \
+       __set_errno (INTERNAL_SYSCALL_ERRNO (err));			      \
+       err = 0xffffffff;						      \
+     }									      \
+    (int) err; })
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, nr, args...)				      \
+  ({									      \
+    DECLARGS_##nr(args)							      \
+    int err;								      \
+    asm volatile (							      \
+    LOADARGS_##nr							      \
+    "svc    %b1\n\t"							      \
+    "lr     %0,%%r2\n\t"						      \
+    : "=d" (err)							      \
+    : "I" (__NR_##name) ASMFMT_##nr					      \
+    : "memory", "cc", "2", "3", "4", "5", "6");				      \
     (int) err; })
 
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val)	((unsigned int) (val) >= 0xfffff001u)
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val)	(-(val))
+
 #define DECLARGS_0()
 #define DECLARGS_1(arg1) \
 	unsigned int gpr2 = (unsigned int) (arg1);