[PATCH] mips: new style syscalls.h

Atsushi Nemoto anemo at mba.ocn.ne.jp
Sat Feb 10 14:26:31 UTC 2007


This patch imports INLINE_SYSCALL, etc. from glibc-2.5 ports and
implements _syscall[0-7] by using them, like arm and powerpc.

I think this patch does not change functionality, but gives better
__SYSCALL_CLOBBERS for N32/N64.

-------------- next part --------------
diff -urNp -x '*~' uClibc-20070208/libc/sysdeps/linux/mips/bits/syscalls.h uClibc/libc/sysdeps/linux/mips/bits/syscalls.h
--- uClibc-20070208/libc/sysdeps/linux/mips/bits/syscalls.h	2007-02-08 17:10:40.000000000 +0900
+++ uClibc/libc/sysdeps/linux/mips/bits/syscalls.h	2007-02-09 18:04:33.000000000 +0900
@@ -12,348 +12,665 @@
 
 #define SYS_ify(syscall_name)  (__NR_##syscall_name)
 
+#undef _syscall0
+#define _syscall0(type,name) \
+type name(void) \
+{ \
+return (type) (INLINE_SYSCALL(name, 0)); \
+}
+
+#undef _syscall1
+#define _syscall1(type,name,type1,arg1) \
+type name(type1 arg1) \
+{ \
+return (type) (INLINE_SYSCALL(name, 1, arg1)); \
+}
+
+#undef _syscall2
+#define _syscall2(type,name,type1,arg1,type2,arg2) \
+type name(type1 arg1,type2 arg2) \
+{ \
+return (type) (INLINE_SYSCALL(name, 2, arg1, arg2)); \
+}
+
+#undef _syscall3
+#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) \
+type name(type1 arg1,type2 arg2,type3 arg3) \
+{ \
+return (type) (INLINE_SYSCALL(name, 3, arg1, arg2, arg3)); \
+}
+
+#undef _syscall4
+#define _syscall4(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4) \
+type name (type1 arg1, type2 arg2, type3 arg3, type4 arg4) \
+{ \
+return (type) (INLINE_SYSCALL(name, 4, arg1, arg2, arg3, arg4)); \
+} 
+
+#undef _syscall5
+#define _syscall5(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
+	  type5,arg5) \
+type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5) \
+{ \
+return (type) (INLINE_SYSCALL(name, 5, arg1, arg2, arg3, arg4, arg5)); \
+}
+
+#undef _syscall6
+#define _syscall6(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
+	  type5,arg5,type6,arg6) \
+type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6) \
+{ \
+return (type) (INLINE_SYSCALL(name, 6, arg1, arg2, arg3, arg4, arg5, arg6)); \
+}
+
+#undef _syscall7
+#define _syscall7(type,name,type1,arg1,type2,arg2,type3,arg3,type4,arg4, \
+	  type5,arg5,type6,arg6,type7,arg7) \
+type name (type1 arg1,type2 arg2,type3 arg3,type4 arg4,type5 arg5, type6 arg6,type7 arg7) \
+{ \
+return (type) (INLINE_SYSCALL(name, 7, arg1, arg2, arg3, arg4, arg5, arg6, arg7)); \
+}
+
+/*
+ * Import from:
+ *	glibc-ports/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+ *	glibc-ports/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
+ *	glibc-ports/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h
+ */
+
+/* Define a macro which expands into the inline wrapper code for a system
+   call.  */
+#undef INLINE_SYSCALL
+#define INLINE_SYSCALL(name, nr, args...)                               \
+  ({ INTERNAL_SYSCALL_DECL(err);					\
+     long result_var = INTERNAL_SYSCALL (name, err, nr, args);		\
+     if ( INTERNAL_SYSCALL_ERROR_P (result_var, err) )			\
+       {								\
+	 __set_errno (INTERNAL_SYSCALL_ERRNO (result_var, err));	\
+	 result_var = -1L;						\
+       }								\
+     result_var; })
+
+#undef INTERNAL_SYSCALL_DECL
+#define INTERNAL_SYSCALL_DECL(err) long err
+
+#undef INTERNAL_SYSCALL_ERROR_P
+#define INTERNAL_SYSCALL_ERROR_P(val, err)   ((long) (err))
+
+#undef INTERNAL_SYSCALL_ERRNO
+#define INTERNAL_SYSCALL_ERRNO(val, err)     (val)
+
+#undef INTERNAL_SYSCALL
+#define INTERNAL_SYSCALL(name, err, nr, args...) \
+	internal_syscall##nr (, "li\t$2, %2\t\t\t# " #name "\n\t",	\
+			      "i" (SYS_ify (name)), err, args)
+
+#undef INTERNAL_SYSCALL_NCS
+#define INTERNAL_SYSCALL_NCS(number, err, nr, args...) \
+	internal_syscall##nr (= number, , "r" (__v0), err, args)
+
+#if _MIPS_SIM == _ABIO32
+
+#define internal_syscall0(ncs_init, cs_init, input, err, dummy...)	\
+({									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a3 asm("$7");					\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	".set reorder"							\
+	: "=r" (__v0), "=r" (__a3)					\
+	: input								\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall1(ncs_init, cs_init, input, err, arg1)		\
+({									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a3 asm("$7");					\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	".set reorder"							\
+	: "=r" (__v0), "=r" (__a3)					\
+	: input, "r" (__a0)						\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2)	\
+({									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a1 asm("$5") = (long) arg2;			\
+	register long __a3 asm("$7");					\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	".set\treorder"						\
+	: "=r" (__v0), "=r" (__a3)					\
+	: input, "r" (__a0), "r" (__a1)					\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3)\
+({									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a1 asm("$5") = (long) arg2;			\
+	register long __a2 asm("$6") = (long) arg3;			\
+	register long __a3 asm("$7");					\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	".set\treorder"						\
+	: "=r" (__v0), "=r" (__a3)					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4)\
+({									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a1 asm("$5") = (long) arg2;			\
+	register long __a2 asm("$6") = (long) arg3;			\
+	register long __a3 asm("$7") = (long) arg4;			\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	".set\treorder"						\
+	: "=r" (__v0), "+r" (__a3)					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#ifdef __UCLIBC__
+#define FORCE_FRAME_POINTER
+#else
+/* We need to use a frame pointer for the functions in which we
+   adjust $sp around the syscall, or debug information and unwind
+   information will be $sp relative and thus wrong during the syscall.  As
+   of GCC 3.4.3, this is sufficient.  */
+#define FORCE_FRAME_POINTER alloca (4)
+#endif
+
+#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5)\
+({									\
+	long _sys_result;						\
+									\
+	FORCE_FRAME_POINTER;						\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a1 asm("$5") = (long) arg2;			\
+	register long __a2 asm("$6") = (long) arg3;			\
+	register long __a3 asm("$7") = (long) arg4;			\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	"subu\t$29, 32\n\t"						\
+	"sw\t%6, 16($29)\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	"addiu\t$29, 32\n\t"						\
+	".set\treorder"						\
+	: "=r" (__v0), "+r" (__a3)					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2),			\
+	  "r" ((long)arg5)						\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6)\
+({									\
+	long _sys_result;						\
+									\
+	FORCE_FRAME_POINTER;						\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a1 asm("$5") = (long) arg2;			\
+	register long __a2 asm("$6") = (long) arg3;			\
+	register long __a3 asm("$7") = (long) arg4;			\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	"subu\t$29, 32\n\t"						\
+	"sw\t%6, 16($29)\n\t"						\
+	"sw\t%7, 20($29)\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	"addiu\t$29, 32\n\t"						\
+	".set\treorder"						\
+	: "=r" (__v0), "+r" (__a3)					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2),			\
+	  "r" ((long)arg5), "r" ((long)arg6)				\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall7(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6, arg7)\
+({									\
+	long _sys_result;						\
+									\
+	FORCE_FRAME_POINTER;						\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1;			\
+	register long __a1 asm("$5") = (long) arg2;			\
+	register long __a2 asm("$6") = (long) arg3;			\
+	register long __a3 asm("$7") = (long) arg4;			\
+	__asm__ volatile (						\
+	".set\tnoreorder\n\t"						\
+	"subu\t$29, 32\n\t"						\
+	"sw\t%6, 16($29)\n\t"						\
+	"sw\t%7, 20($29)\n\t"						\
+	"sw\t%8, 24($29)\n\t"						\
+	cs_init								\
+	"syscall\n\t"							\
+	"addiu\t$29, 32\n\t"						\
+	".set\treorder"						\
+	: "=r" (__v0), "+r" (__a3)					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2),			\
+	  "r" ((long)arg5), "r" ((long)arg6), "r" ((long)arg7)		\
+	: __SYSCALL_CLOBBERS);						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
 #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \
 	"$14", "$15", "$24", "$25", "memory"
 
-#define _syscall0(type,name) \
-type name(void) \
-{ 									\
-	long err;							\
-	long sys_result;						\
+#elif _MIPS_SIM == _ABIN32
+
+#define internal_syscall0(ncs_init, cs_init, input, err, dummy...)	\
+({ 									\
+	long _sys_result;						\
+									\
 	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a3 asm("$7"); 				\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a3 asm("$7");				\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %2	# " #name "\n\t"				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
 	".set reorder" 							\
 	: "=r" (__v0), "=r" (__a3) 					\
-	: "i" (SYS_ify(name))						\
-	: __SYSCALL_CLOBBERS); \
+	: input								\
+	: __SYSCALL_CLOBBERS); 						\
 	err = __a3;							\
-	sys_result = __v0;						\
+	_sys_result = __v0;						\
 	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	_sys_result;							\
+})
 
-#define _syscall1(type,name,atype,a) \
-type name(atype a) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a3 asm("$7"); 				\
+#define internal_syscall1(ncs_init, cs_init, input, err, arg1)		\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a3 asm("$7"); 				\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %3\t\t\t# " #name "\n\t"				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
 	".set reorder" 							\
 	: "=r" (__v0), "=r" (__a3) 					\
-	: "r" (__a0), "i" (SYS_ify(name)) 				\
-	: __SYSCALL_CLOBBERS); \
+	: input, "r" (__a0)		 				\
+	: __SYSCALL_CLOBBERS); 						\
 	err = __a3;							\
-	sys_result = __v0;						\
+	_sys_result = __v0;						\
 	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	_sys_result;							\
+})
 
-#define _syscall2(type,name,atype,a,btype,b) \
-type name(atype a,btype b) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a3 asm("$7"); 				\
+#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2)	\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a3 asm("$7"); 				\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %4\t\t\t# " #name "\n\t" 				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	".set	reorder" 						\
+	".set\treorder" 						\
 	: "=r" (__v0), "=r" (__a3) 					\
-	: "r" (__a0), "r" (__a1), "i" (SYS_ify(name))			\
-	: __SYSCALL_CLOBBERS); \
+	: input, "r" (__a0), "r" (__a1)					\
+	: __SYSCALL_CLOBBERS); 						\
 	err = __a3;							\
-	sys_result = __v0;						\
+	_sys_result = __v0;						\
 	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	_sys_result;							\
+})
 
