From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755163AbdFLQRU (ORCPT ); Mon, 12 Jun 2017 12:17:20 -0400 Received: from mail-pf0-f176.google.com ([209.85.192.176]:34128 "EHLO mail-pf0-f176.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753620AbdFLQRR (ORCPT ); Mon, 12 Jun 2017 12:17:17 -0400 Date: Mon, 12 Jun 2017 09:17:14 -0700 From: Matthias Kaehlcke To: Ingo Molnar 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: <20170612161714.GI141096@google.com> References: <20170609173134.181976-1-mka@chromium.org> <20170610070359.7pci2anwe3pvvcea@gmail.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20170610070359.7pci2anwe3pvvcea@gmail.com> User-Agent: Mutt/1.5.21 (2010-09-15) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org El Sat, Jun 10, 2017 at 09:03:59AM +0200 Ingo Molnar ha dit: > > * 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. Thanks for your comments, I will send out an updated patch shortly.