Received: by 10.223.176.46 with SMTP id f43csp2693592wra; Mon, 22 Jan 2018 01:43:59 -0800 (PST) X-Google-Smtp-Source: AH8x225VFgz6+Q0RjulgeeUwV++vojEWCayllZfN09DXu/ThNifNsBmjPtC6TXqQF/PlAVFeLLJI X-Received: by 2002:a17:902:6943:: with SMTP id k3-v6mr3059328plt.285.1516614239597; Mon, 22 Jan 2018 01:43:59 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1516614239; cv=none; d=google.com; s=arc-20160816; b=UJOGW++1WRtOfb4q0K6MYJgC24hnPr9JIPe+aXBC3YpArJ4MFQ4JkSrQx6OnTwa+9W HehvaZe0yhUXrQjxcea+WfjdPmtKT58z0sHkPH+ps7xukouxRh0RPKDoNrRf++ph10c7 lun/n2kjvHDqGqihYCtdICqboUxoDHPKRU8FrKSsXjthels7UcYMKU5qBTbxEo/aiBVJ r+tTpP52tNtFxbOtMkKx0n8gGwb9cObYUVvgluRQkgJ5EnvCvamrybt5Sw+vL7t4pVFf dfftFbygbGXnYI9NLvFt3u9CeStaozzjc/xFRe8bwiF5FXT/OModnRIISccDXcItMGcX U/hA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:user-agent:references :in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=AZh4sb+rNCBG5ba0XnXwFxm2Cz62DZsEmiVgqCk2Yxk=; b=dS+y4L1iWOy9FbV/V+vG22BVrzs1Ytq+imvhHur4uUVHm0yJB+AMkpuQbBOq0zKM6M UwrAGEQqzIDkink7MXLqc+qDIU1rTjghu1AnPtz+vTHVnl6Cy0WQXzazVhPrcsSUR+5f nYRvQZmgFRgaQ/hAiQtYwg5vSJA+aKFzZjZiZZ/kvaFA3JDpBE/Cf2mKhceYyakXH3Pl gUOmI3oTXaiw2dR4JP4XaZzEubI5jtDeju9mqr182OaiIuCtgeuXE9QZSaOnJtwwr3uC QCsdIe5Zg0zQUoqp7z0n7KTfzTpRin6EjCk690b8spUQv+1g6T4cqCzwOPCx/HBXJQb7 ypxQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id j4-v6si22714plt.259.2018.01.22.01.43.45; Mon, 22 Jan 2018 01:43:59 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751641AbeAVImA (ORCPT + 99 others); Mon, 22 Jan 2018 03:42:00 -0500 Received: from mail.linuxfoundation.org ([140.211.169.12]:58710 "EHLO mail.linuxfoundation.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751547AbeAVIl5 (ORCPT ); Mon, 22 Jan 2018 03:41:57 -0500 Received: from localhost (LFbn-1-12258-90.w90-92.abo.wanadoo.fr [90.92.71.90]) by mail.linuxfoundation.org (Postfix) with ESMTPSA id 8B1D0F33; Mon, 22 Jan 2018 08:41:56 +0000 (UTC) From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Andrey Ryabinin , Josh Poimboeuf , Andy Lutomirski , Linus Torvalds , Peter Zijlstra , Thomas Gleixner , Ingo Molnar , David Woodhouse , Razvan Ghitulete Subject: [PATCH 4.4 05/53] x86/asm: Use register variable to get stack pointer value Date: Mon, 22 Jan 2018 09:39:57 +0100 Message-Id: <20180122083910.527513802@linuxfoundation.org> X-Mailer: git-send-email 2.16.0 In-Reply-To: <20180122083910.299610926@linuxfoundation.org> References: <20180122083910.299610926@linuxfoundation.org> User-Agent: quilt/0.65 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 4.4-stable review patch. If anyone has any objections, please let me know. ------------------ From: Andrey Ryabinin commit 196bd485ee4f03ce4c690bfcf38138abfcd0a4bc upstream. Currently we use current_stack_pointer() function to get the value of the stack pointer register. Since commit: f5caf621ee35 ("x86/asm: Fix inline asm call constraints for Clang") ... we have a stack register variable declared. It can be used instead of current_stack_pointer() function which allows to optimize away some excessive "mov %rsp, %" instructions: -mov %rsp,%rdx -sub %rdx,%rax -cmp $0x3fff,%rax -ja ffffffff810722fd +sub %rsp,%rax +cmp $0x3fff,%rax +ja ffffffff810722fa Remove current_stack_pointer(), rename __asm_call_sp to current_stack_pointer and use it instead of the removed function. Signed-off-by: Andrey Ryabinin Reviewed-by: Josh Poimboeuf Cc: Andy Lutomirski Cc: Linus Torvalds Cc: Peter Zijlstra Cc: Thomas Gleixner Link: http://lkml.kernel.org/r/20170929141537.29167-1-aryabinin@virtuozzo.com Signed-off-by: Ingo Molnar [dwmw2: We want ASM_CALL_CONSTRAINT for retpoline] Signed-off-by: David Woodhouse Signed-off-by: Razvan Ghitulete Signed-off-by: Greg Kroah-Hartman --- arch/x86/include/asm/asm.h | 11 +++++++++++ arch/x86/include/asm/thread_info.h | 11 ----------- arch/x86/kernel/irq_32.c | 6 +++--- arch/x86/kernel/traps.c | 2 +- 4 files changed, 15 insertions(+), 15 deletions(-) --- a/arch/x86/include/asm/asm.h +++ b/arch/x86/include/asm/asm.h @@ -105,4 +105,15 @@ /* For C file, we already have NOKPROBE_SYMBOL macro */ #endif +#ifndef __ASSEMBLY__ +/* + * This output constraint should be used for any inline asm which has a "call" + * instruction. Otherwise the asm may be inserted before the frame pointer + * 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 long current_stack_pointer asm(_ASM_SP); +#define ASM_CALL_CONSTRAINT "+r" (current_stack_pointer) +#endif + #endif /* _ASM_X86_ASM_H */ --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -166,17 +166,6 @@ static inline struct thread_info *curren return (struct thread_info *)(current_top_of_stack() - THREAD_SIZE); } -static inline unsigned long current_stack_pointer(void) -{ - unsigned long sp; -#ifdef CONFIG_X86_64 - asm("mov %%rsp,%0" : "=g" (sp)); -#else - asm("mov %%esp,%0" : "=g" (sp)); -#endif - return sp; -} - #else /* !__ASSEMBLY__ */ #ifdef CONFIG_X86_64 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c @@ -65,7 +65,7 @@ static void call_on_stack(void *func, vo static inline void *current_stack(void) { - return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1)); + return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1)); } static inline int execute_on_irq_stack(int overflow, struct irq_desc *desc) @@ -89,7 +89,7 @@ static inline int execute_on_irq_stack(i /* Save the next esp at the bottom of the stack */ prev_esp = (u32 *)irqstk; - *prev_esp = current_stack_pointer(); + *prev_esp = current_stack_pointer; if (unlikely(overflow)) call_on_stack(print_stack_overflow, isp); @@ -142,7 +142,7 @@ void do_softirq_own_stack(void) /* Push the previous esp onto the stack */ prev_esp = (u32 *)irqstk; - *prev_esp = current_stack_pointer(); + *prev_esp = current_stack_pointer; call_on_stack(__do_softirq, isp); } --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -166,7 +166,7 @@ void ist_begin_non_atomic(struct pt_regs * from double_fault. */ BUG_ON((unsigned long)(current_top_of_stack() - - current_stack_pointer()) >= THREAD_SIZE); + current_stack_pointer) >= THREAD_SIZE); preempt_enable_no_resched(); }