-#define _syscall3(type,name,atype,a,btype,b,ctype,c) \
-type name (atype a, btype b, ctype c) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7"); 				\
+#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7"); 				\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %5\t\t\t# " #name "\n\t" 				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	".set	reorder" 						\
+	".set\treorder" 						\
 	: "=r" (__v0), "=r" (__a3) 					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) 	\
-	: __SYSCALL_CLOBBERS); \
+	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: __SYSCALL_CLOBBERS); 						\
 	err = __a3;							\
-	sys_result = __v0;						\
+	_sys_result = __v0;						\
 	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	_sys_result;							\
+})
 
-#define _syscall4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
-type name (atype a, btype b, ctype c, dtype d) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d; 	\
+#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %5\t\t\t# " #name "\n\t" 				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	".set	reorder" 						\
+	".set\treorder" 						\
 	: "=r" (__v0), "+r" (__a3) 					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)) 	\
-	: __SYSCALL_CLOBBERS); \
+	: input, "r" (__a0), "r" (__a1), "r" (__a2)		 	\
+	: __SYSCALL_CLOBBERS); 						\
 	err = __a3;							\
-	sys_result = __v0;						\
+	_sys_result = __v0;						\
 	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	_sys_result;							\
+})
 
-#if _MIPS_SIM == _MIPS_SIM_ABI32
-#define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
-type name (atype a,btype b,ctype c,dtype d,etype e) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	const unsigned long *constE = (void*)(unsigned long) e;		\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d; 	\
-	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"lw	$2, %6\n\t" 						\
-	"subu	$29, 32\n\t" 						\
-	"sw	$2, 16($29)\n\t" 					\
-	"li	$2, %5\t\t\t# " #name "\n\t" 				\
+#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
+	register long long __a4 asm("$8") = (long long) arg5; 		\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	"addiu	$29, 32\n\t" 						\
-	".set	reorder" 						\
+	".set\treorder" 						\
 	: "=r" (__v0), "+r" (__a3) 					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
