diff options
Diffstat (limited to 'sysdeps')
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list | 51 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h | 50 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/Makefile | 4 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c | 9 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list | 30 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h | 70 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/sparc/sysdep.h | 114 |
7 files changed, 181 insertions, 147 deletions
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list index d08c1a9cac..c82ae16c1a 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list @@ -25,54 +25,3 @@ rt_sigprocmask - rt_sigprocmask 4 __syscall_rt_sigprocmask rt_sigqueueinfo - rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo rt_sigsuspend - rt_sigsuspend 2 __syscall_rt_sigsuspend rt_sigtimedwait - rt_sigtimedwait 4 __syscall_rt_sigtimedwait -s_execve execve execve 3 __syscall_execve -s_fstat64 fxstat64 fstat64 2 __syscall_fstat64 -s_ftruncate64 ftruncate64 ftruncate64 3 __syscall_ftruncate64 -s_getcwd getcwd getcwd 2 __syscall_getcwd -s_getdents getdents getdents 3 __syscall_getdents -s_getpriority getpriority getpriority 2 __syscall_getpriority -s_getresgid getresgid getresgid 3 __syscall_getresgid -s_getresuid getresuid getresuid 3 __syscall_getresuid -s_lstat64 lxstat64 lstat64 2 __syscall_lstat64 -s_mmap2 mmap64 mmap2 6 __syscall_mmap2 -s_poll poll poll 3 __syscall_poll -s_pread64 pread64 pread 5 __syscall_pread -s_ptrace ptrace ptrace 4 __syscall_ptrace -s_pwrite64 pwrite64 pwrite 5 __syscall_pwrite -s_reboot reboot reboot 3 __syscall_reboot -s_sigaction sigaction sigaction 3 __syscall_sigaction -s_sigpending sigpending sigpending 1 __syscall_sigpending -s_sigprocmask sigprocmask sigprocmask 3 __syscall_sigprocmask -s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend -s_stat64 xstat64 stat64 2 __syscall_stat64 -s_sysctl sysctl _sysctl 1 __syscall__sysctl -s_truncate64 truncate64 truncate64 3 __syscall_truncate64 -s_ustat ustat ustat 2 __syscall_ustat -sys_fstat fxstat fstat 2 __syscall_fstat -sys_lstat lxstat lstat 2 __syscall_lstat -sys_mknod xmknod mknod 3 __syscall_mknod -sys_readv readv readv 3 __syscall_readv -sys_stat xstat stat 2 __syscall_stat -sys_writev writev writev 3 __syscall_writev -s_chown chown chown 3 __syscall_chown -s_chown32 chown chown32 3 __syscall_chown32 -s_fchown fchown fchown 3 __syscall_fchown -s_fchown32 fchown fchown32 3 __syscall_fchown32 -s_lchown lchown lchown 3 __syscall_lchown -s_lchown32 lchown lchown32 3 __syscall_lchown32 -s_getgid getgid getgid 0 __syscall_getgid -s_getgid32 getgid getgid32 0 __syscall_getgid32 -s_getuid getuid getuid 0 __syscall_getuid -s_getuid32 getuid getuid32 0 __syscall_getuid32 -s_getgroups32 getgroups getgroups32 2 __syscall_getgroups32 -s_setgroups32 setgroups setgroups32 2 __syscall_setgroups32 -s_setfsgid32 setfsgid setfsgid32 1 __syscall_setfsgid32 -s_setfsuid32 setfsuid setfsuid32 1 __syscall_setfsuid32 -s_setregid32 setregid setregid32 2 __syscall_setregid32 -s_setreuid32 setreuid setreuid32 2 __syscall_setreuid32 -s_getegid getegid getegid 0 __syscall_getegid -s_geteuid geteuid geteuid 0 __syscall_geteuid -s_getegid32 getegid getegid32 0 __syscall_getegid32 -s_geteuid32 geteuid geteuid32 0 __syscall_geteuid32 -s_setgid32 setgid setgid32 1 __syscall_setgid32 -s_setuid32 setuid setuid32 1 __syscall_setuid32 diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h index 003c0483a8..ee235c2b43 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h @@ -17,8 +17,8 @@ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -#ifndef _LINUX_SPARC_SYSDEP_H -#define _LINUX_SPARC_SYSDEP_H 1 +#ifndef _LINUX_SPARC32_SYSDEP_H +#define _LINUX_SPARC32_SYSDEP_H 1 #include <sysdeps/unix/sparc/sysdep.h> @@ -56,20 +56,18 @@ .type C_SYMBOL_NAME(__errno_location),@function; \ save %sp,-96,%sp; \ call __errno_location; \ - nop; \ - st %i0,[%o0]; \ - restore; \ - retl; \ - mov -1,%o0; + nop; \ + st %i0,[%o0]; \ + jmpl %i7+8,%g0; \ + restore %g0,-1,%o0; #else #define SYSCALL_ERROR_HANDLER \ - save %sp,-96,%sp; \ - call __errno_location; \ + save %sp,-96,%sp; \ + call __errno_location; \ nop; \ - st %i0,[%o0]; \ - restore; \ - retl; \ - mov -1,%o0; + st %i0,[%o0]; \ + jmpl %i7+8,%g0; \ + restore %g0,-1,%o0; #endif /* PIC */ #define PSEUDO(name, syscall_name, args) \ @@ -82,6 +80,32 @@ SYSCALL_ERROR_HANDLER; \ 9000:; +#else /* __ASSEMBLER__ */ + +#define __SYSCALL_STRING \ + "ta 0x10;" \ + "bcs 2f;" \ + " nop;" \ + "1:" \ + ".subsection 2;" \ + "2:" \ + "save %%sp, -192, %%sp;" \ + "call __errno_location;" \ + " nop;" \ + "st %%i0,[%%o0];" \ + "ba 1b;" \ + " restore %%g0, -1, %%o0;" \ + ".previous;" + +#define __SYSCALL_CLOBBERS "g2", "g3", "g4", "g5", "g7", \ + "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", \ + "f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15", \ + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ + "cc", "memory" + +#include <sysdeps/unix/sysv/linux/sparc/sysdep.h> + #endif /* __ASSEMBLER__ */ #endif /* linux/sparc/sysdep.h */ diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile b/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile deleted file mode 100644 index 9d02acecc4..0000000000 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile +++ /dev/null @@ -1,4 +0,0 @@ -ifeq ($(subdir),signal) -sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait \ - rt_sigqueueinfo rt_sigaction rt_sigpending -endif diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c index 34d3c62e86..87468fd409 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c @@ -21,16 +21,13 @@ #include <string.h> #include <syscall.h> +#include <sysdep.h> #include <sys/signal.h> #include <errno.h> #include <kernel_sigaction.h> /* SPARC 64bit userland requires a kernel that has rt signals anyway. */ -extern int __syscall_rt_sigaction (int, const struct kernel_sigaction *, - struct kernel_sigaction *, unsigned long, - size_t); - static void __rt_sigreturn_stub (void); int @@ -50,8 +47,8 @@ __sigaction (int sig, __const struct sigaction *act, struct sigaction *oact) /* XXX The size argument hopefully will have to be changed to the real size of the user-level sigset_t. */ - ret = __syscall_rt_sigaction (sig, act ? &kact : 0, oact ? &koact : 0, - stub, _NSIG / 8); + ret = INLINE_SYSCALL (rt_sigaction, 5, sig, act ? &kact : 0, + oact ? &koact : 0, stub, _NSIG / 8); if (oact && ret >= 0) { diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list index 77c0e2608e..c4d40f5fff 100644 --- a/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list @@ -33,33 +33,3 @@ socketpair - socketpair 4 __socketpair socketpair getresuid - getresuid 3 getresuid getresgid - getresgid 3 getresgid - -# System calls with wrappers. -rt_sigaction - rt_sigaction 4 __syscall_rt_sigaction -rt_sigpending - rt_sigpending 2 __syscall_rt_sigpending -rt_sigprocmask - rt_sigprocmask 4 __syscall_rt_sigprocmask -rt_sigqueueinfo - rt_sigqueueinfo 3 __syscall_rt_sigqueueinfo -rt_sigsuspend - rt_sigsuspend 2 __syscall_rt_sigsuspend -rt_sigtimedwait - rt_sigtimedwait 4 __syscall_rt_sigtimedwait -s_execve execve execve 3 __syscall_execve -s_getcwd getcwd getcwd 2 __syscall_getcwd -s_getdents getdents getdents 3 __syscall_getdents -s_getpriority getpriority getpriority 2 __syscall_getpriority -s_getresgid getresgid getresgid 3 __syscall_getresgid -s_getresuid getresuid getresuid 3 __syscall_getresuid -s_ipc msgget ipc 5 __syscall_ipc -s_poll poll poll 3 __syscall_poll -s_ptrace ptrace ptrace 4 __syscall_ptrace -s_reboot reboot reboot 3 __syscall_reboot -s_sigaction sigaction sigaction 3 __syscall_sigaction -s_sigpending sigpending sigpending 1 __syscall_sigpending -s_sigprocmask sigprocmask sigprocmask 3 __syscall_sigprocmask -s_sigsuspend sigsuspend sigsuspend 3 __syscall_sigsuspend -s_sysctl sysctl _sysctl 1 __syscall__sysctl -s_ustat ustat ustat 2 __syscall_ustat -sys_fstat fxstat fstat 2 __syscall_fstat -sys_lstat lxstat lstat 2 __syscall_lstat -sys_mknod xmknod mknod 3 __syscall_mknod -sys_readv readv readv 3 __syscall_readv -sys_stat xstat stat 2 __syscall_stat -sys_writev writev writev 3 __syscall_writev diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h index 5a9a4e249b..6ce6d01d7b 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 Free Software Foundation, Inc. +/* Copyright (C) 1997, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Richard Henderson <richard@gnu.ai.mit.edu>, 1997. @@ -43,53 +43,13 @@ C_LABEL(name); \ .type name,@function; -#ifdef PIC -# ifdef _LIBC_REENTRANT -# define SYSCALL_ERROR_HANDLER \ - save %sp, -192, %sp; \ - call __errno_location; \ - nop; \ - st %i0,[%o0]; \ - sub %g0,1,%i0; \ - jmpl %i7+8, %g0; \ - restore -# else -# define SYSCALL_ERROR_HANDLER \ - .global C_SYMBOL_NAME(errno); \ - .type C_SYMBOL_NAME(errno),@object; \ - mov %o7, %g3; \ - 101: call 102f; \ - sethi %hi(_GLOBAL_OFFSET_TABLE_-(101b-.)), %g2; \ - 102: or %g2,%lo(_GLOBAL_OFFSET_TABLE_-(101b-.)), %g2; \ - sethi %hi(errno), %o1; \ - add %g2, %o7, %l7; \ - or %o1, %lo(errno), %o1; \ - mov %g3,%o7; \ - ldx [%l7+%o1], %g2; \ - st %o0, [%g2]; \ - retl; \ - sub %g0, 1, %i0 -# endif -#else -# ifdef _LIBC_REENTRANT -# define SYSCALL_ERROR_HANDLER \ +#define SYSCALL_ERROR_HANDLER \ save %sp, -192, %sp; \ call __errno_location; \ nop; \ st %i0, [%o0]; \ - sub %g0, 1, %i0; \ jmpl %i7+8, %g0; \ - restore -# else -# define SYSCALL_ERROR_HANDLER \ - .global C_SYMBOL_NAME(errno); \ - .type C_SYMBOL_NAME(errno),@object; \ - sethi %hi(errno), %g1; \ - st %i0, [%g1 + %lo(errno)]; \ - retl; \ - sub %g0, 1, %i0 -# endif -#endif + restore %g0, -1, %o0 #define PSEUDO(name, syscall_name, args) \ .text; \ @@ -115,6 +75,30 @@ #define r1 %o1 #define MOVE(x,y) mov x, y +#else /* __ASSEMBLER__ */ + +#define __SYSCALL_STRING \ + "ta 0x6d;" \ + "bcc,pt %%xcc, 1f;" \ + " nop;" \ + "save %%sp, -192, %%sp;" \ + "call __errno_location;" \ + " nop;" \ + "st %%i0,[%%o0];" \ + "restore %%g0, -1, %%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", \ + "f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23", \ + "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31", \ + "f32", "f34", "f36", "f38", "f40", "f42", "f44", "f46", \ + "f48", "f50", "f52", "f54", "f56", "f58", "f60", "f62", \ + "cc", "memory" + +#include <sysdeps/unix/sysv/linux/sparc/sysdep.h> + #endif /* __ASSEMBLER__ */ /* This is the offset from the %sp to the backing store above the diff --git a/sysdeps/unix/sysv/linux/sparc/sysdep.h b/sysdeps/unix/sysv/linux/sparc/sysdep.h new file mode 100644 index 0000000000..5fd9a158b0 --- /dev/null +++ b/sysdeps/unix/sysv/linux/sparc/sysdep.h @@ -0,0 +1,114 @@ +/* Copyright (C) 2000 Free Software Foundation, Inc. + This file is part of the GNU C Library. + Contributed by Jakub Jelinek <jakub@redhat.com>, 2000. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with the GNU C Library; see the file COPYING.LIB. If not, + write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef _LINUX_SPARC_SYSDEP_H +#define _LINUX_SPARC_SYSDEP_H 1 + +#undef INLINE_SYSCALL +#define INLINE_SYSCALL(name, nr, args...) inline_syscall##nr(name, args) + +#define inline_syscall0(name,dummy...) \ +({ \ + register long __o0 __asm__ ("o0"); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#define inline_syscall1(name,arg1) \ +({ \ + register long __o0 __asm__ ("o0") = (long)(arg1); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1), "1" (__o0) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#define inline_syscall2(name,arg1,arg2) \ +({ \ + register long __o0 __asm__ ("o0") = (long)(arg1); \ + register long __o1 __asm__ ("o1") = (long)(arg2); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1), "1" (__o0), "r" (__o1) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#define inline_syscall3(name,arg1,arg2,arg3) \ +({ \ + register long __o0 __asm__ ("o0") = (long)(arg1); \ + register long __o1 __asm__ ("o1") = (long)(arg2); \ + register long __o2 __asm__ ("o2") = (long)(arg3); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#define inline_syscall4(name,arg1,arg2,arg3,arg4) \ +({ \ + register long __o0 __asm__ ("o0") = (long)(arg1); \ + register long __o1 __asm__ ("o1") = (long)(arg2); \ + register long __o2 __asm__ ("o2") = (long)(arg3); \ + register long __o3 __asm__ ("o3") = (long)(arg4); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \ + "r" (__o3) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#define inline_syscall5(name,arg1,arg2,arg3,arg4,arg5) \ +({ \ + register long __o0 __asm__ ("o0") = (long)(arg1); \ + register long __o1 __asm__ ("o1") = (long)(arg2); \ + register long __o2 __asm__ ("o2") = (long)(arg3); \ + register long __o3 __asm__ ("o3") = (long)(arg4); \ + register long __o4 __asm__ ("o4") = (long)(arg5); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \ + "r" (__o3), "r" (__o4) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#define inline_syscall6(name,arg1,arg2,arg3,arg4,arg5,arg6) \ +({ \ + register long __o0 __asm__ ("o0") = (long)(arg1); \ + register long __o1 __asm__ ("o1") = (long)(arg2); \ + register long __o2 __asm__ ("o2") = (long)(arg3); \ + register long __o3 __asm__ ("o3") = (long)(arg4); \ + register long __o4 __asm__ ("o4") = (long)(arg5); \ + register long __o5 __asm__ ("o5") = (long)(arg6); \ + register long __g1 __asm__ ("g1") = __NR_##name; \ + __asm__ (__SYSCALL_STRING : "=r" (__g1), "=r" (__o0) : \ + "0" (__g1), "1" (__o0), "r" (__o1), "r" (__o2), \ + "r" (__o3), "r" (__o4), "r" (__o5) : \ + __SYSCALL_CLOBBERS); \ + __o0; \ +}) + +#endif /* _LINUX_SPARC_SYSDEP_H */ |