diff options
Diffstat (limited to 'sysdeps/unix/sysv/linux/sparc')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/Versions | 3 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h | 49 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list | 2 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h | 12 |
4 files changed, 65 insertions, 1 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/Versions b/sysdeps/unix/sysv/linux/sparc/sparc32/Versions index 4529e7fe6f..e6903728f3 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/Versions +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/Versions @@ -17,4 +17,7 @@ libc { # s* scandir64; } + GLIBC_2.3.3 { + posix_fadvise64; + } } diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h index bc54b107c4..6dcf0cd57f 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h @@ -25,6 +25,7 @@ #ifdef IS_IN_rtld # include <dl-sysdep.h> /* Defines RTLD_PRIVATE_ERRNO. */ #endif +#include <tls.h> #undef SYS_ify #define SYS_ify(syscall_name) __NR_##syscall_name @@ -36,6 +37,7 @@ /* Linux/SPARC uses a different trap number */ #undef PSEUDO #undef PSEUDO_NOERRNO +#undef PSEUDO_ERRVAL #undef ENTRY #undef END #undef LOC @@ -86,6 +88,47 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ jmpl %i7+8, %g0; \ restore %g0, -1, %o0; \ .previous; +#elif USE___THREAD +# ifndef NOT_IN_libc +# define SYSCALL_ERROR_ERRNO __libc_errno +# else +# define SYSCALL_ERROR_ERRNO errno +# endif +# ifdef SHARED +# 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; \ +SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ + save %sp,-96,%sp; \ + sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %l1; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_-4), %l7; \ + call __sparc.get_pic.l7; \ + add %l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7; \ + add %l1, %tie_lo10(SYSCALL_ERROR_ERRNO), %l1; \ + ld [%l7 + %l1], %l1, %tie_ld(SYSCALL_ERROR_ERRNO); \ + st %i0, [%g7 + %l1], %tie_add(SYSCALL_ERROR_ERRNO); \ + jmpl %i7+8, %g0; \ + restore %g0, -1, %o0; \ + .previous; +# else +# define SYSCALL_ERROR_HANDLER \ +SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ + sethi %tie_hi22(SYSCALL_ERROR_ERRNO), %g1; \ + sethi %hi(_GLOBAL_OFFSET_TABLE_), %g2; \ + add %g1, %tie_lo10(SYSCALL_ERROR_ERRNO), %g1; \ + add %g2, %lo(_GLOBAL_OFFSET_TABLE_), %g2; \ + ld [%g2 + %g1], %g1, %tie_ld(SYSCALL_ERROR_ERRNO); \ + st %o0, [%g7 + %g1], %tie_add(SYSCALL_ERROR_ERRNO); \ + jmpl %o7+8, %g0; \ + mov -1, %o0; \ + .previous; +# endif #else # define SYSCALL_ERROR_HANDLER \ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ @@ -115,6 +158,12 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ LOADSYSCALL(syscall_name); \ ta 0x10 +#define PSEUDO_ERRVAL(name, syscall_name, args) \ + .text; \ + ENTRY(name); \ + LOADSYSCALL(syscall_name); \ + ta 0x10 + #else /* __ASSEMBLER__ */ #define __SYSCALL_STRING \ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list index ac0610feda..d480d25c38 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list @@ -13,7 +13,7 @@ truncate - truncate 2 truncate truncate64 mmap - mmap 6 __mmap mmap __mmap64 mmap64 readahead - readahead 3 __readahead readahead sendfile - sendfile i:iipi sendfile sendfile64 -posix_fadvise64 - fadvise64 4 posix_fadvise64 posix_fadvise +posix_fadvise64 - fadvise64 Vi:iiii posix_fadvise64 posix_fadvise # Override select.S in parent directory: select - select C:5 __select select diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h index c16e8ff673..5340fca9d1 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h @@ -36,6 +36,7 @@ /* Linux/SPARC uses a different trap number */ #undef PSEUDO #undef PSEUDO_NOERRNO +#undef PSEUDO_ERRVAL #undef ENTRY #define ENTRY(name) \ @@ -108,6 +109,12 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ LOADSYSCALL(syscall_name); \ ta 0x6d +#define PSEUDO_ERRVAL(name, syscall_name, args) \ + .text; \ + ENTRY(name); \ + LOADSYSCALL(syscall_name); \ + ta 0x6d + #undef PSEUDO_END #define PSEUDO_END(name) \ .size name,.-name @@ -116,6 +123,10 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ #define PSEUDO_END_NOERRNO(name) \ .size name,.-name +#undef PSEUDO_END_ERRVAL +#define PSEUDO_END_ERRVAL(name) \ + .size name,.-name + #undef END #define END(name) \ .size name,.-name @@ -123,6 +134,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler) \ /* Careful here! This "ret" define can interfere; use jmpl if unsure. */ #define ret retl; nop #define ret_NOERRNO retl; nop +#define ret_ERRVAL retl; nop #define r0 %o0 #define r1 %o1 #define MOVE(x,y) mov x, y |