-	  "m" (constE)							\
-	: __SYSCALL_CLOBBERS); \
-	err = __a3;							\
-	sys_result = __v0;						\
-	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4)		\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
 
-#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
-type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	const unsigned long *constE = (void*)(unsigned long) e;		\
-	const unsigned long *constF = (void*)(unsigned long) f;		\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d;	\
-	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"lw	$2, %6\n\t" 						\
-	"lw	$8, %7\n\t" 						\
-	"subu	$29, 32\n\t" 						\
-	"sw	$2, 16($29)\n\t" 					\
-	"sw	$8, 20($29)\n\t" 					\
-	"li	$2, %5\t\t\t# " #name "\n\t" 				\
+#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long long __v0 asm("$2") ncs_init;			\
+	register long long __a0 asm("$4") = (long long) arg1; 		\
+	register long long __a1 asm("$5") = (long long) arg2; 		\
+	register long long __a2 asm("$6") = (long long) arg3; 		\
+	register long long __a3 asm("$7") = (long long) arg4; 		\
+	register long long __a4 asm("$8") = (long long) arg5; 		\
+	register long long __a5 asm("$9") = (long long) arg6; 		\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	"addiu	$29, 32\n\t" 						\
-	".set	reorder" 						\
+	".set\treorder" 						\
 	: "=r" (__v0), "+r" (__a3) 					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
