This is an automated email from the git hooks/post-receive script.

aurel32 pushed a commit to branch glibc-2.25
in repository glibc.

commit 4bebef2cd51d7a217ed2e928cadac440672fcfc0
Author: Aurelien Jarno <aurel...@aurel32.net>
Date:   Sun Aug 20 14:39:29 2017 +0200

    debian/patches/mips/submitted-syscalls5-7-unbound-stack.diff: new patch to 
fix unbounded stack allocation in syscall 5 to 7 calls, causing 
nptl/tst-rwlock15 to fail.
---
 debian/changelog                                   |   3 +
 .../mips/submitted-syscalls5-7-unbound-stack.diff  | 936 +++++++++++++++++++++
 debian/patches/series                              |   1 +
 3 files changed, 940 insertions(+)

diff --git a/debian/changelog b/debian/changelog
index 2401290..36e3c12 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -44,6 +44,9 @@ glibc (2.25-0experimental1) UNRELEASED; urgency=medium
     handle the multiarch transition.
   * debian/debhelper.in/libc.[preinst,postinst}: remove code not needed
     since jessie.
+  * debian/patches/mips/submitted-syscalls5-7-unbound-stack.diff: new
+    patch to fix unbounded stack allocation in O32 syscalls with 5 to 7
+    arguments, causing nptl/tst-rwlock15 to fail on mips and mipsel.
 
   [ John David Anglin ]
   * debian/patches/any/submitted-resolv-unaligned.diff: new patch to fix
