]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
mips: Fix argument passing for inlined syscalls on Linux [BZ #25523]
authorWANG Xuerui <git@xen0n.name>
Wed, 12 Feb 2020 16:57:03 +0000 (00:57 +0800)
committerAurelien Jarno <aurelien@aurel32.net>
Sun, 16 Feb 2020 10:44:25 +0000 (11:44 +0100)
According to [gcc documentation][1], temporary variables must be used for
the desired content to not be call-clobbered.

Fix the Linux inline syscall templates by adding temporary variables,
much like what x86 did before
(commit 381a0c26d73e0f074c962e0ab53b99a6c327066d).

Tested with gcc 9.2.0, both cross-compiled and natively on Loongson
3A4000.

[1]: https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html

(cherry picked from commit 4fbba6fe904d0094ddc4284066b3860d119cbd4a)

NEWS
sysdeps/unix/sysv/linux/mips/mips32/sysdep.h
sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h
sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h

diff --git a/NEWS b/NEWS
index 15df670edc57903fa58259e8d9e9b934055c30ea..555d3b9a09343dcbfb848167b54833eea5f39bd6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -35,6 +35,7 @@ The following bugs are resolved with this release:
   [25225] ld.so fails to link on x86 if GCC defaults to -fcf-protection
   [25232] No const correctness for strchr et al. for Clang++
   [25401] Remove incorrect alloc_size attribute from pvalloc
+  [25523] MIPS/Linux inline syscall template is miscompiled
 
 \f
 Version 2.30
index c41678fec5a5a495b1d309cd0a453c5b73547fe1..4384bf50eeffe9b595d9069cbd38288510e96fd4 100644 (file)
@@ -180,10 +180,11 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
@@ -204,11 +205,13 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
@@ -230,12 +233,15 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
@@ -257,13 +263,17 @@ union __mips_syscall_return
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
index b17905c3f0adefe3aec04d468134914c92fd923c..e0251d551471b7a5bcc93368a3879b509e767829 100644 (file)
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
        register long long int __a3 asm ("$7");                         \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
        register long long int __a3 asm ("$7");                         \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
        register long long int __a3 asm ("$7");                         \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
+       long long int _arg4 = ARGIFY (arg4);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
-       register long long int __a3 asm ("$7") = ARGIFY (arg4);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
+       register long long int __a3 asm ("$7") = _arg4;                 \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
+       long long int _arg4 = ARGIFY (arg4);                            \
+       long long int _arg5 = ARGIFY (arg5);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
-       register long long int __a3 asm ("$7") = ARGIFY (arg4);         \
-       register long long int __a4 asm ("$8") = ARGIFY (arg5);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
+       register long long int __a3 asm ("$7") = _arg4;                 \
+       register long long int __a4 asm ("$8") = _arg5;                 \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long long int _arg1 = ARGIFY (arg1);                            \
+       long long int _arg2 = ARGIFY (arg2);                            \
+       long long int _arg3 = ARGIFY (arg3);                            \
+       long long int _arg4 = ARGIFY (arg4);                            \
+       long long int _arg5 = ARGIFY (arg5);                            \
+       long long int _arg6 = ARGIFY (arg6);                            \
        register long long int __s0 asm ("$16") __attribute__ ((unused))\
          = (number);                                                   \
        register long long int __v0 asm ("$2");                         \
-       register long long int __a0 asm ("$4") = ARGIFY (arg1);         \
-       register long long int __a1 asm ("$5") = ARGIFY (arg2);         \
-       register long long int __a2 asm ("$6") = ARGIFY (arg3);         \
-       register long long int __a3 asm ("$7") = ARGIFY (arg4);         \
-       register long long int __a4 asm ("$8") = ARGIFY (arg5);         \
-       register long long int __a5 asm ("$9") = ARGIFY (arg6);         \
+       register long long int __a0 asm ("$4") = _arg1;                 \
+       register long long int __a1 asm ("$5") = _arg2;                 \
+       register long long int __a2 asm ("$6") = _arg3;                 \
+       register long long int __a3 asm ("$7") = _arg4;                 \
+       register long long int __a4 asm ("$8") = _arg5;                 \
+       register long long int __a5 asm ("$9") = _arg6;                 \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
index 5b787ec3f491f7db94f38f9ce40e956997cc0280..11172280c7699ad6b567540f7f926d81ab2019de 100644 (file)
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
        register long int __a3 asm ("$7");                              \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
+       long int _arg5 = (long int) (arg5);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
-       register long int __a4 asm ("$8") = (long int) (arg5);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
+       register long int __a4 asm ("$8") = _arg5;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \
        long int _sys_result;                                           \
                                                                        \
        {                                                               \
+       long int _arg1 = (long int) (arg1);                             \
+       long int _arg2 = (long int) (arg2);                             \
+       long int _arg3 = (long int) (arg3);                             \
+       long int _arg4 = (long int) (arg4);                             \
+       long int _arg5 = (long int) (arg5);                             \
+       long int _arg6 = (long int) (arg6);                             \
        register long int __s0 asm ("$16") __attribute__ ((unused))     \
          = (number);                                                   \
        register long int __v0 asm ("$2");                              \
-       register long int __a0 asm ("$4") = (long int) (arg1);          \
-       register long int __a1 asm ("$5") = (long int) (arg2);          \
-       register long int __a2 asm ("$6") = (long int) (arg3);          \
-       register long int __a3 asm ("$7") = (long int) (arg4);          \
-       register long int __a4 asm ("$8") = (long int) (arg5);          \
-       register long int __a5 asm ("$9") = (long int) (arg6);          \
+       register long int __a0 asm ("$4") = _arg1;                      \
+       register long int __a1 asm ("$5") = _arg2;                      \
+       register long int __a2 asm ("$6") = _arg3;                      \
+       register long int __a3 asm ("$7") = _arg4;                      \
+       register long int __a4 asm ("$8") = _arg5;                      \
+       register long int __a5 asm ("$9") = _arg6;                      \
        __asm__ volatile (                                              \
        ".set\tnoreorder\n\t"                                           \
        v0_init                                                         \