From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751894AbdFJHEF (ORCPT ); Sat, 10 Jun 2017 03:04:05 -0400 Received: from mail-wr0-f194.google.com ([209.85.128.194]:36166 "EHLO mail-wr0-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751797AbdFJHED (ORCPT ); Sat, 10 Jun 2017 03:04:03 -0400 Date: Sat, 10 Jun 2017 09:03:59 +0200 From: Ingo Molnar To: Matthias Kaehlcke Cc: Thomas Gleixner , Ingo Molnar , "H . Peter Anvin" , "H . J . Lu" , x86@kernel.org, linux-kernel@vger.kernel.org, Michael Davidson , Greg Hackmann , Nick Desaulniers , Stephen Hines , Kees Cook , Arnd Bergmann , Bernhard.Rosenkranzer@linaro.org, Peter Foley , Behan Webster , Douglas Anderson , Linus Torvalds , Peter Zijlstra Subject: Re: [PATCH] x86/build: Specify stack alignment for clang Message-ID: <20170610070359.7pci2anwe3pvvcea@gmail.com> References: <20170609173134.181976-1-mka@chromium.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20170609173134.181976-1-mka@chromium.org> User-Agent: NeoMutt/20170113 (1.7.2) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org * Matthias Kaehlcke wrote: > For gcc stack alignment is configured with -mpreferred-stack-boundary=N, > clang has the option -mstack-alignment=N for that purpose. Use the same > alignment as for gcc. > > If the alignment is not specified clang assumes an alignment of 16 bytes, > as required by the standard ABI. However as mentioned in d9b0cde91c60 > ("x86-64, gcc: Use -mpreferred-stack-boundary=3 if supported") the > standard kernel entry on x86-64 leaves the stack on an 8-byte > boundary, as a consequence clang will keep the stack misaligned. > > Signed-off-by: Matthias Kaehlcke > --- > arch/x86/Makefile | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/arch/x86/Makefile b/arch/x86/Makefile > index 5851411e60fb..a32badbe87ad 100644 > --- a/arch/x86/Makefile > +++ b/arch/x86/Makefile > @@ -27,7 +27,8 @@ REALMODE_CFLAGS := $(M16_CFLAGS) -g -Os -D__KERNEL__ \ > -mno-mmx -mno-sse \ > $(call cc-option, -ffreestanding) \ > $(call cc-option, -fno-stack-protector) \ > - $(call cc-option, -mpreferred-stack-boundary=2) > + $(call cc-option, -mpreferred-stack-boundary=2) \ > + $(call cc-option, -mstack-alignment=2) > export REALMODE_CFLAGS > > # BITS is used as extension for files which are available in a 32 bit > @@ -64,8 +65,9 @@ ifeq ($(CONFIG_X86_32),y) > # with nonstandard options > KBUILD_CFLAGS += -fno-pic > > - # prevent gcc from keeping the stack 16 byte aligned > + # prevent the compiler from keeping the stack 16 byte aligned > KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=2) > + KBUILD_CFLAGS += $(call cc-option,-mstack-alignment=2) > > # Disable unit-at-a-time mode on pre-gcc-4.0 compilers, it makes gcc use > # a lot more stack due to the lack of sharing of stacklots: > @@ -97,8 +99,9 @@ else > KBUILD_CFLAGS += $(call cc-option,-mno-80387) > KBUILD_CFLAGS += $(call cc-option,-mno-fp-ret-in-387) > > - # Use -mpreferred-stack-boundary=3 if supported. > + # Align the stack to 8 bytes if supported. > KBUILD_CFLAGS += $(call cc-option,-mpreferred-stack-boundary=3) > + KBUILD_CFLAGS += $(call cc-option,-mstack-alignment=3) > > # Use -mskip-rax-setup if supported. > KBUILD_CFLAGS += $(call cc-option,-mskip-rax-setup) That's really ugly and the duplicated options are repeated. A cleaner solution would be introduce a variable that stores the option, and use that later on. Also describe the variable, pointing out that -mpreferred-stack-boundary is a GCC option, while -mstack-alignment is a Clang one. BTW., GCC also has -mstack-align (note the different spelling), which does something else, so Clang's incompatibility is super confusing things... Thanks, Ingo