@@ -60,18 +60,7 @@
GIT repository as commit 96187fb0bc30cd7919759d371d810e928048249d, that
first appeared in the 2.6.36 release. Since then the kernel has had
code that reloads $v0 upon syscall restart and resumes right at the
- SYSCALL instruction, so no special arrangement is needed anymore.
-
- For backwards compatibility with existing kernel binaries we support
- the old convention by choosing the instruction preceding SYSCALL
- carefully. This also means we have to force a 32-bit encoding of the
- microMIPS MOVE instruction if one is used. */
-
-#ifdef __mips_micromips
-# define MOVE32 "move32"
-#else
-# define MOVE32 "move"
-#endif
+ SYSCALL instruction, so no special arrangement is needed anymore. */
#undef INTERNAL_SYSCALL
#undef INTERNAL_SYSCALL_NCS
@@ -109,97 +98,75 @@ union __mips_syscall_return
})
# define INTERNAL_SYSCALL_MIPS16(number, err, nr, args...) \
- internal_syscall##nr ("lw\t%0, %2\n\t", \
- "R" (number), \
- number, err, args)
+ internal_syscall##nr (number, err, args)
#else /* !__mips16 */
# define INTERNAL_SYSCALL(name, nr, args...) \
- internal_syscall##nr ("li\t%0, %2\t\t\t# " #name "\n\t", \
- "IK" (SYS_ify (name)), \
- SYS_ify (name), err, args)
+ internal_syscall##nr (SYS_ify (name), err, args)
# define INTERNAL_SYSCALL_NCS(number, nr, args...) \
- internal_syscall##nr (MOVE32 "\t%0, %2\n\t", \
- "r" (__s0), \
- number, err, args)
+ internal_syscall##nr (number, err, args)
#endif /* !__mips16 */
-#define internal_syscall0(v0_init, input, number, err, dummy...) \
+#define internal_syscall0(number, err, dummy...) \
({ \
long int _sys_result; \
\
{ \
- register long int __s0 asm ("$16") __attribute__ ((unused)) \
- = (number); \
- register long int __v0 asm ("$2"); \
+ register long int __v0 asm ("$2") = number; \
register long int __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set reorder" \
: "=r" (__v0), "=r" (__a3) \
- : input \
+ : "r" (__v0) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall1(v0_init, input, number, err, arg1) \
+#define internal_syscall1(number, err, arg1) \
({ \
long int _sys_result; \
\
{ \
long int _arg1 = (long int) (arg1); \
- register long int __s0 asm ("$16") __attribute__ ((unused)) \
- = (number); \
- register long int __v0 asm ("$2"); \
+ register long int __v0 asm ("$2") = number; \
register long int __a0 asm ("$4") = _arg1; \
register long int __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set reorder" \
: "=r" (__v0), "=r" (__a3) \
- : input, "r" (__a0) \
+ : "r" (__v0), "r" (__a0) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall2(v0_init, input, number, err, arg1, arg2) \
+#define internal_syscall2(number, err, arg1, arg2) \
({ \
long int _sys_result; \
\
{ \
long int _arg1 = (long int) (arg1); \
long int _arg2 = (long int) (arg2); \
- register long int __s0 asm ("$16") __attribute__ ((unused)) \
- = (number); \
- register long int __v0 asm ("$2"); \
+ register long int __v0 asm ("$2") = number; \
register long int __a0 asm ("$4") = _arg1; \
register long int __a1 asm ("$5") = _arg2; \
register long int __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "=r" (__a3) \
- : input, "r" (__a0), "r" (__a1) \
+ : "r" (__v0), "r" (__a0), "r" (__a1) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall3(v0_init, input, number, err, \
- arg1, arg2, arg3) \
+#define internal_syscall3(number, err, arg1, arg2, arg3) \
({ \
long int _sys_result; \
\
@@ -207,28 +174,22 @@ union __mips_syscall_return
long int _arg1 = (long int) (arg1); \
long int _arg2 = (long int) (arg2); \
long int _arg3 = (long int) (arg3); \
- register long int __s0 asm ("$16") __attribute__ ((unused)) \
- = (number); \
- register long int __v0 asm ("$2"); \
+ register long int __v0 asm ("$2") = number; \
register long int __a0 asm ("$4") = _arg1; \
register long int __a1 asm ("$5") = _arg2; \
register long int __a2 asm ("$6") = _arg3; \
register long int __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "=r" (__a3) \
- : input, "r" (__a0), "r" (__a1), "r" (__a2) \
+ : "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall4(v0_init, input, number, err, \
- arg1, arg2, arg3, arg4) \
+#define internal_syscall4(number, err, arg1, arg2, arg3, arg4) \
({ \
long int _sys_result; \
\
@@ -237,20 +198,15 @@ union __mips_syscall_return
long int _arg2 = (long int) (arg2); \
long int _arg3 = (long int) (arg3); \
long int _arg4 = (long int) (arg4); \
- register long int __s0 asm ("$16") __attribute__ ((unused)) \
- = (number); \
- register long int __v0 asm ("$2"); \
+ register long int __v0 asm ("$2") = number; \
register long int __a0 asm ("$4") = _arg1; \
register long int __a1 asm ("$5") = _arg2; \
register long int __a2 asm ("$6") = _arg3; \
register long int __a3 asm ("$7") = _arg4; \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "+r" (__a3) \
- : input, "r" (__a0), "r" (__a1), "r" (__a2) \
+ : "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
@@ -272,8 +228,7 @@ long long int __nomips16 __mips_syscall5 (long int arg1, long int arg2,
long int number);
libc_hidden_proto (__mips_syscall5, nomips16)
-#define internal_syscall5(v0_init, input, number, err, \
- arg1, arg2, arg3, arg4, arg5) \
+#define internal_syscall5(number, err, arg1, arg2, arg3, arg4, arg5) \
({ \
union __mips_syscall_return _sc_ret; \
_sc_ret.val = __mips_syscall5 ((long int) (arg1), \
@@ -291,7 +246,7 @@ long long int __nomips16 __mips_syscall6 (long int arg1, long int arg2,
long int number);
libc_hidden_proto (__mips_syscall6, nomips16)
-#define internal_syscall6(v0_init, input, number, err, \
+#define internal_syscall6(number, err, \
arg1, arg2, arg3, arg4, arg5, arg6) \
({ \
union __mips_syscall_return _sc_ret; \
@@ -312,7 +267,7 @@ long long int __nomips16 __mips_syscall7 (long int arg1, long int arg2,
long int number);
libc_hidden_proto (__mips_syscall7, nomips16)
-#define internal_syscall7(v0_init, input, number, err, \
+#define internal_syscall7(number, err, \
arg1, arg2, arg3, arg4, arg5, arg6, arg7) \
({ \
union __mips_syscall_return _sc_ret; \
@@ -27,14 +27,9 @@
.text
NESTED (syscall, SZREG, ra)
- .mask 0x00010000, -SZREG
+ .mask 0x00000000, 0
.fmask 0x00000000, 0
- PTR_ADDIU sp, -SZREG
- cfi_adjust_cfa_offset (SZREG)
- REG_S s0, (sp)
- cfi_rel_offset (s0, 0)
-
- move s0, a0
+ move v0, a0
move a0, a1 /* shift arg1 - arg7. */
move a1, a2
move a2, a3
@@ -43,13 +38,8 @@ NESTED (syscall, SZREG, ra)
move a5, a6
move a6, a7
- move v0, s0 /* Syscall number -> v0 */
syscall /* Do the system call. */
- REG_L s0, (sp)
- cfi_restore (s0)
- PTR_ADDIU sp, SZREG
- cfi_adjust_cfa_offset (-SZREG)
bne a3, zero, L(error)
ret
@@ -68,104 +68,74 @@ typedef long int __syscall_arg_t;
GIT repository as commit 96187fb0bc30cd7919759d371d810e928048249d, that
first appeared in the 2.6.36 release. Since then the kernel has had
code that reloads $v0 upon syscall restart and resumes right at the
- SYSCALL instruction, so no special arrangement is needed anymore.
-
- For backwards compatibility with existing kernel binaries we support
- the old convention by choosing the instruction preceding SYSCALL
- carefully. This also means we have to force a 32-bit encoding of the
- microMIPS MOVE instruction if one is used. */
-
-#ifdef __mips_micromips
-# define MOVE32 "move32"
-#else
-# define MOVE32 "move"
-#endif
+ SYSCALL instruction, so no special arrangement is needed anymore. */
#undef INTERNAL_SYSCALL
-#define INTERNAL_SYSCALL(name, nr, args...) \
- internal_syscall##nr ("li\t%0, %2\t\t\t# " #name "\n\t", \
- "IK" (SYS_ify (name)), \
- 0, args)
+#define INTERNAL_SYSCALL(name, nr, args...) \
+ internal_syscall##nr ((SYS_ify (name)), args)
#undef INTERNAL_SYSCALL_NCS
#define INTERNAL_SYSCALL_NCS(number, nr, args...) \
- internal_syscall##nr (MOVE32 "\t%0, %2\n\t", \
- "r" (__s0), \
- number, args)
+ internal_syscall##nr (number, args)
-#define internal_syscall0(v0_init, input, number, dummy...) \
+#define internal_syscall0(number, dummy...) \
({ \
long int _sys_result; \
\
{ \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set reorder" \
: "=r" (__v0), "=r" (__a3) \
- : input \
+ : "r" (__v0) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall1(v0_init, input, number, arg1) \
+#define internal_syscall1(number, arg1) \
({ \
long int _sys_result; \
\
{ \
__syscall_arg_t _arg1 = ARGIFY (arg1); \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a0 asm ("$4") = _arg1; \
register __syscall_arg_t __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set reorder" \
: "=r" (__v0), "=r" (__a3) \
- : input, "r" (__a0) \
+ : "r" (__v0), "r" (__a0) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall2(v0_init, input, number, arg1, arg2) \
+#define internal_syscall2(number, arg1, arg2) \
({ \
long int _sys_result; \
\
{ \
__syscall_arg_t _arg1 = ARGIFY (arg1); \
__syscall_arg_t _arg2 = ARGIFY (arg2); \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a0 asm ("$4") = _arg1; \
register __syscall_arg_t __a1 asm ("$5") = _arg2; \
register __syscall_arg_t __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "=r" (__a3) \
- : input, "r" (__a0), "r" (__a1) \
+ : "r" (__v0), "r" (__a0), "r" (__a1) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall3(v0_init, input, number, arg1, arg2, arg3) \
+#define internal_syscall3(number, arg1, arg2, arg3) \
({ \
long int _sys_result; \
\
@@ -173,28 +143,22 @@ typedef long int __syscall_arg_t;
__syscall_arg_t _arg1 = ARGIFY (arg1); \
__syscall_arg_t _arg2 = ARGIFY (arg2); \
__syscall_arg_t _arg3 = ARGIFY (arg3); \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a0 asm ("$4") = _arg1; \
register __syscall_arg_t __a1 asm ("$5") = _arg2; \
register __syscall_arg_t __a2 asm ("$6") = _arg3; \
register __syscall_arg_t __a3 asm ("$7"); \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "=r" (__a3) \
- : input, "r" (__a0), "r" (__a1), "r" (__a2) \
+ : "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall4(v0_init, input, number, arg1, arg2, arg3, \
- arg4) \
+#define internal_syscall4(number, arg1, arg2, arg3, arg4) \
({ \
long int _sys_result; \
\
@@ -203,28 +167,22 @@ typedef long int __syscall_arg_t;
__syscall_arg_t _arg2 = ARGIFY (arg2); \
__syscall_arg_t _arg3 = ARGIFY (arg3); \
__syscall_arg_t _arg4 = ARGIFY (arg4); \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a0 asm ("$4") = _arg1; \
register __syscall_arg_t __a1 asm ("$5") = _arg2; \
register __syscall_arg_t __a2 asm ("$6") = _arg3; \
register __syscall_arg_t __a3 asm ("$7") = _arg4; \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "+r" (__a3) \
- : input, "r" (__a0), "r" (__a1), "r" (__a2) \
+ : "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall5(v0_init, input, number, arg1, arg2, arg3, \
- arg4, arg5) \
+#define internal_syscall5(number, arg1, arg2, arg3, arg4, arg5) \
({ \
long int _sys_result; \
\
@@ -234,29 +192,23 @@ typedef long int __syscall_arg_t;
__syscall_arg_t _arg3 = ARGIFY (arg3); \
__syscall_arg_t _arg4 = ARGIFY (arg4); \
__syscall_arg_t _arg5 = ARGIFY (arg5); \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a0 asm ("$4") = _arg1; \
register __syscall_arg_t __a1 asm ("$5") = _arg2; \
register __syscall_arg_t __a2 asm ("$6") = _arg3; \
register __syscall_arg_t __a3 asm ("$7") = _arg4; \
register __syscall_arg_t __a4 asm ("$8") = _arg5; \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "+r" (__a3) \
- : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4) \
+ : "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \
} \
_sys_result; \
})
-#define internal_syscall6(v0_init, input, number, arg1, arg2, arg3, \
- arg4, arg5, arg6) \
+#define internal_syscall6(number, arg1, arg2, arg3, arg4, arg5, arg6) \
({ \
long int _sys_result; \
\
@@ -267,9 +219,7 @@ typedef long int __syscall_arg_t;
__syscall_arg_t _arg4 = ARGIFY (arg4); \
__syscall_arg_t _arg5 = ARGIFY (arg5); \
__syscall_arg_t _arg6 = ARGIFY (arg6); \
- register __syscall_arg_t __s0 asm ("$16") __attribute__ ((unused))\
- = (number); \
- register __syscall_arg_t __v0 asm ("$2"); \
+ register __syscall_arg_t __v0 asm ("$2") = number; \
register __syscall_arg_t __a0 asm ("$4") = _arg1; \
register __syscall_arg_t __a1 asm ("$5") = _arg2; \
register __syscall_arg_t __a2 asm ("$6") = _arg3; \
@@ -277,12 +227,9 @@ typedef long int __syscall_arg_t;
register __syscall_arg_t __a4 asm ("$8") = _arg5; \
register __syscall_arg_t __a5 asm ("$9") = _arg6; \
__asm__ volatile ( \
- ".set\tnoreorder\n\t" \
- v0_init \
"syscall\n\t" \
- ".set\treorder" \
: "=r" (__v0), "+r" (__a3) \
- : input, "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), \
+ : "r" (__v0), "r" (__a0), "r" (__a1), "r" (__a2), "r" (__a4), \
"r" (__a5) \
: __SYSCALL_CLOBBERS); \
_sys_result = __a3 != 0 ? -__v0 : __v0; \