lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 23 Apr 2020 19:21:53 -0400 From: Sasha Levin <sashal@...nel.org> To: linux-kernel@...r.kernel.org, tglx@...utronix.de, bp@...en8.de, luto@...nel.org Cc: hpa@...or.com, dave.hansen@...el.com, tony.luck@...el.com, ak@...ux.intel.com, ravi.v.shankar@...el.com, chang.seok.bae@...el.com, Vegard Nossum <vegard.nossum@...cle.com>, Sasha Levin <sashal@...nel.org> Subject: [PATCH v10 04/18] x86/entry/64: Clean up paranoid exit From: Andy Lutomirski <luto@...nel.org> All that paranoid exit needs to do is to disable IRQs, handle IRQ tracing, then restore CR3, and restore GS base. Simply do those actions in that order. Cleaning up the spaghetti code. Signed-off-by: Andy Lutomirski <luto@...nel.org> Signed-off-by: Chang S. Bae <chang.seok.bae@...el.com> Reviewed-by: Tony Luck <tony.luck@...el.com> Cc: Thomas Gleixner <tglx@...utronix.de> Cc: Borislav Petkov <bp@...en8.de> Cc: Andy Lutomirski <luto@...nel.org> Cc: H. Peter Anvin <hpa@...or.com> Cc: Dave Hansen <dave.hansen@...el.com> Cc: Tony Luck <tony.luck@...el.com> Cc: Andi Kleen <ak@...ux.intel.com> Cc: Vegard Nossum <vegard.nossum@...cle.com> Signed-off-by: Sasha Levin <sashal@...nel.org> --- arch/x86/entry/entry_64.S | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S index 0e9504fabe526..3adb3c8e2409b 100644 --- a/arch/x86/entry/entry_64.S +++ b/arch/x86/entry/entry_64.S @@ -1266,19 +1266,25 @@ SYM_CODE_END(paranoid_entry) SYM_CODE_START_LOCAL(paranoid_exit) UNWIND_HINT_REGS DISABLE_INTERRUPTS(CLBR_ANY) + + /* + * The order of operations is important. IRQ tracing requires + * kernel GS base and CR3. RESTORE_CR3 requires kernel GS base. + * + * NB to anyone to try to optimize this code: this code does + * not execute at all for exceptions from user mode. Those + * exceptions go through error_exit instead. + */ TRACE_IRQS_OFF_DEBUG - testl %ebx, %ebx /* swapgs needed? */ - jnz .Lparanoid_exit_no_swapgs - TRACE_IRQS_IRETQ - /* Always restore stashed CR3 value (see paranoid_entry) */ - RESTORE_CR3 scratch_reg=%rbx save_reg=%r14 + RESTORE_CR3 scratch_reg=%rax save_reg=%r14 + + /* If EBX is 0, SWAPGS is required */ + testl %ebx, %ebx + jnz restore_regs_and_return_to_kernel + + /* We are returning to a context with user GS base */ SWAPGS_UNSAFE_STACK jmp restore_regs_and_return_to_kernel -.Lparanoid_exit_no_swapgs: - TRACE_IRQS_IRETQ_DEBUG - /* Always restore stashed CR3 value (see paranoid_entry) */ - RESTORE_CR3 scratch_reg=%rbx save_reg=%r14 - jmp restore_regs_and_return_to_kernel SYM_CODE_END(paranoid_exit) /* -- 2.20.1
Powered by blists - more mailing lists