mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: tip-bot for Dominik Brodowski <tipbot@zytor.com>
To: linux-tip-commits@vger.kernel.org
Cc: luto@kernel.org, hpa@zytor.com, peterz@infradead.org,
	dwmw2@infradead.org, linux@dominikbrodowski.net,
	tglx@linutronix.de, brgerst@gmail.com,
	torvalds@linux-foundation.org, linux-kernel@vger.kernel.org,
	bp@alien8.de, jpoimboe@redhat.com, mingo@kernel.org,
	dvlasenk@redhat.com
Subject: [tip:x86/pti] x86/entry/64: Move ENTER_IRQ_STACK from interrupt macro to interrupt_entry
Date: Wed, 21 Feb 2018 08:59:13 -0800	[thread overview]
Message-ID: <tip-2ba6474104a1132c4af9f6dc42c6bfe3ca71f8c7@git.kernel.org> (raw)
In-Reply-To: <20180220210113.6725-3-linux@dominikbrodowski.net>

Commit-ID:  2ba6474104a1132c4af9f6dc42c6bfe3ca71f8c7
Gitweb:     https://git.kernel.org/tip/2ba6474104a1132c4af9f6dc42c6bfe3ca71f8c7
Author:     Dominik Brodowski <linux@dominikbrodowski.net>
AuthorDate: Tue, 20 Feb 2018 22:01:09 +0100
Committer:  Ingo Molnar <mingo@kernel.org>
CommitDate: Wed, 21 Feb 2018 16:54:03 +0100

x86/entry/64: Move ENTER_IRQ_STACK from interrupt macro to interrupt_entry

Moving the switch to IRQ stack from the interrupt macro to the helper
function requires some trickery: All ENTER_IRQ_STACK really cares about
is where the "original" stack -- meaning the GP registers etc. -- is
stored. Therefore, we need to offset the stored RSP value by 8 whenever
ENTER_IRQ_STACK is called from within a function. In such cases, and
after switching to the IRQ stack, we need to push the "original" return
address (i.e. the return address from the call to the interrupt entry
function) to the IRQ stack.

This trickery allows us to carve another .85k from the text size (it
would be more except for the additional unwind hints):

   text	   data	    bss	    dec	    hex	filename
  18006	      0	      0	  18006	   4656	entry_64.o-orig
  17158	      0	      0	  17158	   4306	entry_64.o

Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
Acked-by: Thomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: David Woodhouse <dwmw2@infradead.org>
Cc: Denys Vlasenko <dvlasenk@redhat.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: dan.j.williams@intel.com
Link: http://lkml.kernel.org/r/20180220210113.6725-3-linux@dominikbrodowski.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
---
 arch/x86/entry/entry_64.S | 56 ++++++++++++++++++++++++++++++++---------------
 1 file changed, 38 insertions(+), 18 deletions(-)

diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index b0ae0c3..7a6ae19 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -448,9 +448,19 @@ END(irq_entries_start)
  *
  * The invariant is that, if irq_count != -1, then the IRQ stack is in use.
  */
-.macro ENTER_IRQ_STACK regs=1 old_rsp
+.macro ENTER_IRQ_STACK regs=1 old_rsp save_ret=0
 	DEBUG_ENTRY_ASSERT_IRQS_OFF
+
+	.if \save_ret
+	/*
+	 * If save_ret is set, the original stack contains one additional
+	 * entry -- the return address. Therefore, move the address one
+	 * entry below %rsp to \old_rsp.
+	 */
+	leaq	8(%rsp), \old_rsp
+	.else
 	movq	%rsp, \old_rsp
+	.endif
 
 	.if \regs
 	UNWIND_HINT_REGS base=\old_rsp
@@ -496,6 +506,15 @@ END(irq_entries_start)
 	.if \regs
 	UNWIND_HINT_REGS indirect=1
 	.endif
+
+	.if \save_ret
+	/*
+	 * Push the return address to the stack. This return address can
+	 * be found at the "real" original RSP, which was offset by 8 at
+	 * the beginning of this macro.
+	 */
+	pushq	-8(\old_rsp)
+	.endif
 .endm
 
 /*
@@ -531,22 +550,7 @@ ENTRY(interrupt_entry)
 	PUSH_AND_CLEAR_REGS save_ret=1
 	ENCODE_FRAME_POINTER 8
 
-	ret
-END(interrupt_entry)
-
-/* 0(%rsp): ~(interrupt number) */
-	.macro interrupt func
-	cld
-
-	testb	$3, CS-ORIG_RAX(%rsp)
-	jz	1f
-	SWAPGS
-	call	switch_to_thread_stack
-1:
-
-	call	interrupt_entry
-
-	testb	$3, CS(%rsp)
+	testb	$3, CS+8(%rsp)
 	jz	1f
 
 	/*
@@ -564,10 +568,26 @@ END(interrupt_entry)
 	CALL_enter_from_user_mode
 
 1:
-	ENTER_IRQ_STACK old_rsp=%rdi
+	ENTER_IRQ_STACK old_rsp=%rdi save_ret=1
 	/* We entered an interrupt context - irqs are off: */
 	TRACE_IRQS_OFF
 
