From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 34631 invoked by alias); 16 Feb 2020 14:16:06 -0000 Mailing-List: contact libc-stable-help@sourceware.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: List-Archive: Sender: libc-stable-owner@sourceware.org Received: (qmail 34620 invoked by uid 89); 16 Feb 2020 14:16:06 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.100.3 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 spammy=wang X-Spam-Status: No, score=-26.9 required=5.0 tests=BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_HELO_PASS,SPF_PASS autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on sourceware.org X-Spam-Level: X-HELO: hall.aurel32.net Received: from hall.aurel32.net (HELO hall.aurel32.net) (195.154.113.88) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 16 Feb 2020 14:16:03 +0000 Received: from [2a01:e35:2fdd:a4e1:fe91:fc89:bc43:b814] (helo=ohm.rr44.fr) by hall.aurel32.net with esmtpsa (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1j3KiG-0000Xk-B1; Sun, 16 Feb 2020 15:16:00 +0100 Received: from aurel32 by ohm.rr44.fr with local (Exim 4.93) (envelope-from ) id 1j3KiF-0024Gb-OA; Sun, 16 Feb 2020 15:15:59 +0100 From: Aurelien Jarno To: libc-stable@sourceware.org Cc: WANG Xuerui Subject: [2.30 COMMITTED 2/2] mips: Fix argument passing for inlined syscalls on Linux [BZ #25523] Date: Wed, 01 Jan 2020 00:00:00 -0000 Message-Id: <20200216141556.493004-2-aurelien@aurel32.net> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200216141556.493004-1-aurelien@aurel32.net> References: <20200216141556.493004-1-aurelien@aurel32.net> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2020-02/txt/msg00005.txt.bz2 From: WANG Xuerui 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 | 1 + sysdeps/unix/sysv/linux/mips/mips32/sysdep.h | 30 ++++++--- .../unix/sysv/linux/mips/mips64/n32/sysdep.h | 63 ++++++++++++------- .../unix/sysv/linux/mips/mips64/n64/sysdep.h | 63 ++++++++++++------- 4 files changed, 105 insertions(+), 52 deletions(-) diff --git a/NEWS b/NEWS index 15df670edc5..555d3b9a093 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 c41678fec5a..4384bf50eef 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 b17905c3f0a..e0251d55147 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 5b787ec3f49..11172280c76 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 \ -- 2.24.1