diff options
Diffstat (limited to 'common/recipes-kernel/linux/linux-yocto-4.9.21/0004-x86-asm-Fix-inline-asm-call-constraints-for-GCC-4.4.patch')
-rw-r--r-- | common/recipes-kernel/linux/linux-yocto-4.9.21/0004-x86-asm-Fix-inline-asm-call-constraints-for-GCC-4.4.patch | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/linux-yocto-4.9.21/0004-x86-asm-Fix-inline-asm-call-constraints-for-GCC-4.4.patch b/common/recipes-kernel/linux/linux-yocto-4.9.21/0004-x86-asm-Fix-inline-asm-call-constraints-for-GCC-4.4.patch new file mode 100644 index 00000000..990cb048 --- /dev/null +++ b/common/recipes-kernel/linux/linux-yocto-4.9.21/0004-x86-asm-Fix-inline-asm-call-constraints-for-GCC-4.4.patch @@ -0,0 +1,87 @@ +From 06424642a3712e54821ac22bba000779c0004faa Mon Sep 17 00:00:00 2001 +From: Josh Poimboeuf <jpoimboe@redhat.com> +Date: Thu, 28 Sep 2017 16:58:26 -0500 +Subject: [PATCH 04/42] x86/asm: Fix inline asm call constraints for GCC 4.4 + +commit 520a13c530aeb5f63e011d668c42db1af19ed349 upstream. + +The kernel test bot (run by Xiaolong Ye) reported that the following commit: + + f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang") + +is causing double faults in a kernel compiled with GCC 4.4. + +Linus subsequently diagnosed the crash pattern and the buggy commit and found that +the issue is with this code: + + register unsigned int __asm_call_sp asm("esp"); + #define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp) + +Even on a 64-bit kernel, it's using ESP instead of RSP. That causes GCC +to produce the following bogus code: + + ffffffff8147461d: 89 e0 mov %esp,%eax + ffffffff8147461f: 4c 89 f7 mov %r14,%rdi + ffffffff81474622: 4c 89 fe mov %r15,%rsi + ffffffff81474625: ba 20 00 00 00 mov $0x20,%edx + ffffffff8147462a: 89 c4 mov %eax,%esp + ffffffff8147462c: e8 bf 52 05 00 callq ffffffff814c98f0 <copy_user_generic_unrolled> + +Despite the absurdity of it backing up and restoring the stack pointer +for no reason, the bug is actually the fact that it's only backing up +and restoring the lower 32 bits of the stack pointer. The upper 32 bits +are getting cleared out, corrupting the stack pointer. + +So change the '__asm_call_sp' register variable to be associated with +the actual full-size stack pointer. + +This also requires changing the __ASM_SEL() macro to be based on the +actual compiled arch size, rather than the CONFIG value, because +CONFIG_X86_64 compiles some files with '-m32' (e.g., realmode and vdso). +Otherwise Clang fails to build the kernel because it complains about the +use of a 64-bit register (RSP) in a 32-bit file. + +Reported-and-Bisected-and-Tested-by: kernel test robot <xiaolong.ye@intel.com> +Diagnosed-by: Linus Torvalds <torvalds@linux-foundation.org> +Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> +Cc: Alexander Potapenko <glider@google.com> +Cc: Andrey Ryabinin <aryabinin@virtuozzo.com> +Cc: Andy Lutomirski <luto@kernel.org> +Cc: Arnd Bergmann <arnd@arndb.de> +Cc: Dmitriy Vyukov <dvyukov@google.com> +Cc: LKP <lkp@01.org> +Cc: Linus Torvalds <torvalds@linux-foundation.org> +Cc: Matthias Kaehlcke <mka@chromium.org> +Cc: Miguel Bernal Marin <miguel.bernal.marin@linux.intel.com> +Cc: Peter Zijlstra <peterz@infradead.org> +Cc: Thomas Gleixner <tglx@linutronix.de> +Fixes: f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang") +Link: http://lkml.kernel.org/r/20170928215826.6sdpmwtkiydiytim@treble +Signed-off-by: Ingo Molnar <mingo@kernel.org> +Cc: Matthias Kaehlcke <mka@chromium.org> +Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> +--- + arch/x86/include/asm/asm.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h +index 0052352..7bb29a4 100644 +--- a/arch/x86/include/asm/asm.h ++++ b/arch/x86/include/asm/asm.h +@@ -11,10 +11,12 @@ + # define __ASM_FORM_COMMA(x) " " #x "," + #endif + +-#ifdef CONFIG_X86_32 ++#ifndef __x86_64__ ++/* 32 bit */ + # define __ASM_SEL(a,b) __ASM_FORM(a) + # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(a) + #else ++/* 64 bit */ + # define __ASM_SEL(a,b) __ASM_FORM(b) + # define __ASM_SEL_RAW(a,b) __ASM_FORM_RAW(b) + #endif +-- +2.7.4 + |