aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog61
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/Makefile4
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/Versions3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S (renamed from sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.c)32
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S (renamed from sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.c)32
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S (renamed from sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.c)32
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/Makefile6
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/Versions2
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall.h44
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall0.c3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall1.c3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall2.c3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall3.c3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall4.c3
-rw-r--r--sysdeps/unix/sysv/linux/mips/mips32/sysdep.h163
15 files changed, 208 insertions, 186 deletions
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-syscall5.c b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall5.S
index ad265d8..9f33167 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall5.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,21 +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_syscall5
+ .text
+ .set nomips16
-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;
-}
+/* 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-syscall6.c b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall6.S
index bfbd395..0836660 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall6.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,21 +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_syscall6
+ .text
+ .set nomips16
-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;
-}
+/* 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-syscall7.c b/sysdeps/unix/sysv/linux/mips/mips32/mips-syscall7.S
index e126761..f7e742c 100644
--- a/sysdeps/unix/sysv/linux/mips/mips32/mips16/mips16-syscall7.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,21 +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_syscall7
+ .text
+ .set nomips16
-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;
-}
+/* 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/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", \