diff --git a/debian/patches/mips/submitted-syscalls5-7-unbound-stack.diff 
b/debian/patches/mips/submitted-syscalls5-7-unbound-stack.diff
new file mode 100644
index 0000000..379fdef
--- /dev/null
+++ b/debian/patches/mips/submitted-syscalls5-7-unbound-stack.diff
@@ -0,0 +1,936 @@
++2017-08-18  Adhemerval Zanella  <adhemerval.zane...@linaro.org>
++          Aurelien Jarno <aurel...@aurel32.net>
++
++      [BZ #21956]
++      * sysdeps/unix/sysv/linux/mips/mips32/Makefile [subdir = crypt]
++      (libcrypt-sysdep_routines): Add libc-do-syscall.
++      [subdir = elf] (sysdep-dl-routines): Likewise.
++      [subdir = io] (sysdep_routines): Likewise.
++      [subdir = nptl] (libpthread-sysdep_routines): Likewise.
++      [subdir = nptl] (libpthread-shared-only-routines): Likewise.
++      [subdir = nscd] (nscd-modules): Likewise.
++      [subdir = nss] (libnss_db-sysdep_routines): Likewise.
++      [subdir = nss] (libnss_db-shared-only-routines): Likewise.
++      [subdir = resolv] (libanl-sysdep_routines): Likewise.
++      [subdir = resolv] (libanl-shared-only-routines): Likewise.
++      [subdir = rt] (librt-sysdep_routines): Likewise.
++      [subdir = rt] (librt-shared-only-routines): Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/libc-do-syscall.S: New file.
++      * sysdeps/unix/sysv/linux/mips/mips32/sysdep.h: [!__mips16]
++      (INTERNAL_SYSCALL): Make code unconditional.
++      [!__mips16] (INTERNAL_SYSCALL_NCS): Likewise.
++      [__mips16] (INTERNAL_SYSCALL): Remove.
++      [__mips16] (INTERNAL_SYSCALL_NCS): Likewise.
++      (__nomips16): Define.
++      (__libc_do_syscall_return): Likewise.
++      [__mips16] (__libc_do_syscall0): Declare.
++      [__mips16] (internal_syscall0): Define.
++      [__mips16] (__libc_do_syscall1): Declare.
++      [__mips16] (internal_syscall1): Define.
++      [__mips16] (__libc_do_syscall2): Declare.
++      [__mips16] (internal_syscall2): Define.
++      [__mips16] (__libc_do_syscall3): Declare.
++      [__mips16] (internal_syscall3): Define.
++      [__mips16] (__libc_do_syscall4): Declare.
++      [__mips16] (internal_syscall4): Define.
++      (internal_syscall0): Guard with !__mips16.
++      (internal_syscall1): Guard with !__mips16.
++      (internal_syscall2): Guard with !__mips16.
++      (internal_syscall3): Guard with !__mips16.
++      (internal_syscall4): Guard with !__mips16.
++      (FORCE_FRAME_POINTER): Remove.
++      (internal_syscall5): Rewrite to call __libc_do_syscall5.
++      (internal_syscall6): Rewrite to call __libc_do_syscall6.
++      (internal_syscall7): Rewrite to call __libc_do_syscall7.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile: Remove file.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions: Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c:
++        Likewise
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c:
++        Likewise.
++      * sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c:
++        Likewise.
++
+--- a/sysdeps/unix/sysv/linux/mips/mips32/Makefile
++++ b/sysdeps/unix/sysv/linux/mips/mips32/Makefile
+@@ -0,0 +1,35 @@
++ifeq ($(subdir),crypt)
++libcrypt-sysdep_routines += libc-do-syscall
++endif
++
++ifeq ($(subdir),elf)
++sysdep-dl-routines += libc-do-syscall
++endif
++
++ifeq ($(subdir),io)
++sysdep_routines += libc-do-syscall
++endif
++
++ifeq ($(subdir),nptl)
++libpthread-sysdep_routines += libc-do-syscall
++libpthread-shared-only-routines += libc-do-syscall
++endif
++
++ifeq ($(subdir),nscd)
++nscd-modules += libc-do-syscall
++endif
++
++ifeq ($(subdir),nss)
++libnss_db-sysdep_routines += libc-do-syscall
++libnss_db-shared-only-routines += libc-do-syscall
++endif
++
++ifeq ($(subdir),resolv)
++libanl-sysdep_routines += libc-do-syscall
++libanl-shared-only-routines += libc-do-syscall
++endif
++
++ifeq ($(subdir),rt)
++librt-sysdep_routines += libc-do-syscall
++librt-shared-only-routines += libc-do-syscall
++endif
+--- /dev/null
++++ b/sysdeps/unix/sysv/linux/mips/mips32/libc-do-syscall.S
+@@ -0,0 +1,105 @@
++/* 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
++   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 <sys/asm.h>
++
++      .text
++      .set    nomips16
++
++#ifdef __mips16
++
++/* long long __libc_do_syscall0 (long arg1, long number)  */
++      .hidden __libc_do_syscall0
++ENTRY(__libc_do_syscall0)
++        move    v0, a0
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall0)
++
++
++/* long long __libc_do_syscall1 (long arg1, long number)  */
++      .hidden __libc_do_syscall1
++ENTRY(__libc_do_syscall1)
++        move    v0, a1
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall1)
++
++/* long long __libc_do_syscall2 (long arg1, long arg2, long number)  */
++      .hidden __libc_do_syscall2
++ENTRY(__libc_do_syscall2)
++        move    v0, a2
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall2)
++
++/* long long __libc_do_syscall3 (long arg1, long arg2, long arg3,
++                               long number)  */
++      .hidden __libc_do_syscall3
++ENTRY(__libc_do_syscall3)
++        move    v0, a3
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall3)
++
++/* long long __libc_do_syscall4 (long arg1, long arg2, long arg3, long arg4,
++                               long number)  */
++      .hidden __libc_do_syscall4
++ENTRY(__libc_do_syscall4)
++        lw      v0, 16(sp)
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall4)
++
++#endif /* !__mips16 */
++
++/* long long __libc_do_syscall5 (long arg1, long arg2, long arg3, long arg4,
++                               long arg5, long number)  */
++      .hidden __libc_do_syscall5
++ENTRY(__libc_do_syscall5)
++        lw      v0, 20(sp)
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall5)
++
++/* long long __libc_do_syscall6 (long arg1, long arg2, long arg3, long arg4,
++                               long arg5, long arg6, long number)  */
++      .hidden __libc_do_syscall6
++ENTRY(__libc_do_syscall6)
++        lw      v0, 24(sp)
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall6)
++
++/* long long __libc_do_syscall7 (long arg1, long arg2, long arg3, long arg4,
++                               long arg5, long arg6, long arg7,
++                               long number)  */
++      .hidden __libc_do_syscall7
++ENTRY(__libc_do_syscall7)
++        lw      v0, 28(sp)
++        syscall
++        move    v1, a3
++        jr      ra
++END(__libc_do_syscall7)
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile
++++ /dev/null
+@@ -1,13 +0,0 @@
+-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
+-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
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions
++++ /dev/null
+@@ -1,6 +0,0 @@
+-libc {
+-  GLIBC_PRIVATE {
+-    __mips16_syscall0; __mips16_syscall1; __mips16_syscall2; 
__mips16_syscall3;
+-    __mips16_syscall4; __mips16_syscall5; __mips16_syscall6; 
__mips16_syscall7;
+-  }
+-}
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h
++++ /dev/null
+@@ -1,89 +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/>.  */
+-
+-#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))
+-
+-long long __nomips16 __mips16_syscall1 (long a0,
+-                                      long number);
+-#define __mips16_syscall1(a0, number)                                 \
+-      __mips16_syscall1 ((long) (a0),                                 \
+-                         (long) (number))
+-
+-long long __nomips16 __mips16_syscall2 (long a0, long a1,
+-                                      long number);
+-#define __mips16_syscall2(a0, a1, number)                             \
+-      __mips16_syscall2 ((long) (a0), (long) (a1),                    \
+-                         (long) (number))
+-
+-long long __nomips16 __mips16_syscall3 (long a0, long a1, long a2,
+-                                      long number);
+-#define __mips16_syscall3(a0, a1, a2, number)                         \
+-      __mips16_syscall3 ((long) (a0), (long) (a1), (long) (a2),       \
+-                         (long) (number))
+-
+-long long __nomips16 __mips16_syscall4 (long a0, long a1, long a2, long a3,
+-                                      long number);
+-#define __mips16_syscall4(a0, a1, a2, a3, number)                     \
+-      __mips16_syscall4 ((long) (a0), (long) (a1), (long) (a2),       \
+-                         (long) (a3),                                 \
+-                         (long) (number))
+-
+-long long __nomips16 __mips16_syscall5 (long a0, long a1, long a2, long a3,
+-                                      long a4,
+-                                      long number);
+-#define __mips16_syscall5(a0, a1, a2, a3, a4, number)                 \
+-      __mips16_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))
+-
+-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))
+-
+-#endif
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c
++++ /dev/null
+@@ -1,30 +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_syscall0
+-
+-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;
+-}
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c
++++ /dev/null
+@@ -1,32 +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_syscall1
+-
+-long long __nomips16
+-__mips16_syscall1 (long a0,
+-                 long number)
+-{
+-  union __mips16_syscall_return ret;
+-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 1,
+-                                      a0);
+-  return ret.val;
+-}
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c
++++ /dev/null
+@@ -1,32 +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_syscall2
+-
+-long long __nomips16
+-__mips16_syscall2 (long a0, long a1,
+-                 long number)
+-{
+-  union __mips16_syscall_return ret;
+-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 2,
+-                                      a0, a1);
+-  return ret.val;
+-}
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c
++++ /dev/null
+@@ -1,32 +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_syscall3
+-
+-long long __nomips16
+-__mips16_syscall3 (long a0, long a1, long a2,
+-                 long number)
+-{
+-  union __mips16_syscall_return ret;
+-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 3,
+-                                      a0, a1, a2);
+-  return ret.val;
+-}
+--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c
++++ /dev/null
+@@ -1,32 +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_syscall4
+-
+-long long __nomips16
+-__mips16_syscall4 (long a0, long a1, long a2, long a3,
+-                 long number)
+-{
+-  union __mips16_syscall_return ret;
+-  ret.reg.v0 = INTERNAL_SYSCALL_MIPS16 (number, ret.reg.v1, 4,
+-                                      a0, a1, a2, a3);
+-  return ret.val;
+-}
+--- 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;
+-}
+--- 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;
+-}
+--- 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;
+-}
+--- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
++++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
+@@ -98,45 +98,100 @@
+ #undef INTERNAL_SYSCALL
+ #undef INTERNAL_SYSCALL_NCS
+ 
++#define INTERNAL_SYSCALL(name, err, nr, args...)                      \
++      internal_syscall##nr ("li\t%0, %2\t\t\t# " #name "\n\t",        \
++                            "IK" (SYS_ify (name)),                    \
++                            SYS_ify(name), err, args)
++
++#define INTERNAL_SYSCALL_NCS(number, err, nr, args...)                        
\
++      internal_syscall##nr (MOVE32 "\t%0, %2\n\t",                    \
++                            "r" (__s0),                               \
++                            number, err, args)
++
++#define __nomips16 __attribute__ ((nomips16))
++
++union __libc_do_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,
+-   through INTERNAL_SYSCALL_MIPS16.  Spilling the syscall number to
+-   memory gives the best code in that case, avoiding the need to save
+-   and restore a static register.  */
++/* There's no MIPS16 syscall instruction, so we always need to go through
++   out-of-line standard MIPS wrappers.  */
++
++long long __nomips16 __libc_do_syscall0 (long number);
+ 
+-# include <mips16-syscall.h>
++# define internal_syscall0(v0_init, input, number, err, dummy)                
\
++({                                                                    \
++      union __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall0 (number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
++})
+ 
+-# define INTERNAL_SYSCALL(name, err, nr, args...)                     \
+-      INTERNAL_SYSCALL_NCS (SYS_ify (name), err, nr, args)
++long long __nomips16 __libc_do_syscall1 (long arg1, long number);
+ 
+-# define INTERNAL_SYSCALL_NCS(number, err, nr, args...)                       
\
++# define internal_syscall1(v0_init, input, number, err, arg1)         \
+ ({                                                                    \
+-      union __mips16_syscall_return _sc_ret;                          \
+-      _sc_ret.val = __mips16_syscall##nr (args, number);              \
+-      err = _sc_ret.reg.v1;                                           \
+-      _sc_ret.reg.v0;                                                 \
++      union __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall1 ((long) (arg1),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
+ })
+ 
+-# define INTERNAL_SYSCALL_MIPS16(number, err, nr, args...)            \
+-      internal_syscall##nr ("lw\t%0, %2\n\t",                         \
+-                            "R" (number),                             \
+-                            0, err, args)
++long long __nomips16 __libc_do_syscall2 (long arg1, long arg2, long number);
+ 
+-#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)
++# define internal_syscall2(v0_init, input, number, err, arg1, arg2)   \
++({                                                                    \
++      union __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall2 ((long) (arg1),            \
++                                            (long) (arg2),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
++})
+ 
+-# define INTERNAL_SYSCALL_NCS(number, err, nr, args...)                       
\
+-      internal_syscall##nr (MOVE32 "\t%0, %2\n\t",                    \
+-                            "r" (__s0),                               \
+-                            number, err, args)
++long long __nomips16 __libc_do_syscall3 (long arg1, long arg2, long arg3,
++                                       long number);
+ 
+-#endif /* !__mips16 */
++# define internal_syscall3(v0_init, input, number, err,                       
\
++                         arg1, arg2, arg3)                            \
++({                                                                    \
++      union __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall3 ((long) (arg1),            \
++                                            (long) (arg2),            \
++                                            (long) (arg3),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
++})
++
++long long __nomips16 __libc_do_syscall4 (long arg1, long arg2, long arg3,
++                                       long arg4, long number);
+ 
+-#define internal_syscall0(v0_init, input, number, err, dummy...)      \
++# define internal_syscall4(v0_init, input, number, err,                       
\
++                         arg1, arg2, arg3, arg4)                      \
++({                                                                    \
++      union __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall4 ((long) (arg1),            \
++                                            (long) (arg2),            \
++                                            (long) (arg3),            \
++                                            (long) (arg4),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
++})
++
++#else /* !__mips16 */
++
++# define internal_syscall0(v0_init, input, number, err, dummy...)     \
+ ({                                                                    \
+       long _sys_result;                                               \
+                                                                       \
+@@ -159,7 +214,7 @@
+       _sys_result;                                                    \
+ })
+ 
+-#define internal_syscall1(v0_init, input, number, err, arg1)          \
++# define internal_syscall1(v0_init, input, number, err, arg1)         \
+ ({                                                                    \
+       long _sys_result;                                               \
+                                                                       \
+@@ -183,7 +238,7 @@
+       _sys_result;                                                    \
+ })
+ 
+-#define internal_syscall2(v0_init, input, number, err, arg1, arg2)    \
++# define internal_syscall2(v0_init, input, number, err, arg1, arg2)   \
+ ({                                                                    \
+       long _sys_result;                                               \
+                                                                       \
+@@ -208,8 +263,8 @@
+       _sys_result;                                                    \
+ })
+ 
+-#define internal_syscall3(v0_init, input, number, err,                        
\
+-                        arg1, arg2, arg3)                             \
++# define internal_syscall3(v0_init, input, number, err,                       
\
++                         arg1, arg2, arg3)                            \
+ ({                                                                    \
+       long _sys_result;                                               \
+                                                                       \
+@@ -235,8 +290,8 @@
+       _sys_result;                                                    \
+ })
+ 
+-#define internal_syscall4(v0_init, input, number, err,                        
\
+-                        arg1, arg2, arg3, arg4)                       \
++# define internal_syscall4(v0_init, input, number, err,                       
\
++                         arg1, arg2, arg3, arg4)                      \
+ ({                                                                    \
+       long _sys_result;                                               \
+                                                                       \
+@@ -262,110 +317,65 @@
+       _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)
++#endif /* !__mips16 */
++
++/* Out-of-line standard MIPS wrappers used for 5, 6, and 7 argument syscall
++   which requires arguments in stack.  */
++
++long long __nomips16 __libc_do_syscall5 (long arg1, long arg2, long arg3,
++                                       long arg4, long arg5, long number);
+ 
+ #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 __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall5 ((long) (arg1),            \
++                                            (long) (arg2),            \
++                                            (long) (arg3),            \
++                                            (long) (arg4),            \
++                                            (long) (arg5),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
+ })
+ 
++long long __nomips16 __libc_do_syscall6 (long arg1, long arg2, long arg3,
++                                       long arg4, long arg5, long arg6,
++                                       long number);
++
+ #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 __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall6 ((long) (arg1),            \
++                                            (long) (arg2),            \
++                                            (long) (arg3),            \
++                                            (long) (arg4),            \
++                                            (long) (arg5),            \
++                                            (long) (arg6),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
+ })
+ 
++long long __nomips16 __libc_do_syscall7 (long arg1, long arg2, long arg3,
++                                       long arg4, long arg5, long arg6,
++                                       long arg7, long number);
++
+ #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 __libc_do_syscall_return _sys_result;                     \
++      _sys_result.val = __libc_do_syscall7 ((long) (arg1),            \
++                                            (long) (arg2),            \
++                                            (long) (arg3),            \
++                                            (long) (arg4),            \
++                                            (long) (arg5),            \
++                                            (long) (arg6),            \
++                                            (long) (arg7),            \
++                                            number);                  \
++      err = _sys_result.reg.v1;                                       \
++      _sys_result.reg.v0;                                             \
+ })
+ 
+ #define __SYSCALL_CLOBBERS "$1", "$3", "$8", "$9", "$10", "$11", "$12", 
"$13", \
diff --git a/debian/patches/series b/debian/patches/series
index 245cf73..6a1ea0b 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -153,6 +153,7 @@ m68k/local-reloc.diff
 m68k/submitted-gcc34-seccomment.diff
 
 mips/submitted-rld_map.diff
+mips/submitted-syscalls5-7-unbound-stack.diff
 
 powerpc/local-powerpc8xx-dcbz.diff
 powerpc/submitted-tst-tlsopt-powerpc.diff

-- 
Alioth's /usr/local/bin/git-commit-notice on 
/srv/git.debian.org/git/pkg-glibc/glibc.git

Reply via email to