mirror of
https://github.com/archlinuxarm/PKGBUILDs.git
synced 2024-11-08 22:45:43 +00:00
49 lines
2 KiB
Diff
49 lines
2 KiB
Diff
|
From 0ca85fc310e8c24cba10ed241a0188795e177683 Mon Sep 17 00:00:00 2001
|
||
|
From: Arnd Bergmann <arnd@arndb.de>
|
||
|
Date: Thu, 26 Jul 2018 10:13:23 +0200
|
||
|
Subject: ARM: fix put_user() for gcc-8
|
||
|
|
||
|
Building kernels before linux-4.7 with gcc-8 results in many build failures
|
||
|
when gcc triggers a check that was meant to catch broken compilers:
|
||
|
|
||
|
/tmp/ccCGMQmS.s:648: Error: .err encountered
|
||
|
|
||
|
According to the discussion in the gcc bugzilla, a local "register
|
||
|
asm()" variable is still supposed to be the correct way to force an
|
||
|
inline assembly to use a particular register, but marking it 'const'
|
||
|
lets the compiler do optimizations that break that, i.e the compiler is
|
||
|
free to treat the variable as either 'const' or 'register' in that case.
|
||
|
|
||
|
Upstream commit 9f73bd8bb445 ("ARM: uaccess: remove put_user() code
|
||
|
duplication") fixed this problem in linux-4.8 as part of a larger change,
|
||
|
but seems a little too big to be backported to 4.4.
|
||
|
|
||
|
Let's take the simplest fix and change only the one broken line in the
|
||
|
same way as newer kernels.
|
||
|
|
||
|
Suggested-by: Bernd Edlinger <bernd.edlinger@hotmail.de>
|
||
|
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=85745
|
||
|
Link: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86673
|
||
|
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
arch/arm/include/asm/uaccess.h | 2 +-
|
||
|
1 file changed, 1 insertion(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/arch/arm/include/asm/uaccess.h b/arch/arm/include/asm/uaccess.h
|
||
|
index 35c9db857ebe..cd8b589111ba 100644
|
||
|
--- a/arch/arm/include/asm/uaccess.h
|
||
|
+++ b/arch/arm/include/asm/uaccess.h
|
||
|
@@ -251,7 +251,7 @@ extern int __put_user_8(void *, unsigned long long);
|
||
|
({ \
|
||
|
unsigned long __limit = current_thread_info()->addr_limit - 1; \
|
||
|
const typeof(*(p)) __user *__tmp_p = (p); \
|
||
|
- register const typeof(*(p)) __r2 asm("r2") = (x); \
|
||
|
+ register typeof(*(p)) __r2 asm("r2") = (x); \
|
||
|
register const typeof(*(p)) __user *__p asm("r0") = __tmp_p; \
|
||
|
register unsigned long __l asm("r1") = __limit; \
|
||
|
register int __e asm("r0"); \
|
||
|
--
|
||
|
cgit 1.2-0.3.lf.el7
|
||
|
|