From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751484AbdITRyJ (ORCPT ); Wed, 20 Sep 2017 13:54:09 -0400 Received: from mx1.redhat.com ([209.132.183.28]:53070 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751024AbdITRyI (ORCPT ); Wed, 20 Sep 2017 13:54:08 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 59FE27D0CA Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx03.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jpoimboe@redhat.com Date: Wed, 20 Sep 2017 12:54:05 -0500 From: Josh Poimboeuf To: x86@kernel.org Cc: linux-kernel@vger.kernel.org, Ingo Molnar , Thomas Gleixner , "H. Peter Anvin" , Andy Lutomirski , Linus Torvalds , Alexander Potapenko , Dmitriy Vyukov , Matthias Kaehlcke , Arnd Bergmann , Peter Zijlstra , Andrey Ryabinin Subject: Re: [PATCH 2/2] x86/asm: Fix inline asm call constraints for clang Message-ID: <20170920175405.25oql4yxjgivydqt@treble> References: <31e96e6bcfcb47725e15a093b9c31660dfaad430.1505846562.git.jpoimboe@redhat.com> <20170920011823.wbkn4qagiovuzkow@treble> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: <20170920011823.wbkn4qagiovuzkow@treble> User-Agent: Mutt/1.6.0.1 (2016-04-01) X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.27]); Wed, 20 Sep 2017 17:54:08 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Sep 19, 2017 at 08:18:23PM -0500, Josh Poimboeuf wrote: > On Tue, Sep 19, 2017 at 01:45:28PM -0500, Josh Poimboeuf wrote: > > For inline asm statements which have a CALL instruction, we list the > > stack pointer as a constraint to convince GCC to ensure the frame > > pointer is set up first: > > > > static inline void foo() > > { > > register void *__sp asm(_ASM_SP); > > asm("call bar" : "+r" (__sp)) > > } > > > > Unfortunately, that pattern causes clang to corrupt the stack pointer. > > > > There's actually an easier way to achieve the same goal in GCC, without > > causing trouble for clang. If we declare the stack pointer register > > variable as a global variable, and remove the constraint altogether, > > that convinces GCC to always set up the frame pointer before inserting > > *any* inline asm. > > > > It basically acts as if *every* inline asm statement has a CALL > > instruction. It's a bit overkill, but the performance impact should be > > negligible. > > > > Here are the vmlinux .text size differences with the following configs > > on GCC: > > > > - defconfig > > - defconfig without frame pointers > > - Fedora distro config > > - Fedora distro config without frame pointers > > > > defconfig defconfig-nofp distro distro-nofp > > before 9796300 9466764 9076191 8789745 > > after 9796941 9462859 9076381 8785325 > > > > With frame pointers, the text size increases slightly. Without frame > > pointers, the text size decreases, and a little more significantly. > > > > Reported-by: Matthias Kaehlcke > > Signed-off-by: Josh Poimboeuf > > NAK - kbuild bot is reporting some cases where this patch doesn't force > the frame pointer setup. So it turns out that for GCC 7, it works as described above: the global register variable results in the frame pointer getting set up before *all* inline asm. But for GCC 6, it doesn't work that way. The global register variable has no such effect. So we need both the global register variable *and* the output constraint after all. Will post another patch after some more testing. -- Josh