From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-co1nam03on0096.outbound.protection.outlook.com ([104.47.40.96]:45338 "EHLO NAM03-CO1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1032216AbeCAP3r (ORCPT ); Thu, 1 Mar 2018 10:29:47 -0500 From: Sasha Levin To: "stable@vger.kernel.org" , "stable-commits@vger.kernel.org" CC: Andrey Ryabinin , Ingo Molnar , Sasha Levin Subject: [added to the 4.1 stable tree] x86/asm: Use register variable to get stack pointer value Date: Thu, 1 Mar 2018 15:24:16 +0000 Message-ID: <20180301152116.1486-174-alexander.levin@microsoft.com> References: <20180301152116.1486-1-alexander.levin@microsoft.com> In-Reply-To: <20180301152116.1486-1-alexander.levin@microsoft.com> Content-Language: en-US Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: stable-owner@vger.kernel.org List-ID: From: Andrey Ryabinin This patch has been added to the 4.1 stable tree. If you have any objections, please let us know. =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D [ Upstream commit 196bd485ee4f03ce4c690bfcf38138abfcd0a4bc ] 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_point= er 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.c= om Signed-off-by: Ingo Molnar Signed-off-by: Sasha Levin --- 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(-) diff --git a/arch/x86/include/asm/asm.h b/arch/x86/include/asm/asm.h index e2015452177d..37496d271033 100644 --- a/arch/x86/include/asm/asm.h +++ b/arch/x86/include/asm/asm.h @@ -88,4 +88,15 @@ /* For C file, we already have NOKPROBE_SYMBOL macro */ #endif =20 +#ifndef __ASSEMBLY__ +/* + * This output constraint should be used for any inline asm which has a "c= all" + * instruction. Otherwise the asm may be inserted before the frame pointe= r + * gets set up by the containing function. If you forget to do this, objt= ool + * 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 */ diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thre= ad_info.h index b4bdec3e9523..b58daa40eae9 100644 --- a/arch/x86/include/asm/thread_info.h +++ b/arch/x86/include/asm/thread_info.h @@ -184,17 +184,6 @@ static inline struct thread_info *current_thread_info(= void) return (struct thread_info *)(current_top_of_stack() - THREAD_SIZE); } =20 -static inline unsigned long current_stack_pointer(void) -{ - unsigned long sp; -#ifdef CONFIG_X86_64 - asm("mov %%rsp,%0" : "=3Dg" (sp)); -#else - asm("mov %%esp,%0" : "=3Dg" (sp)); -#endif - return sp; -} - #else /* !__ASSEMBLY__ */ =20 /* Load thread_info address into "reg" */ diff --git a/arch/x86/kernel/irq_32.c b/arch/x86/kernel/irq_32.c index f9fd86a7fcc7..9f4ffc122d9e 100644 --- a/arch/x86/kernel/irq_32.c +++ b/arch/x86/kernel/irq_32.c @@ -71,7 +71,7 @@ static void call_on_stack(void *func, void *stack) =20 static inline void *current_stack(void) { - return (void *)(current_stack_pointer() & ~(THREAD_SIZE - 1)); + return (void *)(current_stack_pointer & ~(THREAD_SIZE - 1)); } =20 static inline int @@ -96,7 +96,7 @@ execute_on_irq_stack(int overflow, struct irq_desc *desc,= int irq) =20 /* Save the next esp at the bottom of the stack */ prev_esp =3D (u32 *)irqstk; - *prev_esp =3D current_stack_pointer(); + *prev_esp =3D current_stack_pointer; =20 if (unlikely(overflow)) call_on_stack(print_stack_overflow, isp); @@ -149,7 +149,7 @@ void do_softirq_own_stack(void) =20 /* Push the previous esp onto the stack */ prev_esp =3D (u32 *)irqstk; - *prev_esp =3D current_stack_pointer(); + *prev_esp =3D current_stack_pointer; =20 call_on_stack(__do_softirq, isp); } diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c index 020248f2cec4..e78c6783a2de 100644 --- a/arch/x86/kernel/traps.c +++ b/arch/x86/kernel/traps.c @@ -175,7 +175,7 @@ void ist_begin_non_atomic(struct pt_regs *regs) * from double_fault. */ BUG_ON((unsigned long)(current_top_of_stack() - - current_stack_pointer()) >=3D THREAD_SIZE); + current_stack_pointer) >=3D THREAD_SIZE); =20 preempt_count_sub(HARDIRQ_OFFSET); } --=20 2.14.1