From: Lai Jiangshan <jiangshanlai@gmail.com> To: linux-kernel@vger.kernel.org Cc: Lai Jiangshan <laijs@linux.alibaba.com>, Thomas Gleixner <tglx@linutronix.de>, Ingo Molnar <mingo@redhat.com>, Borislav Petkov <bp@alien8.de>, Peter Zijlstra <peterz@infradead.org>, Andy Lutomirski <luto@kernel.org>, "H. Peter Anvin" <hpa@zytor.com> Subject: [PATCH 00/24] x86/entry/64: Convert a bunch of ASM entry code into C code Date: Wed, 1 Sep 2021 01:50:01 +0800 [thread overview] Message-ID: <20210831175025.27570-1-jiangshanlai@gmail.com> (raw) From: Lai Jiangshan <laijs@linux.alibaba.com> Many ASM code in entry_64.S can be rewritten in C if they can be written to be non-instrumentable and are called in the right order regarding to whether CR3/gsbase is changed to kernel CR3/gsbase. The patchset covert some of them to C code. The patch 11 converts the non paranoid entry (entry of interrupts/ non-IST-exception/IST-exception-from-user) to C code. And patch 1-10 are preparation for it and patch 12-13 are cleanup for it. The patch 1 might fix a defect. The patch 22 converts the paranoid entry/exit to Code. And patch 14-21 are pareparation for it and patch 23 is cleanup for it. The patch 24 converts a small part of ASM code of syscall to C code which does the checking for whether it can use sysret to return to userspace. Some other paths can be possible to be in C code, for example: the non paranoid exit, the syscall entry/exit. The PTI handling for them can be in C code. But it would required the pt_regs to be copied/pushed to the entry stack which means the C code would not be efficient. When converting ASM to C, the most effort is to make them the same. Almost no creative was involved. The code are kept as the same as ASM as possible and no functional change intended unless my missunderstanding in the ASM code was involved. The functions called by the C entry code are checked to be ensured noinstr or __always_inline. Some of them have more than one definitions and require some more cares from reviewers. The comments in the ASM are also copied in the right place in the C code. Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Ingo Molnar <mingo@redhat.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Andy Lutomirski <luto@kernel.org> Cc: "H. Peter Anvin" <hpa@zytor.com> Lai Jiangshan (24): x86/traps: Remove stack-protector from traps.c x86/traps: Move arch/x86/kernel/traps.c to arch/x86/entry/ x86/traps: Move declaration of native_irq_return_iret up x86/entry: Expose the address of .Lgs_change to traps.c x86/entry: Introduce __entry_text for entry code written in C x86/entry: Move PTI_USER_* to arch/x86/include/asm/processor-flags.h x86: Mark __native_read_cr3() & native_write_cr3() as __always_inline x86/traps: Add C verion of SWITCH_TO_KERNEL_CR3 as switch_to_kernel_cr3() x86/traps: Add fence_swapgs_{user,kernel}_entry() x86/traps: Move pt_regs only in fixup_bad_iret() x86/entry: Replace the most of asm code of error_entry to C code x86/traps: Reconstruct pt_regs on task stack directly in fixup_bad_iret() x86/traps: Mark sync_regs() and fixup_bad_iret() as static __always_inline x86/entry: Make paranoid_exit() callable x86/entry: Call paranoid_exit() in asm_exc_nmi() x86/entry: Use skip_rdi instead of save_ret for PUSH_AND_CLEAR_REGS x86/entry: Introduce struct ist_regs x86/entry: Add the C version ist_switch_to_kernel_cr3() x86/entry: Add the C version ist_restore_cr3() x86/entry: Add the C version get_percpu_base() x86/entry: Add the C version ist_switch_to_kernel_gsbase() x86/entry: Implement and use do_paranoid_entry() and paranoid_exit() x86/entry: Remove the unused ASM macros x86/syscall/64: Move the checking for sysret to C code arch/x86/entry/Makefile | 5 +- arch/x86/entry/calling.h | 144 +-------- arch/x86/entry/common.c | 73 ++++- arch/x86/entry/entry_64.S | 366 ++++------------------- arch/x86/{kernel => entry}/traps.c | 397 +++++++++++++++++++++++-- arch/x86/include/asm/processor-flags.h | 15 + arch/x86/include/asm/special_insns.h | 4 +- arch/x86/include/asm/syscall.h | 2 +- arch/x86/include/asm/traps.h | 36 ++- arch/x86/kernel/Makefile | 2 +- arch/x86/kernel/asm-offsets_64.c | 2 + 11 files changed, 554 insertions(+), 492 deletions(-) rename arch/x86/{kernel => entry}/traps.c (74%) -- 2.19.1.6.gb485710b
next reply other threads:[~2021-08-31 17:50 UTC|newest] Thread overview: 72+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-08-31 17:50 Lai Jiangshan [this message] 2021-08-31 17:50 ` [PATCH 01/24] x86/traps: Remove stack-protector from traps.c Lai Jiangshan 2021-08-31 17:50 ` [PATCH 02/24] x86/traps: Move arch/x86/kernel/traps.c to arch/x86/entry/ Lai Jiangshan 2021-09-02 8:09 ` Joerg Roedel 2021-09-02 9:21 ` Lai Jiangshan 2021-09-02 10:50 ` Peter Zijlstra 2021-09-02 11:54 ` Lai Jiangshan 2021-09-02 12:05 ` Peter Zijlstra 2021-09-02 13:34 ` Peter Zijlstra 2021-09-02 17:05 ` Nick Desaulniers 2021-09-02 17:19 ` Miguel Ojeda 2021-09-02 17:23 ` Nick Desaulniers 2021-09-03 7:36 ` Martin Liška 2021-09-07 21:12 ` Nick Desaulniers 2021-09-08 7:33 ` Martin Liška 2021-08-31 17:50 ` [PATCH 03/24] x86/traps: Move declaration of native_irq_return_iret up Lai Jiangshan 2021-08-31 17:50 ` [PATCH 04/24] x86/entry: Expose the address of .Lgs_change to traps.c Lai Jiangshan 2021-09-02 9:14 ` Peter Zijlstra 2021-09-02 9:20 ` Lai Jiangshan 2021-08-31 17:50 ` [PATCH 05/24] x86/entry: Introduce __entry_text for entry code written in C Lai Jiangshan 2021-08-31 19:34 ` Peter Zijlstra 2021-09-01 0:23 ` Lai Jiangshan 2021-08-31 17:50 ` [PATCH 06/24] x86/entry: Move PTI_USER_* to arch/x86/include/asm/processor-flags.h Lai Jiangshan 2021-08-31 17:50 ` [PATCH 07/24] x86: Mark __native_read_cr3() & native_write_cr3() as __always_inline Lai Jiangshan 2021-08-31 17:50 ` [PATCH 08/24] x86/traps: Add C verion of SWITCH_TO_KERNEL_CR3 as switch_to_kernel_cr3() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 09/24] x86/traps: Add fence_swapgs_{user,kernel}_entry() Lai Jiangshan 2021-09-02 9:25 ` Peter Zijlstra 2021-08-31 17:50 ` [PATCH 10/24] x86/traps: Move pt_regs only in fixup_bad_iret() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 11/24] x86/entry: Replace the most of asm code of error_entry to C code Lai Jiangshan 2021-09-02 10:16 ` Peter Zijlstra 2021-09-02 12:08 ` Lai Jiangshan 2021-08-31 17:50 ` [PATCH 12/24] x86/traps: Reconstruct pt_regs on task stack directly in fixup_bad_iret() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 13/24] x86/traps: Mark sync_regs() and fixup_bad_iret() as static __always_inline Lai Jiangshan 2021-08-31 17:50 ` [PATCH 14/24] x86/entry: Make paranoid_exit() callable Lai Jiangshan 2021-08-31 17:50 ` [PATCH 15/24] x86/entry: Call paranoid_exit() in asm_exc_nmi() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 16/24] x86/entry: Use skip_rdi instead of save_ret for PUSH_AND_CLEAR_REGS Lai Jiangshan 2021-08-31 17:50 ` [PATCH 17/24] x86/entry: Introduce struct ist_regs Lai Jiangshan 2021-09-10 0:18 ` Lai Jiangshan 2021-09-10 0:36 ` Lai Jiangshan 2021-09-10 4:31 ` H. Peter Anvin 2021-09-10 7:13 ` Lai Jiangshan 2021-09-10 7:14 ` H. Peter Anvin 2021-09-10 4:50 ` H. Peter Anvin 2021-09-10 4:51 ` H. Peter Anvin 2021-08-31 17:50 ` [PATCH 18/24] x86/entry: Add the C version ist_switch_to_kernel_cr3() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 19/24] x86/entry: Add the C version ist_restore_cr3() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 20/24] x86/entry: Add the C version get_percpu_base() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 21/24] x86/entry: Add the C version ist_switch_to_kernel_gsbase() Lai Jiangshan 2021-08-31 17:50 ` [PATCH 22/24] x86/entry: Implement and use do_paranoid_entry() and paranoid_exit() Lai Jiangshan 2021-09-02 10:33 ` Peter Zijlstra 2021-09-02 10:42 ` Lai Jiangshan 2021-09-02 12:02 ` Peter Zijlstra 2021-09-02 11:58 ` Lai Jiangshan 2021-09-02 12:29 ` Joerg Roedel 2021-08-31 17:50 ` [PATCH 23/24] x86/entry: Remove the unused ASM macros Lai Jiangshan 2021-08-31 17:50 ` [PATCH 24/24] x86/syscall/64: Move the checking for sysret to C code Lai Jiangshan 2021-09-10 7:20 ` Nikolay Borisov 2021-09-10 7:30 ` Lai Jiangshan 2021-08-31 20:44 ` [PATCH 00/24] x86/entry/64: Convert a bunch of ASM entry code into " Peter Zijlstra 2021-09-02 6:28 ` Lai Jiangshan 2021-09-02 7:44 ` Peter Zijlstra 2021-09-02 10:50 ` [PATCH 25/24] x86/traps: Rewrite native_load_gs_index in " Lai Jiangshan 2021-09-08 1:38 ` H. Peter Anvin 2021-09-08 4:42 ` H. Peter Anvin 2021-09-08 5:00 ` H. Peter Anvin 2021-09-08 7:12 ` Lai Jiangshan 2021-09-09 23:16 ` H. Peter Anvin 2021-09-13 20:01 ` Andy Lutomirski 2021-09-14 2:04 ` Lai Jiangshan 2021-09-14 8:14 ` Peter Zijlstra 2021-09-14 8:17 ` Borislav Petkov 2021-09-14 8:40 ` Lai Jiangshan
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=20210831175025.27570-1-jiangshanlai@gmail.com \ --to=jiangshanlai@gmail.com \ --cc=bp@alien8.de \ --cc=hpa@zytor.com \ --cc=laijs@linux.alibaba.com \ --cc=linux-kernel@vger.kernel.org \ --cc=luto@kernel.org \ --cc=mingo@redhat.com \ --cc=peterz@infradead.org \ --cc=tglx@linutronix.de \ --subject='Re: [PATCH 00/24] x86/entry/64: Convert a bunch of ASM entry code into C code' \ /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
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.