From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1827) id 43A71393BC10; Tue, 12 May 2020 18:42:12 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 43A71393BC10 Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Tulio Magno Quites Machado Filho To: glibc-cvs@sourceware.org Subject: [glibc/ibm/2.30/master] mips: Fix argument passing for inlined syscalls on Linux [BZ #25523] X-Act-Checkin: glibc X-Git-Author: WANG Xuerui X-Git-Refname: refs/heads/ibm/2.30/master X-Git-Oldrev: 761c0e60861b0a92983d25b2141ace4e0d76fa9a X-Git-Newrev: b3be12767c66773bc476735bf048d026a7a94925 Message-Id: <20200512184212.43A71393BC10@sourceware.org> Date: Tue, 12 May 2020 18:42:12 +0000 (GMT) X-BeenThere: glibc-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Glibc-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 May 2020 18:42:12 -0000 https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=b3be12767c66773bc476735bf048d026a7a94925 commit b3be12767c66773bc476735bf048d026a7a94925 Author: WANG Xuerui Date: Thu Feb 13 00:57:03 2020 +0800 mips: Fix argument passing for inlined syscalls on Linux [BZ #25523] 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) Diff: --- NEWS | 1 + sysdeps/unix/sysv/linux/mips/mips32/sysdep.h | 30 +++++++---- sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h | 63 ++++++++++++++++-------- sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h | 63 ++++++++++++++++-------- 4 files changed, 105 insertions(+), 52 deletions(-) diff --git a/NEWS b/NEWS index 15df670edc..555d3b9a09 100644 --- 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 Version 2.30 diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h index c41678fec5..4384bf50ee 100644 --- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h @@ -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 \ diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h index b17905c3f0..e0251d5514 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h @@ -140,10 +140,11 @@ 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" \ @@ -164,11 +165,13 @@ 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" \ @@ -190,12 +193,15 @@ 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" \ @@ -217,13 +223,17 @@ 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 \ @@ -244,14 +254,19 @@ 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 \ @@ -272,15 +287,21 @@ 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 \ diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h index 5b787ec3f4..11172280c7 100644 --- a/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h @@ -136,10 +136,11 @@ 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" \ @@ -160,11 +161,13 @@ 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" \ @@ -186,12 +189,15 @@ 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" \ @@ -213,13 +219,17 @@ 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 \ @@ -240,14 +250,19 @@ 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 \ @@ -268,15 +283,21 @@ 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 \