summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/sparc/sparc64/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/sparc/sparc64/sysdep.h
parent90d598708199f0506e390bb9866e4bdb592f858a (diff)
* 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/sparc/sparc64/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h44
1 files changed, 38 insertions, 6 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
index 18218621e8..3c8999a75b 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
@@ -1,4 +1,4 @@
-/* Copyright (C) 1997, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1997, 2000, 2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997.
@@ -22,6 +22,10 @@
#include <sysdeps/unix/sysdep.h>
+#ifdef IS_IN_rtld
+# include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */
+#endif
+
#undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name
@@ -43,13 +47,35 @@
C_LABEL(name); \
.type name,@function;
-#define SYSCALL_ERROR_HANDLER \
+#if RTLD_PRIVATE_ERRNO
+# define SYSCALL_ERROR_HANDLER \
+ .section .gnu.linkonce.t.__sparc64.get_pic.l7,"ax",@progbits; \
+ .globl __sparc64.get_pic.l7; \
+ .hidden __sparc64.get_pic.l7; \
+ .type __sparc64.get_pic.l7,@function; \
+__sparc64.get_pic.l7: \
+ retl; \
+ add %o7, %l7, %l7; \
+ .previous; \
save %sp, -192, %sp; \
- call __errno_location; \
- nop; \
- st %i0, [%o0]; \
+ sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7; \
+ call __sparc.get_pic.l7; \
+ add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7; \
+ ldx [%l7 + errno], %l0; \
+ st %i0, [%l0]; \
jmpl %i7+8, %g0; \
- restore %g0, -1, %o0
+ restore %g0, -1, %o0;
+#else
+# define SYSCALL_ERROR_HANDLER \
+ .global __errno_location; \
+ .type __errno_location,@function; \
+ save %sp, -192, %sp; \
+ call __errno_location; \
+ nop; \
+ st %i0, [%o0]; \
+ jmpl %i7+8, %g0; \
+ restore %g0, -1, %o0;
+#endif
#define PSEUDO(name, syscall_name, args) \
.text; \
@@ -88,6 +114,12 @@
"restore %%g0, -1, %%o0;" \
"1:"
+#define __INTERNAL_SYSCALL_STRING \
+ "ta 0x6d;" \
+ "bcs,a,pt %%xcc, 1f;" \
+ " sub %%g0, %%o0, %%o0;" \
+ "1:"
+
#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \