This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

GNU C Library master sources branch master updated. glibc-2.26-208-g319cbbf


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, master has been updated
       via  319cbbf633ae60d7b4b89fcbb11a734f4d7d22f0 (commit)
      from  01b87c656f670863ce437421b8e9278200965d38 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=319cbbf633ae60d7b4b89fcbb11a734f4d7d22f0

commit 319cbbf633ae60d7b4b89fcbb11a734f4d7d22f0
Author: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Date:   Tue Aug 29 18:31:08 2017 +0100

    MIPS/o32: Fix internal_syscall5/6/7
    
    Fix a commit cc25c8b4c119 ("New pthread rwlock that is more scalable.")
    regression and prevent uncontrolled stack space usage from happening
    when a 5-, 6- or 7-argument syscall wrapper is placed in a loop.
    
    The cause of the problem is the use of `alloca' in regular MIPS/Linux
    wrappers to force the use of the frame pointer register in any function
    using one or more of these wrappers.  Using the frame pointer register
    is required so as not to break frame unwinding as the the stack pointer
    is lowered within the inline asm used by these wrappers to make room for
    the stack arguments, which 5-, 6- and 7-argument syscalls use with the
    o32 ABI.
    
    The regular MIPS/Linux wrappers are macros however, expanded inline, and
    stack allocations made with `alloca' are not discarded until the return
    of the function they are made in.  Consequently if called in a loop,
    then virtual memory is wasted, and if the loop goes through enough
    iterations, then ultimately available memory can get exhausted causing
    the program to crash.
    
    Address the issue by replacing the inline code with standalone assembly
    functions, which rely on the compiler arranging syscall arguments
    according to the o32 function calling convention, which MIPS/Linux
    syscalls also use, except for the syscall number passed and the error
    flag returned.  This way there is no need to fiddle with the stack
    pointer anymore and all that has to be handled in the new standalone
    functions is the special handling of the syscall number and the error
    flag.
    
    Redirect 5-, 6- or 7-argument MIPS16/Linux syscall wrappers to these new
    functions as well, so as to avoid an unnecessary double call the
    existing wrappers would cause with the new arrangement.
    
    	[BZ #21956]
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile
    	[subdir = misc] (sysdep_routines): Remove `mips16-syscall5',
    	`mips16-syscall6' and `mips16-syscall7'.
    	(CFLAGS-mips16-syscall5.c, CFLAGS-mips16-syscall6.c)
    	(CFLAGS-mips16-syscall7.c): Remove.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions (libc):
    	Remove `__mips16_syscall5', `__mips16_syscall6' and
    	`__mips16_syscall7'.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
    	(__mips16_syscall0): Rename `__mips16_syscall_return' to
    	`__mips_syscall_return'.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c
    	(__mips16_syscall1): Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c
    	(__mips16_syscall2): Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c
    	(__mips16_syscall3): Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c
    	(__mips16_syscall4): Likewise.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c:
    	Remove.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c:
    	Remove.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c:
    	Remove.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h
    	(__mips16_syscall5): Expand to `__mips_syscall5' rather than
    	`__mips16_syscall5'.  Remove prototype.
    	(__mips16_syscall6): Expand to `__mips_syscall6' rather than
    	`__mips16_syscall6'.  Remove prototype.
    	(__mips16_syscall7): Expand to `__mips_syscall7' rather than
    	`__mips16_syscall7'.  Remove prototype.
    	(__nomips16, __mips16_syscall_return): Move to...
    	* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
    	(__nomips16, __mips_syscall_return): ... here.
    	[__mips16] (INTERNAL_SYSCALL_NCS): Rename
    	`__mips16_syscall_return' to `__mips_syscall_return'.
    	[__mips16] (INTERNAL_SYSCALL_MIPS16): Pass `number' to
    	`internal_syscall##nr'.
    	[!__mips16] (INTERNAL_SYSCALL): Pass `SYS_ify (name)' to
    	`internal_syscall##nr'.
    	(FORCE_FRAME_POINTER): Remove.
    	(__mips_syscall5): New prototype.
    	(internal_syscall5): Rewrite to call `__mips_syscall5'.
    	(__mips_syscall6): New prototype.
    	(internal_syscall6): Rewrite to call `__mips_syscall6'.
    	(__mips_syscall7): New prototype.
    	(internal_syscall7): Rewrite to call `__mips_syscall7'.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S: New file.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S: New file.
    	* sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S: New file.
    	* sysdeps/unix/sysv/linux/mips/mips32/Makefile [subdir = misc]
    	(sysdep_routines): Add libc-do-syscall.
    	* sysdeps/unix/sysv/linux/mips/mips32/Versions (libc): Add
    	`__mips_syscall5', `__mips_syscall6' and `__mips_syscall7'.

diff --git a/ChangeLog b/ChangeLog
index b2016ca..ce75428 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,65 @@
 2017-08-29  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
+	    Aurelien Jarno  <aurelien@aurel32.net>
+	    Maciej W. Rozycki  <macro@imgtec.com>
+
+	[BZ #21956]
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile
+	[subdir = misc] (sysdep_routines): Remove `mips16-syscall5',
+	`mips16-syscall6' and `mips16-syscall7'.
+	(CFLAGS-mips16-syscall5.c, CFLAGS-mips16-syscall6.c)
+	(CFLAGS-mips16-syscall7.c): Remove.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions (libc):
+	Remove `__mips16_syscall5', `__mips16_syscall6' and
+	`__mips16_syscall7'.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
+	(__mips16_syscall0): Rename `__mips16_syscall_return' to
+	`__mips_syscall_return'.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c
+	(__mips16_syscall1): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c
+	(__mips16_syscall2): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c
+	(__mips16_syscall3): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c
+	(__mips16_syscall4): Likewise.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c:
+	Remove.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c:
+	Remove.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c:
+	Remove.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h
+	(__mips16_syscall5): Expand to `__mips_syscall5' rather than
+	`__mips16_syscall5'.  Remove prototype.
+	(__mips16_syscall6): Expand to `__mips_syscall6' rather than
+	`__mips16_syscall6'.  Remove prototype.
+	(__mips16_syscall7): Expand to `__mips_syscall7' rather than
+	`__mips16_syscall7'.  Remove prototype.
+	(__nomips16, __mips16_syscall_return): Move to...
+	* sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+	(__nomips16, __mips_syscall_return): ... here.
+	[__mips16] (INTERNAL_SYSCALL_NCS): Rename
+	`__mips16_syscall_return' to `__mips_syscall_return'.
+	[__mips16] (INTERNAL_SYSCALL_MIPS16): Pass `number' to
+	`internal_syscall##nr'.
+	[!__mips16] (INTERNAL_SYSCALL): Pass `SYS_ify (name)' to
+	`internal_syscall##nr'.
+	(FORCE_FRAME_POINTER): Remove.
+	(__mips_syscall5): New prototype.
+	(internal_syscall5): Rewrite to call `__mips_syscall5'.
+	(__mips_syscall6): New prototype.
+	(internal_syscall6): Rewrite to call `__mips_syscall6'.
+	(__mips_syscall7): New prototype.
+	(internal_syscall7): Rewrite to call `__mips_syscall7'.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S: New file.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S: New file.
+	* sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S: New file.
+	* sysdeps/unix/sysv/linux/mips/mips32/Makefile [subdir = misc]
+	(sysdep_routines): Add libc-do-syscall.
+	* sysdeps/unix/sysv/linux/mips/mips32/Versions (libc): Add
+	`__mips_syscall5', `__mips_syscall6' and `__mips_syscall7'.
+
+2017-08-29  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
 	[BZ #21672]
 	* nptl/allocatestack.c [_STACK_GROWS_DOWN] (setup_stack_prot):
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/Makefile b/sysdeps/unix/sysv/linux/mips/mips32/Makefile
index 33b4615..aa1aa8f 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/Makefile
+++ b/sysdeps/unix/sysv/linux/mips/mips32/Makefile
@@ -3,6 +3,10 @@ ifeq ($(subdir),conform)
 conformtest-xfail-conds += mips-o32-linux
 endif
 
+ifeq ($(subdir),misc)
+sysdep_routines += mips-syscall5 mips-syscall6 mips-syscall7
+endif
+
 ifeq ($(subdir),stdlib)
 tests += bug-getcontext-mips-gp
 endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/Versions b/sysdeps/unix/sysv/linux/mips/mips32/Versions
index 9621fb5..9337f8f 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/Versions
+++ b/sysdeps/unix/sysv/linux/mips/mips32/Versions
@@ -3,4 +3,7 @@ libc {
     getrlimit64;
     setrlimit64;
   }
+  GLIBC_PRIVATE {
+    __mips_syscall5; __mips_syscall6; __mips_syscall7;
+  }
 }
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S
similarity index 62%
copy from sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
copy to sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S
index 490245b..9f33167 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S
@@ -1,5 +1,5 @@
-/* MIPS16 syscall wrappers.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+/* MIPS syscall wrappers.
+   Copyright (C) 2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -13,18 +13,23 @@
    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
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
+#include <sys/asm.h>
 
-#undef __mips16_syscall0
+	.text
+	.set	nomips16
 
-long long __nomips16
-__mips16_syscall0 (long number)
-{
-  union __mips16_syscall_return ret;
-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 0);
-  return ret.val;
-}
+/* long long __mips_syscall5 (long arg1, long arg2, long arg3, long arg4,
+			      long arg5,
+			      long number)  */
+
+ENTRY(__mips_syscall5)
+	lw	v0, 20(sp)
+	syscall
+	move	v1, a3
+	jr	ra
+END(__mips_syscall5)
+libc_hidden_def (__mips_syscall5)
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S
similarity index 61%
copy from sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
copy to sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S
index 490245b..0836660 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S
@@ -1,5 +1,5 @@
-/* MIPS16 syscall wrappers.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+/* MIPS syscall wrappers.
+   Copyright (C) 2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -13,18 +13,23 @@
    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
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
+#include <sys/asm.h>
 
-#undef __mips16_syscall0
+	.text
+	.set	nomips16
 
-long long __nomips16
-__mips16_syscall0 (long number)
-{
-  union __mips16_syscall_return ret;
-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 0);
-  return ret.val;
-}
+/* long long __mips_syscall6 (long arg1, long arg2, long arg3, long arg4,
+			      long arg5, long arg6,
+			      long number)  */
+
+ENTRY(__mips_syscall6)
+	lw	v0, 24(sp)
+	syscall
+	move	v1, a3
+	jr	ra
+END(__mips_syscall6)
+libc_hidden_def (__mips_syscall6)
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S
similarity index 61%
copy from sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
copy to sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S
index 490245b..f7e742c 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S
@@ -1,5 +1,5 @@
-/* MIPS16 syscall wrappers.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
+/* MIPS syscall wrappers.
+   Copyright (C) 2017 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -13,18 +13,23 @@
    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
+   License along with the GNU C Library.  If not, see
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
+#include <sys/asm.h>
 
-#undef __mips16_syscall0
+	.text
+	.set	nomips16
 
-long long __nomips16
-__mips16_syscall0 (long number)
-{
-  union __mips16_syscall_return ret;
-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 0);
-  return ret.val;
-}
+/* long long __mips_syscall7 (long arg1, long arg2, long arg3, long arg4,
+			      long arg5, long arg6, long arg7,
+			      long number)  */
+
+ENTRY(__mips_syscall7)
+	lw	v0, 28(sp)
+	syscall
+	move	v1, a3
+	jr	ra
+END(__mips_syscall7)
+libc_hidden_def (__mips_syscall7)
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile b/sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile
index fa9fcb7..6869bf4 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile
@@ -1,13 +1,9 @@
 ifeq ($(subdir),misc)
 sysdep_routines += mips16-syscall0 mips16-syscall1 mips16-syscall2
-sysdep_routines += mips16-syscall3 mips16-syscall4 mips16-syscall5
-sysdep_routines += mips16-syscall6 mips16-syscall7
+sysdep_routines += mips16-syscall3 mips16-syscall4
 CFLAGS-mips16-syscall0.c += -fexceptions
 CFLAGS-mips16-syscall1.c += -fexceptions
 CFLAGS-mips16-syscall2.c += -fexceptions
 CFLAGS-mips16-syscall3.c += -fexceptions
 CFLAGS-mips16-syscall4.c += -fexceptions
-CFLAGS-mips16-syscall5.c += -fexceptions
-CFLAGS-mips16-syscall6.c += -fexceptions
-CFLAGS-mips16-syscall7.c += -fexceptions
 endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions b/sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions
index 73bcfb5..bb21747 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions
@@ -1,6 +1,6 @@
 libc {
   GLIBC_PRIVATE {
     __mips16_syscall0; __mips16_syscall1; __mips16_syscall2; __mips16_syscall3;
-    __mips16_syscall4; __mips16_syscall5; __mips16_syscall6; __mips16_syscall7;
+    __mips16_syscall4;
   }
 }
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h
index 880e990..2ade219 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h
@@ -19,19 +19,6 @@
 #ifndef MIPS16_SYSCALL_H
 #define MIPS16_SYSCALL_H 1
 
-#define __nomips16 __attribute__ ((nomips16))
-
-union __mips16_syscall_return
-  {
-    long long val;
-    struct
-      {
-	long v0;
-	long v1;
-      }
-    reg;
-  };
-
 long long __nomips16 __mips16_syscall0 (long number);
 #define __mips16_syscall0(dummy, number)				\
 	__mips16_syscall0 ((long) (number))
@@ -61,29 +48,22 @@ long long __nomips16 __mips16_syscall4 (long a0, long a1, long a2, long a3,
 			   (long) (a3),					\
 			   (long) (number))
 
-long long __nomips16 __mips16_syscall5 (long a0, long a1, long a2, long a3,
-					long a4,
-					long number);
+/* The remaining ones use regular MIPS wrappers.  */
+
 #define __mips16_syscall5(a0, a1, a2, a3, a4, number)			\
-	__mips16_syscall5 ((long) (a0), (long) (a1), (long) (a2),	\
-			   (long) (a3), (long) (a4),			\
-			   (long) (number))
+	__mips_syscall5 ((long) (a0), (long) (a1), (long) (a2),		\
+			 (long) (a3), (long) (a4),			\
+			 (long) (number))
 
-long long __nomips16 __mips16_syscall6 (long a0, long a1, long a2, long a3,
-					long a4, long a5,
-					long number);
 #define __mips16_syscall6(a0, a1, a2, a3, a4, a5, number)		\
-	__mips16_syscall6 ((long) (a0), (long) (a1), (long) (a2),	\
-			   (long) (a3), (long) (a4), (long) (a5),	\
-			   (long) (number))
+	__mips_syscall6 ((long) (a0), (long) (a1), (long) (a2),		\
+			 (long) (a3), (long) (a4), (long) (a5),		\
+			 (long) (number))
 
-long long __nomips16 __mips16_syscall7 (long a0, long a1, long a2, long a3,
-					long a4, long a5, long a6,
-					long number);
 #define __mips16_syscall7(a0, a1, a2, a3, a4, a5, a6, number)		\
-	__mips16_syscall7 ((long) (a0), (long) (a1), (long) (a2),	\
-			   (long) (a3), (long) (a4), (long) (a5),	\
-			   (long) (a6),					\
-			   (long) (number))
+	__mips_syscall7 ((long) (a0), (long) (a1), (long) (a2),		\
+			 (long) (a3), (long) (a4), (long) (a5),		\
+			 (long) (a6),					\
+			 (long) (number))
 
 #endif
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
index 490245b..51d9469 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
@@ -17,14 +17,13 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
 
 #undef __mips16_syscall0
 
 long long __nomips16
 __mips16_syscall0 (long number)
 {
-  union __mips16_syscall_return ret;
+  union __mips_syscall_return ret;
   ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 0);
   return ret.val;
 }
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c
index 3061e8a..13d57a7 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c
@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
 
 #undef __mips16_syscall1
 
@@ -25,7 +24,7 @@ long long __nomips16
 __mips16_syscall1 (long a0,
 		   long number)
 {
-  union __mips16_syscall_return ret;
+  union __mips_syscall_return ret;
   ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 1,
 					a0);
   return ret.val;
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c
index 440a4ed..6e0e8d5 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c
@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
 
 #undef __mips16_syscall2
 
@@ -25,7 +24,7 @@ long long __nomips16
 __mips16_syscall2 (long a0, long a1,
 		   long number)
 {
-  union __mips16_syscall_return ret;
+  union __mips_syscall_return ret;
   ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 2,
 					a0, a1);
   return ret.val;
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c
index c3f83fc..6bd6b82 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c
@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
 
 #undef __mips16_syscall3
 
@@ -25,7 +24,7 @@ long long __nomips16
 __mips16_syscall3 (long a0, long a1, long a2,
 		   long number)
 {
-  union __mips16_syscall_return ret;
+  union __mips_syscall_return ret;
   ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 3,
 					a0, a1, a2);
   return ret.val;
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c
index 496297d..3847e4b 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c
+++ b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c
@@ -17,7 +17,6 @@
    <http://www.gnu.org/licenses/>.  */
 
 #include <sysdep.h>
-#include <mips16-syscall.h>
 
 #undef __mips16_syscall4
 
@@ -25,7 +24,7 @@ long long __nomips16
 __mips16_syscall4 (long a0, long a1, long a2, long a3,
 		   long number)
 {
-  union __mips16_syscall_return ret;
+  union __mips_syscall_return ret;
   ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 4,
 					a0, a1, a2, a3);
   return ret.val;
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c
deleted file mode 100644
index ad265d8..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* MIPS16 syscall wrappers.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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/>.  */
-
-#include <sysdep.h>
-#include <mips16-syscall.h>
-
-#undef __mips16_syscall5
-
-long long __nomips16
-__mips16_syscall5 (long a0, long a1, long a2, long a3,
-		   long a4,
-		   long number)
-{
-  union __mips16_syscall_return ret;
-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 5,
-					a0, a1, a2, a3, a4);
-  return ret.val;
-}
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c
deleted file mode 100644
index bfbd395..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* MIPS16 syscall wrappers.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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/>.  */
-
-#include <sysdep.h>
-#include <mips16-syscall.h>
-
-#undef __mips16_syscall6
-
-long long __nomips16
-__mips16_syscall6 (long a0, long a1, long a2, long a3,
-		   long a4, long a5,
-		   long number)
-{
-  union __mips16_syscall_return ret;
-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 6,
-					a0, a1, a2, a3, a4, a5);
-  return ret.val;
-}
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c b/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c
deleted file mode 100644
index e126761..0000000
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c
+++ /dev/null
@@ -1,33 +0,0 @@
-/* MIPS16 syscall wrappers.
-   Copyright (C) 2013-2017 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-
-   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/>.  */
-
-#include <sysdep.h>
-#include <mips16-syscall.h>
-
-#undef __mips16_syscall7
-
-long long __nomips16
-__mips16_syscall7 (long a0, long a1, long a2, long a3,
-		   long a4, long a5, long a6,
-		   long number)
-{
-  union __mips16_syscall_return ret;
-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 7,
-					a0, a1, a2, a3, a4, a5, a6);
-  return ret.val;
-}
diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
index e9e3ee7..dadfa18 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
@@ -98,6 +98,19 @@
 #undef INTERNAL_SYSCALL
 #undef INTERNAL_SYSCALL_NCS
 
+#define __nomips16 __attribute__ ((nomips16))
+
+union __mips_syscall_return
+  {
+    long long val;
+    struct
+      {
+	long v0;
+	long v1;
+      }
+    reg;
+  };
+
 #ifdef __mips16
 /* There's no MIPS16 syscall instruction, so we go through out-of-line
    standard MIPS wrappers.  These do use inline snippets below though,
@@ -112,7 +125,7 @@
 
 # define INTERNAL_SYSCALL_NCS(number, err, nr, args...)			\
 ({									\
-	union __mips16_syscall_return _sc_ret;				\
+	union __mips_syscall_return _sc_ret;				\
 	_sc_ret.val = __mips16_syscall##nr (args, number);		\
 	err = _sc_ret.reg.v1;						\
 	_sc_ret.reg.v0;							\
@@ -121,13 +134,13 @@
 # define INTERNAL_SYSCALL_MIPS16(number, err, nr, args...)		\
 	internal_syscall##nr ("lw\t%0, %2\n\t",				\
 			      "R" (number),				\
-			      0, err, args)
+			      number, err, args)
 
 #else /* !__mips16 */
 # define INTERNAL_SYSCALL(name, err, nr, args...)			\
 	internal_syscall##nr ("li\t%0, %2\t\t\t# " #name "\n\t",	\
 			      "IK" (SYS_ify (name)),			\
-			      0, err, args)
+			      SYS_ify (name), err, args)
 
 # define INTERNAL_SYSCALL_NCS(number, err, nr, args...)			\
 	internal_syscall##nr (MOVE32 "\t%0, %2\n\t",			\
@@ -262,110 +275,74 @@
 	_sys_result;							\
 })
 
-/* 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 4.7, this is sufficient.  */
-#define FORCE_FRAME_POINTER						\
-  void *volatile __fp_force __attribute__ ((unused)) = alloca (4)
+/* Standalone MIPS wrappers used for 5, 6, and 7 argument syscalls,
+   which require stack arguments.  We rely on the compiler arranging
+   wrapper's arguments according to the MIPS o32 function calling
+   convention, which is reused by syscalls, except for the syscall
+   number passed and the error flag returned (taken care of in the
+   wrapper called).  This relieves us from relying on non-guaranteed
+   compiler specifics required for the stack arguments to be pushed,
+   which would be the case if these syscalls were inlined.  */
+
+long long __nomips16 __mips_syscall5 (long arg1, long arg2, long arg3,
+				      long arg4, long arg5,
+				      long number);
+libc_hidden_proto (__mips_syscall5, nomips16)
 
 #define internal_syscall5(v0_init, input, number, err,			\
 			  arg1, arg2, arg3, arg4, arg5)			\
 ({									\
-	long _sys_result;						\
-									\
-	FORCE_FRAME_POINTER;						\
-	{								\
-	register long __s0 asm ("$16") __attribute__ ((unused))		\
-	  = (number);							\
-	register long __v0 asm ("$2");					\
-	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"						\
-	v0_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;							\
+	union __mips_syscall_return _sc_ret;				\
+	_sc_ret.val = __mips_syscall5 ((long) (arg1),			\
+				       (long) (arg2),			\
+				       (long) (arg3),			\
+				       (long) (arg4),			\
+				       (long) (arg5),			\
+				       (long) (number));		\
+	err = _sc_ret.reg.v1;						\
+	_sc_ret.reg.v0;							\
 })
 
+long long __nomips16 __mips_syscall6 (long arg1, long arg2, long arg3,
+				      long arg4, long arg5, long arg6,
+				      long number);
+libc_hidden_proto (__mips_syscall6, nomips16)
+
 #define internal_syscall6(v0_init, input, number, err,			\
 			  arg1, arg2, arg3, arg4, arg5, arg6)		\
 ({									\
-	long _sys_result;						\
-									\
-	FORCE_FRAME_POINTER;						\
-	{								\
-	register long __s0 asm ("$16") __attribute__ ((unused))		\
-	  = (number);							\
-	register long __v0 asm ("$2");					\
-	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"						\
-	v0_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;							\
+	union __mips_syscall_return _sc_ret;				\
+	_sc_ret.val = __mips_syscall6 ((long) (arg1),			\
+				       (long) (arg2),			\
+				       (long) (arg3),			\
+				       (long) (arg4),			\
+				       (long) (arg5),			\
+				       (long) (arg6),			\
+				       (long) (number));		\
+	err = _sc_ret.reg.v1;						\
+	_sc_ret.reg.v0;							\
 })
 
+long long __nomips16 __mips_syscall7 (long arg1, long arg2, long arg3,
+				      long arg4, long arg5, long arg6,
+				      long arg7,
+				      long number);
+libc_hidden_proto (__mips_syscall7, nomips16)
+
 #define internal_syscall7(v0_init, input, number, err,			\
 			  arg1, arg2, arg3, arg4, arg5, arg6, arg7)	\
 ({									\
-	long _sys_result;						\
-									\
-	FORCE_FRAME_POINTER;						\
-	{								\
-	register long __s0 asm ("$16") __attribute__ ((unused))		\
-	  = (number);							\
-	register long __v0 asm ("$2");					\
-	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"						\
-	v0_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;							\
+	union __mips_syscall_return _sc_ret;				\
+	_sc_ret.val = __mips_syscall7 ((long) (arg1),			\
+				       (long) (arg2),			\
+				       (long) (arg3),			\
+				       (long) (arg4),			\
+				       (long) (arg5),			\
+				       (long) (arg6),			\
+				       (long) (arg7),			\
+				       (long) (number));		\
+	err = _sc_ret.reg.v1;						\
+	_sc_ret.reg.v0;							\
 })
 
 #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", "$13", \

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   61 ++++++++
 sysdeps/unix/sysv/linux/mips/mips32/Makefile       |    4 +
 sysdeps/unix/sysv/linux/mips/mips32/Versions       |    3 +
 .../unix/sysv/linux/mips/mips32/mips-syscall5.S    |   35 ++++
 .../unix/sysv/linux/mips/mips32/mips-syscall6.S    |   35 ++++
 .../unix/sysv/linux/mips/mips32/mips-syscall7.S    |   35 ++++
 .../unix/sysv/linux/mips/mips32/mips16/Makefile    |    6 +-
 .../unix/sysv/linux/mips/mips32/mips16/Versions    |    2 +-
 .../sysv/linux/mips/mips32/mips16/mips16-syscall.h |   44 ++----
 .../linux/mips/mips32/mips16/mips16-syscall0.c     |    3 +-
 .../linux/mips/mips32/mips16/mips16-syscall1.c     |    3 +-
 .../linux/mips/mips32/mips16/mips16-syscall2.c     |    3 +-
 .../linux/mips/mips32/mips16/mips16-syscall3.c     |    3 +-
 .../linux/mips/mips32/mips16/mips16-syscall4.c     |    3 +-
 .../linux/mips/mips32/mips16/mips16-syscall5.c     |   33 ----
 .../linux/mips/mips32/mips16/mips16-syscall6.c     |   33 ----
 .../linux/mips/mips32/mips16/mips16-syscall7.c     |   33 ----
 sysdeps/unix/sysv/linux/mips/mips32/sysdep.h       |  163 +++++++++-----------
 18 files changed, 262 insertions(+), 240 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S
 create mode 100644 sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S
 create mode 100644 sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c
 delete mode 100644 sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c


hooks/post-receive
-- 
GNU C Library master sources


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]