-	  "m" (constE), "m" (constF)					\
-	: __SYSCALL_CLOBBERS); \
-	err = __a3;							\
-	sys_result = __v0;						\
-	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4),	\
+	  "r" (__a5)							\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \
+	"$14", "$15", "$24", "$25", "memory"
 
-#define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \
-type name (atype a,btype b,ctype c,dtype d,etype e,ftype f,gtype g) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	const unsigned long *constE = (void*)(unsigned long) e;		\
-	const unsigned long *constF = (void*)(unsigned long) f;		\
-	const unsigned long *constG = (void*)(unsigned long) g;		\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d;	\
-	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"lw	$2, %6\n\t" 						\
-	"lw	$8, %7\n\t" 						\
-	"lw	$9, %8\n\t" 						\
-	"subu	$29, 32\n\t" 						\
-	"sw	$2, 16($29)\n\t" 					\
-	"sw	$8, 20($29)\n\t" 					\
-	"sw	$9, 24($29)\n\t" 					\
-	"li	$2, %5\t\t\t# " #name "\n\t" 				\
+#else /* _MIPS_SIM == _ABI64 */
+
+#define internal_syscall0(ncs_init, cs_init, input, err, dummy...)	\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a3 asm("$7");					\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	"addiu	$29, 32\n\t" 						\
-	".set	reorder" 						\
-	: "=r" (__v0), "+r" (__a3) 					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "i" (SYS_ify(name)), 	\
-	  "m" (constE), "m" (constF), "m" (constG)			\
-	: __SYSCALL_CLOBBERS); \
-	err = __a3;							\
-	sys_result = __v0;						\
-	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
-#else /* N32 || N64 */
-#define _syscall5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
-type name (atype a,btype b,ctype c,dtype d,etype e) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d; 	\
-	register unsigned long __a4 asm("$8") = (unsigned long) e; 	\
+	".set reorder" 							\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: input								\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall1(ncs_init, cs_init, input, err, arg1)		\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a3 asm("$7"); 					\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %6\t\t\t# " #name "\n\t" 				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	".set	reorder" 						\
-	: "=r" (__v0), "+r" (__a3)					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "i" (SYS_ify(name)) 	\
-	: "$1", "$3", "$9", "$10", "$11", "$12", "$13",			\
-		"$14", "$15", "$24", "$25", "memory");			\
-	err = __a3;							\
-	sys_result = __v0;						\
-	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	".set reorder" 							\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: input, "r" (__a0)		 				\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
 
