diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h | 26 |
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 */ |