From: Andy Lutomirski <luto@kernel.org>
To: x86@kernel.org, linux-kernel@vger.kernel.org
Cc: "Frédéric Weisbecker" <fweisbec@gmail.com>,
"Rik van Riel" <riel@redhat.com>,
"Oleg Nesterov" <oleg@redhat.com>,
"Denys Vlasenko" <vda.linux@googlemail.com>,
"Borislav Petkov" <bp@alien8.de>,
"Kees Cook" <keescook@chromium.org>,
"Brian Gerst" <brgerst@gmail.com>,
paulmck@linux.vnet.ibm.com, "Andy Lutomirski" <luto@kernel.org>
Subject: [PATCH v3 10/15] x86/asm/entry/64: Save all regs on interrupt entry
Date: Tue, 23 Jun 2015 19:46:13 -0700 [thread overview]
Message-ID: <1eddce2f1c83d7e7fd3a4f6bb88a1b562c31aa0a.1435113808.git.luto@kernel.org> (raw)
In-Reply-To: <cover.1435113808.git.luto@kernel.org>
In-Reply-To: <cover.1435113808.git.luto@kernel.org>
To prepare for the big rewrite of the error and interrupt exit
paths, we will need pt_regs completely filled in. It's already
completely filled in when error_exit runs, so rearrange interrupt
handling to match it. This will slow down interrupt handling very
slightly (eight instructions), but the simplification it enables
will be more than worth it.
Signed-off-by: Andy Lutomirski <luto@kernel.org>
---
arch/x86/entry/entry_64.S | 29 +++++++++--------------------
1 file changed, 9 insertions(+), 20 deletions(-)
diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
index 0aada75cdd12..3fdfd3e27918 100644
--- a/arch/x86/entry/entry_64.S
+++ b/arch/x86/entry/entry_64.S
@@ -501,21 +501,13 @@ END(irq_entries_start)
/* 0(%rsp): ~(interrupt number) */
.macro interrupt func
cld
- /*
- * Since nothing in interrupt handling code touches r12...r15 members
- * of "struct pt_regs", and since interrupts can nest, we can save
- * four stack slots and simultaneously provide
- * an unwind-friendly stack layout by saving "truncated" pt_regs
- * exactly up to rbp slot, without these members.
- */
- ALLOC_PT_GPREGS_ON_STACK -RBP
- SAVE_C_REGS -RBP
- /* this goes to 0(%rsp) for unwinder, not for saving the value: */
- SAVE_EXTRA_REGS_RBP -RBP
+ ALLOC_PT_GPREGS_ON_STACK
+ SAVE_C_REGS
+ SAVE_EXTRA_REGS
- leaq -RBP(%rsp), %rdi /* arg1 for \func (pointer to pt_regs) */
+ movq %rsp,%rdi /* arg1 for \func (pointer to pt_regs) */
- testb $3, CS-RBP(%rsp)
+ testb $3, CS(%rsp)
jz 1f
SWAPGS
1:
@@ -552,9 +544,7 @@ ret_from_intr:
decl PER_CPU_VAR(irq_count)
/* Restore saved previous stack */
- popq %rsi
- /* return code expects complete pt_regs - adjust rsp accordingly: */
- leaq -RBP(%rsi), %rsp
+ popq %rsp
testb $3, CS(%rsp)
jz retint_kernel
@@ -579,7 +569,7 @@ retint_swapgs: /* return to user-space */
TRACE_IRQS_IRETQ
SWAPGS
- jmp restore_c_regs_and_iret
+ jmp restore_regs_and_iret
/* Returning to kernel space */
retint_kernel:
@@ -603,6 +593,8 @@ retint_kernel:
* At this label, code paths which return to kernel and to user,
* which come from interrupts/exception and from syscalls, merge.
*/
+restore_regs_and_iret:
+ RESTORE_EXTRA_REGS
restore_c_regs_and_iret:
RESTORE_C_REGS
REMOVE_PT_GPREGS_FROM_STACK 8
@@ -673,12 +665,10 @@ retint_signal:
jz retint_swapgs
TRACE_IRQS_ON
ENABLE_INTERRUPTS(CLBR_NONE)
- SAVE_EXTRA_REGS
movq $-1, ORIG_RAX(%rsp)
xorl %esi, %esi /* oldset */
movq %rsp, %rdi /* &pt_regs */
call do_notify_resume
- RESTORE_EXTRA_REGS
DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF
GET_THREAD_INFO(%rcx)
@@ -1159,7 +1149,6 @@ END(error_entry)
*/
ENTRY(error_exit)
movl %ebx, %eax
- RESTORE_EXTRA_REGS
DISABLE_INTERRUPTS(CLBR_NONE)
TRACE_IRQS_OFF
testl %eax, %eax
--
2.4.3
next prev parent reply other threads:[~2015-06-24 2:48 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-06-24 2:46 [PATCH v3 00/15] x86: Rewrite exit-to-userspace code Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 01/15] uml: Fix do_signal() prototype Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 02/15] context_tracking: Add ct_state and CT_WARN_ON Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 03/15] notifiers: Assert that RCU is watching in notify_die Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 04/15] x86: Move C entry and exit code to arch/x86/entry/common.c Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 05/15] x86/traps: Assert that we're in CONTEXT_KERNEL in exception entries Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 06/15] x86/entry: Add enter_from_user_mode and use it in syscalls Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 07/15] x86/entry: Add new, comprehensible entry and exit hooks Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 08/15] x86/entry/64: Really create an error-entry-from-usermode code path Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 09/15] x86/entry/64: Migrate 64-bit and compat syscalls to new exit hooks Andy Lutomirski
2015-06-24 21:18 ` Andy Lutomirski
2015-06-24 2:46 ` Andy Lutomirski [this message]
2015-06-24 2:46 ` [PATCH v3 11/15] x86/asm/entry/64: Simplify irq stack pt_regs handling Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 12/15] x86/asm/entry/64: Migrate error and interrupt exit work to C Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 13/15] x86/entry: Remove exception_enter from trap handlers Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 14/15] x86/entry: Remove SCHEDULE_USER and asm/context-tracking.h Andy Lutomirski
2015-06-24 2:46 ` [PATCH v3 15/15] x86/irq: Document how IRQ context tracking works and add an assertion Andy Lutomirski
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=1eddce2f1c83d7e7fd3a4f6bb88a1b562c31aa0a.1435113808.git.luto@kernel.org \
--to=luto@kernel.org \
--cc=bp@alien8.de \
--cc=brgerst@gmail.com \
--cc=fweisbec@gmail.com \
--cc=keescook@chromium.org \
--cc=linux-kernel@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=paulmck@linux.vnet.ibm.com \
--cc=riel@redhat.com \
--cc=vda.linux@googlemail.com \
--cc=x86@kernel.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®