diff options
Diffstat (limited to 'libc')
| -rw-r--r-- | libc/sysdeps/linux/mips/bits/syscalls.h | 849 | 
1 files changed, 583 insertions, 266 deletions
| diff --git a/libc/sysdeps/linux/mips/bits/syscalls.h b/libc/sysdeps/linux/mips/bits/syscalls.h index bd0eb1eaf..c1c08e8d4 100644 --- a/libc/sysdeps/linux/mips/bits/syscalls.h +++ b/libc/sysdeps/linux/mips/bits/syscalls.h @@ -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;						\ +#define internal_syscall1(ncs_init, cs_init, input, err, arg1)		\ +({ 									\ +	long _sys_result;						\ +									\  	{								\ -	register unsigned long __v0 asm("$2"); 				\ -	register unsigned long __a0 asm("$4") = (unsigned long) a; 	\ -	register unsigned long __a3 asm("$7"); 				\ +	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;						\ +#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2)	\ +({ 									\ +	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"); 				\ +	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;						\ +#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \ +({ 									\ +	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"); 				\ +	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;						\ +#define internal_syscall4(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4) \ +({ 									\ +	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 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;		\ +#define internal_syscall5(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5) \ +({ 									\ +	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 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	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" 				\ +	".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); \ +	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4)		\ +	: __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 _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;		\ +#define internal_syscall6(ncs_init, cs_init, input, err, arg1, arg2, arg3, arg4, arg5, arg6) \ +({ 									\ +	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 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	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" 				\ +	".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); \ +	: input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4),	\ +	  "r" (__a5)							\ +	: __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 _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;		\ +#define __SYSCALL_CLOBBERS "$1", "$3", "$10", "$11", "$12", "$13", \ +	"$14", "$15", "$24", "$25", "memory" + +#else /* _MIPS_SIM == _ABI64 */ + +#define internal_syscall0(ncs_init, cs_init, input, err, dummy...)	\ +({ 									\ +	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 long __v0 asm("$2") ncs_init;				\ +	register long __a3 asm("$7");					\  	__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" 				\ +	".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); \ +	".set reorder" 							\ +	: "=r" (__v0), "=r" (__a3) 					\ +	: 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;						\ -} -#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;						\ +	_sys_result;							\ +}) + +#define internal_syscall1(ncs_init, cs_init, input, err, arg1)		\ +({ 									\ +	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 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");			\ +	".set reorder" 							\ +	: "=r" (__v0), "=r" (__a3) 					\ +	: 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 _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;						\ +#define internal_syscall2(ncs_init, cs_init, input, err, arg1, arg2)	\ +({ 									\ +	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 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");			\ +	".set\treorder" 						\ +	: "=r" (__v0), "=r" (__a3) 					\ +	: 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 _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;						\ +#define internal_syscall3(ncs_init, cs_init, input, err, arg1, arg2, arg3) \ +({ 									\ +	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; 	\ +	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");			\ +	".set\treorder" 						\ +	: "=r" (__v0), "=r" (__a3) 					\ +	: 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;						\ -} -#endif	/* N32 || N64 */ +	_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 */ | 
