summaryrefslogtreecommitdiff
path: root/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2012-02-21 15:42:42 -0800
committerDavid S. Miller <davem@davemloft.net>2012-02-20 17:51:53 -0800
commit3d2b3019e0efa9735370498122ac80298deff8c7 (patch)
tree693771bb0b1fba08098558d99613ce80bc36a923 /sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
parentc80098a9a05b7d5f8ad1488135f2cee613998c50 (diff)
Use sparc GOTDATA relocations whenever possible.
* sysdeps/sparc/crti.S: Try to use GOTDATA relocs. * sysdeps/sparc/sparc32/dl-machine.h (RTLD_START): Likewise. * sysdeps/sparc/sparc32/elf/start.S: Likewise. * sysdeps/sparc/sparc64/dl-machine.h (RTLD_START): Likewise. * sysdeps/sparc/sparc64/elf/start.S: Likewise. * sysdeps/sparc/sparc64/multiarch/memcpy.S: Likewise. * sysdeps/sparc/sparc64/multiarch/memset.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/____longjmp_chk.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h (SYSCALL_ERROR_HANDLER): Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/____longjmp_chk.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/brk.S: Likewise. * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h (SYSCALL_ERROR_HANDLER): Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h26
1 files changed, 24 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
index fd7ded5af9..3d6042e9ec 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
@@ -88,7 +88,17 @@ ENTRY(name); \
mov %g1, %o7;
#else
# if RTLD_PRIVATE_ERRNO
-# define SYSCALL_ERROR_HANDLER \
+# ifdef HAVE_BINUTILS_GOTDATA
+# define SYSCALL_ERROR_HANDLER \
+0: SETUP_PIC_REG_LEAF(o2,g1) \
+ sethi %gdop_hix22(rtld_errno), %g1; \
+ xor %g1, %gdop_lox10(rtld_errno), %g1;\
+ ld [%o2 + %g1], %g1, %gdop(rtld_errno); \
+ st %o0, [%g1]; \
+ jmp %o7 + 8; \
+ mov -1, %o0;
+# else
+# define SYSCALL_ERROR_HANDLER \
0: SETUP_PIC_REG_LEAF(o2,g1) \
sethi %hi(rtld_errno), %g1; \
or %g1, %lo(rtld_errno), %g1; \
@@ -96,6 +106,7 @@ ENTRY(name); \
st %o0, [%g1]; \
jmp %o7 + 8; \
mov -1, %o0;
+# endif
# elif defined _LIBC_REENTRANT
# ifndef NOT_IN_libc
@@ -112,7 +123,17 @@ ENTRY(name); \
jmp %o7 + 8; \
mov -1, %o0;
# else
-# define SYSCALL_ERROR_HANDLER \
+# ifdef HAVE_BINUTILS_GOTDATA
+# define SYSCALL_ERROR_HANDLER \
+0: SETUP_PIC_REG_LEAF(o2,g1) \
+ sethi %gdop_hix22(errno), %g1;\
+ xor %g1, %gdop_lox10(errno), %g1;\
+ ld [%o2 + %g1], %g1, %gdop(errno);\
+ st %o0, [%g1]; \
+ jmp %o7 + 8; \
+ mov -1, %o0;
+# else
+# define SYSCALL_ERROR_HANDLER \
0: SETUP_PIC_REG_LEAF(o2,g1) \
sethi %hi(errno), %g1; \
or %g1, %lo(errno), %g1; \
@@ -120,6 +141,7 @@ ENTRY(name); \
st %o0, [%g1]; \
jmp %o7 + 8; \
mov -1, %o0;
+# endif
# endif /* _LIBC_REENTRANT */
#endif /* PIC */