46 lines
2.0 KiB
Diff
46 lines
2.0 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: [PATCH] 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"); \
|