summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/sparc/sparc32/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/sparc32/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/sparc/sparc32/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h54
1 files changed, 37 insertions, 17 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
index c2e7e0aede..e3573fd454 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -22,6 +22,10 @@
 
 #include <sysdeps/unix/sparc/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
 
@@ -50,25 +54,35 @@
 
 #define LOC(name)  .L##name
 
-#ifdef PIC
-#define SYSCALL_ERROR_HANDLER					\
-	.global C_SYMBOL_NAME(__errno_location);		\
-        .type   C_SYMBOL_NAME(__errno_location),@function;	\
-	save   %sp,-96,%sp;					\
+#if RTLD_PRIVATE_ERRNO
+# define SYSCALL_ERROR_HANDLER						\
+	.section .gnu.linkonce.t.__sparc.get_pic.l7,"ax",@progbits;	\
+	.globl __sparc.get_pic.l7;					\
+	.hidden __sparc.get_pic.l7;					\
+	.type __sparc.get_pic.l7,@function;				\
+__sparc.get_pic.l7:							\
+	retl;								\
+	 add	%o7, %l7, %l7;						\
+	.previous;							\
+	save	%sp,-96,%sp;						\
+	sethi	%hi(_GLOBAL_OFFSET_TABLE_-4), %l7;			\
+	call	__sparc.get_pic.l7;					\
+	 add	%l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7;			\
+	ld	[%l7 + errno], %l0;					\
+	st	%i0, [%l0];						\
+	jmpl	%i7+8, %g0;						\
+	 restore %g0, -1, %o0;
+#else
+# define SYSCALL_ERROR_HANDLER					\
+	.global __errno_location;				\
+        .type   __errno_location,@function;			\
+	save   %sp, -96, %sp;					\
 	call   __errno_location;				\
 	 nop;							\
-	st	%i0,[%o0];					\
-	jmpl	%i7+8,%g0;					\
-	 restore %g0,-1,%o0;
-#else
-#define SYSCALL_ERROR_HANDLER					\
-	save	%sp,-96,%sp;					\
-	call	__errno_location;				\
-	nop;							\
-	st	%i0,[%o0];					\
-	jmpl	%i7+8,%g0;					\
-	 restore %g0,-1,%o0;
-#endif   /* PIC */
+	st	%i0, [%o0];					\
+	jmpl	%i7+8, %g0;					\
+	 restore %g0, -1, %o0;
+#endif
 
 #define PSEUDO(name, syscall_name, args)			\
 	.text;							\
@@ -97,6 +111,12 @@
 	" restore %%g0, -1, %%o0;"					\
 	".previous;"
 
+#define __INTERNAL_SYSCALL_STRING					\
+	"ta	0x10;"							\
+	"bcs,a	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",		\