-#define _syscall6(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f) \
-type name (atype a,btype b,ctype c,dtype d,etype e,ftype f) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d;	\
-	register unsigned long __a4 asm("$8") = (unsigned long) e; 	\
-	register unsigned long __a5 asm("$9") = (unsigned long) f; 	\
+#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2)	\
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a3 asm("$7"); 					\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %7\t\t\t# " #name "\n\t" 				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	".set	reorder" 						\
-	: "=r" (__v0), "+r" (__a3)					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "r" (__a5), "i" (SYS_ify(name)) 	\
-	: "$1", "$3", "$10", "$11", "$12", "$13",			\
-		"$14", "$15", "$24", "$25", "memory");			\
-	err = __a3;							\
-	sys_result = __v0;						\
-	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
+	".set\treorder" 						\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: input, "r" (__a0), "r" (__a1)					\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
 
-#define _syscall7(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e,ftype,f,gtype,g) \
-type name (atype a,btype b,ctype c,dtype d,etype e,ftype f,gtype g) \
-{ 									\
-	long err;							\
-	long sys_result;						\
-	{								\
-	register unsigned long __v0 asm("$2"); 				\
-	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\
-	register unsigned long __a1 asm("$5") = (unsigned long) b; 	\
-	register unsigned long __a2 asm("$6") = (unsigned long) c; 	\
-	register unsigned long __a3 asm("$7") = (unsigned long) d;	\
-	register unsigned long __a4 asm("$8") = (unsigned long) e; 	\
-	register unsigned long __a5 asm("$9") = (unsigned long) f; 	\
-	register unsigned long __a6 asm("$10") = (unsigned long) g; 	\
+#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7"); 					\
 	__asm__ volatile ( 						\
-	".set	noreorder\n\t" 						\
-	"li	$2, %8\t\t\t# " #name "\n\t" 				\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
 	"syscall\n\t" 							\
-	".set	reorder" 						\
-	: "=r" (__v0), "+r" (__a3)					\
-	: "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), "r" (__a5), "r" (__a6), "i" (SYS_ify(name)) 	\
-	: "$1", "$3", "$11", "$12", "$13",			\
-		"$14", "$15", "$24", "$25", "memory");			\
-	err = __a3;							\
-	sys_result = __v0;						\
-	}								\
-	if (err == 0)							\
-		return (type) sys_result;				\
-	__set_errno(sys_result);					\
-	return (type)-1;						\
-}
-#endif	/* N32 || N64 */
+	".set\treorder" 						\
+	: "=r" (__v0), "=r" (__a3) 					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2)			\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2)		 	\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	register long __a4 asm("$8") = (long) arg5; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4)		\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6) \
+({ 									\
+	long _sys_result;						\
+									\
+	{								\
+	register long __v0 asm("$2") ncs_init;				\
+	register long __a0 asm("$4") = (long) arg1; 			\
+	register long __a1 asm("$5") = (long) arg2; 			\
+	register long __a2 asm("$6") = (long) arg3; 			\
+	register long __a3 asm("$7") = (long) arg4; 			\
+	register long __a4 asm("$8") = (long) arg5; 			\
+	register long __a5 asm("$9") = (long) arg6; 			\
+	__asm__ volatile ( 						\
+	".set\tnoreorder\n\t" 						\
+	cs_init								\
+	"syscall\n\t" 							\
+	".set\treorder" 						\
+	: "=r" (__v0), "+r" (__a3) 					\
+	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4),	\
+	  "r" (__a5)							\
+	: __SYSCALL_CLOBBERS); 						\
+	err = __a3;							\
+	_sys_result = __v0;						\
+	}								\
+	_sys_result;							\
+})
+
+#define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \
+	"$14", "$15", "$24", "$25", "memory"
+
+#endif
 
 #endif /* __ASSEMBLER__ */
 #endif /* _BITS_SYSCALLS_H */


More information about the uClibc mailing list