From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751618AbdITRv3 (ORCPT ); Wed, 20 Sep 2017 13:51:29 -0400 Received: from mx1.redhat.com ([209.132.183.28]:38566 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751414AbdITRv2 (ORCPT ); Wed, 20 Sep 2017 13:51:28 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mx1.redhat.com 0FE684E4F3 Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; dmarc=none (p=none dis=none) header.from=redhat.com Authentication-Results: ext-mx09.extmail.prod.ext.phx2.redhat.com; spf=fail smtp.mailfrom=jpoimboe@redhat.com Date: Wed, 20 Sep 2017 12:51:25 -0500 From: Josh Poimboeuf To: "H. Peter Anvin" Cc: x86@kernel.org, linux-kernel@vger.kernel.org, Ingo Molnar , Thomas Gleixner , 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: <20170920175125.2quikhfdy2okubsw@treble> References: <31e96e6bcfcb47725e15a093b9c31660dfaad430.1505846562.git.jpoimboe@redhat.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline In-Reply-To: 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.38]); Wed, 20 Sep 2017 17:51:28 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Wed, Sep 20, 2017 at 10:32:43AM -0700, H. Peter Anvin wrote: > On 09/19/17 11:45, 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. > > > > Again, probably negligible, but why do we need a frame pointer just > because we have a call assembly instruction? It's frame pointer convention. Without it, if dumping the stack from the called function, a function will get skipped in the stack trace. -- Josh