unofficial mirror of libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [Patch V4] mips: add hp-timing support and minor fix
@ 2020-12-29 11:47 Huang Pei
  2020-12-29 11:47 ` [PATCH V4 1/2] mips: add hp-timing support for MIPS R2 Huang Pei
  2020-12-29 11:47 ` [PATCH V4 2/2] mips: remove old syscall restart convention Huang Pei
  0 siblings, 2 replies; 3+ messages in thread
From: Huang Pei @ 2020-12-29 11:47 UTC (permalink / raw
  To: Joseph Myers; +Cc: Huacai Chen, Chenghua Xu, libc-alpha

Patch V4 1/2 : adjust commit message 

Patch V4 2/2 : remove all of old syscall restart sequence 
following Maciej's advice



^ permalink raw reply	[flat|nested] 3+ messages in thread

* [PATCH V4 1/2] mips: add hp-timing support for MIPS R2
  2020-12-29 11:47 [Patch V4] mips: add hp-timing support and minor fix Huang Pei
@ 2020-12-29 11:47 ` Huang Pei
  2020-12-29 11:47 ` [PATCH V4 2/2] mips: remove old syscall restart convention Huang Pei
  1 sibling, 0 replies; 3+ messages in thread
From: Huang Pei @ 2020-12-29 11:47 UTC (permalink / raw
  To: Joseph Myers; +Cc: Huacai Chen, Chenghua Xu, libc-alpha

MIPS R2 only support 32 bit TSC(AKA "rdhwr %0, $2"), but it should be
enough for rtld.

Linux/MIPS kernel added emulation for 'rdhwr %0, $2',uncondionally.
Userspace CAN NOT tell directly whether 'rdhwr' is not implemented, or
disabled (by clear bit[2] of CP0 Hwena). If you had any doubt on the
precision of 'rdhwr %0, $2', DO check both your hardware and software
environment(such as in a para-virtualized guest).
---
 sysdeps/mips/hp-timing.h | 44 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 44 insertions(+)
 create mode 100644 sysdeps/mips/hp-timing.h

diff --git a/sysdeps/mips/hp-timing.h b/sysdeps/mips/hp-timing.h
new file mode 100644
index 0000000000..43cb695f2f
--- /dev/null
+++ b/sysdeps/mips/hp-timing.h
@@ -0,0 +1,44 @@
+/* High precision, low overhead timing functions. MIPS version.
+   Copyright (C) 2020 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+   Contributed by Huang Pei <huangpei@loongson.cn>, 2020.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <http://www.gnu.org/licenses/>.  */
+
+#ifndef _HP_TIMING_MIPS_H
+#define _HP_TIMING_MIPS_H	1
+
+#if IS_IN(rtld) && __mips_isa_rev >= 2
+/* MIPS R2 always have the timestamp register. but it's got only 8 seconds
+ * range, assuming half of cpu frequence 800Mhz . Use it for ld.so
+ * profiling only*/
+#define HP_TIMING_INLINE	(1)
+
+/* We use 32bit values for the times.  */
+typedef unsigned int hp_timing_t;
+
+/* Read the cp0 count, this maybe inaccurate.  */
+#define HP_TIMING_NOW(Var) \
+  ({ unsigned int _count; \
+     asm volatile ("rdhwr\t%0,$2" : "=r" (_count)); \
+     (Var) = _count; })
+
+# include <hp-timing-common.h>
+
+#else
+# include <sysdeps/generic/hp-timing.h>
+#endif /* IS_IN(rtld) && __mips_isa_rev >= 2 */
+
+#endif /* hp-timing.h */
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* [PATCH V4 2/2] mips: remove old syscall restart convention
  2020-12-29 11:47 [Patch V4] mips: add hp-timing support and minor fix Huang Pei
  2020-12-29 11:47 ` [PATCH V4 1/2] mips: add hp-timing support for MIPS R2 Huang Pei
@ 2020-12-29 11:47 ` Huang Pei
  1 sibling, 0 replies; 3+ messages in thread
From: Huang Pei @ 2020-12-29 11:47 UTC (permalink / raw
  To: Joseph Myers; +Cc: Huacai Chen, Chenghua Xu, libc-alpha

Before Linux/MIPS 2.6.36, kernel expected setting syscall number(aka
"li v0, #sys_number") right precedes "syscall", so the kernel syscall
restart sequence can use CP0 EPC - 4 to restart the syscall, because
kernel DID NOT save v0 during syscall handling. Linux 2.6.36 canceled
this restriction.

See sysdeps/unix/sysv/linux/mips/{mips32,mips64}/sysdep.h

Since glibc-2.24 the minimum kernel version is 3.2(much higer than
2.6.36), I think it is OK to remove the ugly register spill in
syscall.S just because of the old convention

This also remove the unaligned stack pointer.

For consistency, it also remove all other old syscall restart sequence.
---
 sysdeps/unix/sysv/linux/mips/mips32/sysdep.h  |  89 ++++-----------
 sysdeps/unix/sysv/linux/mips/mips64/syscall.S |  14 +--
 sysdeps/unix/sysv/linux/mips/mips64/sysdep.h  | 103 +++++-------------
 3 files changed, 49 insertions(+), 157 deletions(-)

diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
index 49856c3249..601bd9abc7 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
@@ -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;				\
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/syscall.S b/sysdeps/unix/sysv/linux/mips/mips64/syscall.S
index a9baff3c17..089524a40b 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/syscall.S
+++ b/sysdeps/unix/sysv/linux/mips/mips64/syscall.S
@@ -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
diff --git a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
index 73816816d5..ae38b56f1a 100644
--- a/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips64/sysdep.h
@@ -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;				\
-- 
2.17.1


^ permalink raw reply related	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2020-12-29 11:48 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-12-29 11:47 [Patch V4] mips: add hp-timing support and minor fix Huang Pei
2020-12-29 11:47 ` [PATCH V4 1/2] mips: add hp-timing support for MIPS R2 Huang Pei
2020-12-29 11:47 ` [PATCH V4 2/2] mips: remove old syscall restart convention Huang Pei

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).