From: tip-bot for Josh Poimboeuf <tipbot@zytor.com> To: linux-tip-commits@vger.kernel.org Cc: peterz@infradead.org, luto@kernel.org, mingo@kernel.org, mka@chromium.org, tglx@linutronix.de, hpa@zytor.com, arnd@arndb.de, miguel.bernal.marin@linux.intel.com, dvyukov@google.com, glider@google.com, jpoimboe@redhat.com, linux-kernel@vger.kernel.org, aryabinin@virtuozzo.com, lkp@01.org, torvalds@linux-foundation.org, xiaolong.ye@intel.com Subject: [tip:x86/urgent] x86/asm: Fix inline asm call constraints for GCC 4.4 Date: Fri, 29 Sep 2017 04:18:49 -0700 [thread overview] Message-ID: <tip-520a13c530aeb5f63e011d668c42db1af19ed349@git.kernel.org> (raw) In-Reply-To: <20170928215826.6sdpmwtkiydiytim@treble> Commit-ID: 520a13c530aeb5f63e011d668c42db1af19ed349 Gitweb: https://git.kernel.org/tip/520a13c530aeb5f63e011d668c42db1af19ed349 Author: Josh Poimboeuf <jpoimboe@redhat.com> AuthorDate: Thu, 28 Sep 2017 16:58:26 -0500 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Fri, 29 Sep 2017 13:15:44 +0200 x86/asm: Fix inline asm call constraints for GCC 4.4 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> --- arch/x86/include/asm/asm.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index c1eadba..30c3c9a 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 @@ -139,7 +141,7 @@ * gets set up by the containing function. If you forget to do this, objtool * may print a "call without frame pointer save/setup" warning. */ -register unsigned int __asm_call_sp asm("esp"); +register unsigned long __asm_call_sp asm(_ASM_SP); #define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp) #endif
WARNING: multiple messages have this Message-ID (diff)
From: tip-bot for Josh Poimboeuf <tipbot@zytor.com> To: lkp@lists.01.org Subject: [tip:x86/urgent] x86/asm: Fix inline asm call constraints for GCC 4.4 Date: Fri, 29 Sep 2017 04:18:49 -0700 [thread overview] Message-ID: <tip-520a13c530aeb5f63e011d668c42db1af19ed349@git.kernel.org> (raw) In-Reply-To: <20170928215826.6sdpmwtkiydiytim@treble> [-- Attachment #1: Type: text/plain, Size: 3905 bytes --] Commit-ID: 520a13c530aeb5f63e011d668c42db1af19ed349 Gitweb: https://git.kernel.org/tip/520a13c530aeb5f63e011d668c42db1af19ed349 Author: Josh Poimboeuf <jpoimboe@redhat.com> AuthorDate: Thu, 28 Sep 2017 16:58:26 -0500 Committer: Ingo Molnar <mingo@kernel.org> CommitDate: Fri, 29 Sep 2017 13:15:44 +0200 x86/asm: Fix inline asm call constraints for GCC 4.4 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(a)treble Signed-off-by: Ingo Molnar <mingo@kernel.org> --- arch/x86/include/asm/asm.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index c1eadba..30c3c9a 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 @@ -139,7 +141,7 @@ * gets set up by the containing function. If you forget to do this, objtool * may print a "call without frame pointer save/setup" warning. */ -register unsigned int __asm_call_sp asm("esp"); +register unsigned long __asm_call_sp asm(_ASM_SP); #define ASM_CALL_CONSTRAINT "+r" (__asm_call_sp) #endif
next prev parent reply other threads:[~2017-09-29 11:25 UTC|newest] Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top 2017-09-28 7:47 [lkp-robot] [x86/asm] f5caf621ee: PANIC:double_fault kernel test robot 2017-09-28 7:47 ` kernel test robot 2017-09-28 7:59 ` Ingo Molnar 2017-09-28 7:59 ` Ingo Molnar 2017-09-28 8:18 ` Peter Zijlstra 2017-09-28 8:18 ` Peter Zijlstra 2017-09-28 8:49 ` Ingo Molnar 2017-09-28 8:49 ` Ingo Molnar 2017-09-28 11:49 ` Peter Zijlstra 2017-09-28 11:49 ` Peter Zijlstra 2017-09-28 16:21 ` Linus Torvalds 2017-09-28 16:21 ` Linus Torvalds 2017-09-28 16:44 ` Josh Poimboeuf 2017-09-28 16:44 ` Josh Poimboeuf 2017-09-28 17:01 ` Josh Poimboeuf 2017-09-28 17:01 ` Josh Poimboeuf 2017-09-28 19:10 ` Josh Poimboeuf 2017-09-28 19:10 ` Josh Poimboeuf 2017-09-28 21:58 ` [PATCH] x86/asm: Fix inline asm call constraints for GCC 4.4 Josh Poimboeuf 2017-09-28 21:58 ` Josh Poimboeuf 2017-09-28 23:53 ` Linus Torvalds 2017-09-28 23:53 ` Linus Torvalds 2017-09-29 1:40 ` Josh Poimboeuf 2017-09-29 1:40 ` Josh Poimboeuf 2017-09-29 8:01 ` Ingo Molnar 2017-09-29 8:01 ` Ingo Molnar 2017-09-29 10:32 ` Ye Xiaolong 2017-09-29 10:32 ` Ye Xiaolong 2017-09-29 7:51 ` Ingo Molnar 2017-09-29 7:51 ` Ingo Molnar 2017-09-29 15:29 ` Arnd Bergmann 2017-09-29 15:29 ` Arnd Bergmann 2017-09-29 9:27 ` [tip:x86/urgent] " tip-bot for Josh Poimboeuf 2017-09-29 9:27 ` tip-bot for Josh Poimboeuf 2017-09-29 11:18 ` tip-bot for Josh Poimboeuf [this message] 2017-09-29 11:18 ` tip-bot for Josh Poimboeuf
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=tip-520a13c530aeb5f63e011d668c42db1af19ed349@git.kernel.org \ --to=tipbot@zytor.com \ --cc=arnd@arndb.de \ --cc=aryabinin@virtuozzo.com \ --cc=dvyukov@google.com \ --cc=glider@google.com \ --cc=hpa@zytor.com \ --cc=jpoimboe@redhat.com \ --cc=linux-kernel@vger.kernel.org \ --cc=linux-tip-commits@vger.kernel.org \ --cc=lkp@01.org \ --cc=luto@kernel.org \ --cc=miguel.bernal.marin@linux.intel.com \ --cc=mingo@kernel.org \ --cc=mka@chromium.org \ --cc=peterz@infradead.org \ --cc=tglx@linutronix.de \ --cc=torvalds@linux-foundation.org \ --cc=xiaolong.ye@intel.com \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.