diff options
author | Mike Frysinger <vapier@gentoo.org> | 2007-02-11 09:46:43 +0000 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2007-02-11 09:46:43 +0000 |
commit | 2f754da6a16605cd2ac2d03158b15a33a606615d (patch) | |
tree | 3f0fea3a961b8777d2ac1fef7fc659bb4cb1b31f /libc/sysdeps/linux/mips | |
parent | e7bbb9c37666fc38f6f44a82013a86c48e34a336 (diff) |
Atsushi Nemoto writes:
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.
Diffstat (limited to 'libc/sysdeps/linux/mips')
-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 */ |