about summary refs log tree commit diff
path: root/sysdeps
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps')
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list51
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h50
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c9
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list30
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h70
-rw-r--r--sysdeps/unix/sysv/linux/sparc/sysdep.h114
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 */