+	ret
+END(interrupt_entry)
+
+/* 0(%rsp): ~(interrupt number) */
+	.macro interrupt func
+	cld
+
+	testb	$3, CS-ORIG_RAX(%rsp)
+	jz	1f
+	SWAPGS
+	call	switch_to_thread_stack
+1:
+
+	call	interrupt_entry
+
+	UNWIND_HINT_REGS indirect=1
 	call	\func	/* rdi points to pt_regs */
 	.endm
 

  parent reply	other threads:[~2018-02-21 16:59 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-02-20 21:01 [RFC PATCH v3 0/6] x86/entry/64: interrupt entry size reduction Dominik Brodowski
2018-02-20 21:01 ` [RFC PATCH v3 1/6] x86/entry/64: move PUSH_AND_CLEAR_REGS from interrupt macro to helper function Dominik Brodowski
2018-02-20 22:25   ` Linus Torvalds
2018-02-21  2:42     ` [PATCH] x86/entry/64: Simplify ENCODE_FRAME_POINTER Josh Poimboeuf
2018-02-21 10:50       ` [tip:x86/pti] " tip-bot for Josh Poimboeuf
2018-02-21 17:03       ` tip-bot for Josh Poimboeuf
2018-02-21 10:45   ` [tip:x86/pti] x86/entry/64: Move PUSH_AND_CLEAR_REGS from interrupt macro to helper function tip-bot for Dominik Brodowski
2018-02-21 16:58   ` tip-bot for Dominik Brodowski
2018-02-20 21:01 ` [RFC PATCH v3 2/6] x86/entry/64: move ENTER_IRQ_STACK from interrupt macro to interrupt_entry Dominik Brodowski
2018-02-21 10:46   ` [tip:x86/pti] x86/entry/64: Move " tip-bot for Dominik Brodowski
2018-02-21 16:59   ` tip-bot for Dominik Brodowski [this message]
2018-02-20 21:01 ` [RFC PATCH v3 3/6] x86/entry/64: move switch_to_thread_stack " Dominik Brodowski
2018-02-21 10:46   ` [tip:x86/pti] x86/entry/64: Move the switch_to_thread_stack() call to interrupt_entry() tip-bot for Dominik Brodowski
2018-02-21 16:59   ` tip-bot for Dominik Brodowski
2018-02-20 21:01 ` [RFC PATCH v3 4/6] x86/entry/64: remove interrupt macro Dominik Brodowski
2018-02-21 10:47   ` [tip:x86/pti] x86/entry/64: Remove 'interrupt' macro tip-bot for Dominik Brodowski
2018-02-21 17:00   ` tip-bot for Dominik Brodowski
2018-02-20 21:01 ` [RFC PATCH v3 5/6] x86/entry/64: move ASM_CLAC to interrupt_entry Dominik Brodowski
2018-02-21 10:47   ` [tip:x86/pti] x86/entry/64: Move ASM_CLAC to interrupt_entry() tip-bot for Dominik Brodowski
2018-02-21 17:00   ` tip-bot for Dominik Brodowski
2018-02-20 21:01 ` [RFC PATCH v3 6/6] x86/entry/64: open-code switch_to_thread_stack Dominik Brodowski
2018-02-21 10:48   ` [tip:x86/pti] x86/entry/64: Open-code switch_to_thread_stack() tip-bot for Dominik Brodowski
2018-02-21 17:01   ` tip-bot for Dominik Brodowski

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=tip-2ba6474104a1132c4af9f6dc42c6bfe3ca71f8c7@git.kernel.org \
    --to=tipbot@zytor.com \
    --cc=bp@alien8.de \
    --cc=brgerst@gmail.com \
    --cc=dvlasenk@redhat.com \
    --cc=dwmw2@infradead.org \
    --cc=hpa@zytor.com \
    --cc=jpoimboe@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=linux@dominikbrodowski.net \
    --cc=luto@kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=tglx@linutronix.de \
    --cc=torvalds@linux-foundation.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

all inboxes | Powered by JetHome®