This is the mail archive of the libc-hacker@sourceware.cygnus.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] INLINE_SYSCALL for sparc(64)-linux


Hi!

This is INLINE_SYSCALL implementation for sparc-linux/sparc64-linux.

2000-01-28  Jakub Jelinek  <jakub@redhat.com>

	* sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h
	(SYSCALL_ERROR_HANDLER): Optimize.
	(__SYSCALL_STRING, __SYSCALL_CLOBBERS): Define.
	Include linux/sparc/sysdep.h.
	* sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list: Remove
	stubs for inlined syscalls.
	* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h
	(SYSCALL_ERROR_HANDLER): Optimize.
	(__SYSCALL_STRING, __SYSCALL_CLOBBERS): Define.
	Include linux/sparc/sysdep.h.
	* sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list: Remove
	stubs for inlined syscalls.
	* sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c (__sigaction):
	Use INLINE_SYSCALL.
	* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile: Remove.
	* sysdeps/unix/sysv/linux/sparc/sysdep.h: New file.

--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h.jj	Fri May 29 12:20:53 1998
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep.h	Fri Jan 28 17:26:09 2000
@@ -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)			\
@@ -81,6 +79,32 @@
 	nop;							\
 	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__ */
 
--- libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list.jj	Tue Jan 25 15:36:39 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc32/syscalls.list	Fri Jan 28 17:29:49 2000
@@ -25,54 +25,3 @@ rt_sigprocmask	-	rt_sigprocmask	4	__sysc
 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
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h.jj	Wed Sep 16 19:50:14 1998
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep.h	Fri Jan 28 17:16:33 2000
@@ -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;								\
@@ -114,6 +74,30 @@
 #define r0              %o0
 #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__ */
 
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list.jj	Fri Jan 28 14:54:12 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/syscalls.list	Fri Jan 28 17:43:57 2000
@@ -33,33 +33,3 @@ socketpair	-	socketpair	4	__socketpair	s
 
 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
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c.jj	Tue Dec 21 11:08:05 1999
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/sigaction.c	Fri Jan 28 17:42:00 2000
@@ -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 sig
 
   /* 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)
     {
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile.jj	Wed Oct 21 17:39:39 1998
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile	Fri Jan 28 17:44:09 2000
@@ -1,4 +0,0 @@
-ifeq ($(subdir),signal)
-sysdep_routines += rt_sigsuspend rt_sigprocmask rt_sigtimedwait	\
-		   rt_sigqueueinfo rt_sigaction rt_sigpending
-endif
--- libc/sysdeps/unix/sysv/linux/sparc/sysdep.h.jj	Fri Jan 28 17:16:40 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sysdep.h	Fri Jan 28 17:18:04 2000
@@ -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)						\
+({									\
+	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 */

Cheers,
    Jakub
___________________________________________________________________
Jakub Jelinek | jakub@redhat.com | http://sunsite.mff.cuni.cz/~jj
Linux version 2.3.41 on a sparc64 machine (1343.49 BogoMips)
___________________________________________________________________

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]