Messages in this thread | | | From | Lai Jiangshan <> | Subject | [PATCH V3 0/7] x86/entry: Convert error_entry() to C code | Date | Mon, 6 Jun 2022 22:45:02 +0800 |
| |
From: Lai Jiangshan <jiangshan.ljs@antgroup.com>
Add some C equivalent functions of the ASM macros and implement the whole error_entry() as C code.
The patches are picked and re-made from the huge patchset https://lore.kernel.org/lkml/20211126101209.8613-1-jiangshanlai@gmail.com/ which converts a large chunk of ASM code to C code.
The C version generally has better readability and easier to be updated/improved.
This smaller patchset converts error_entry() only. The equivalent ASM macros are not removed because they are still used by the IST exceptions.
No functional change intended and comments are also copied.
The complier generates very similar code for the C code and the original ASM code except minor differences.
The complier uses tail-call-optimization for calling sync_regs(). It uses "JMP sync_regs" while the ASM code uses "CALL+RET".
The compiler generates "AND $0xe7,%ah" (3 bytes) for the code "cr3 = user_cr3 & ~PTI_USER_PGTABLE_AND_PCID_MASK" while the ASM code in SWITCH_TO_KERNEL_CR3() results "AND $0xffffffffffffe7ff,%rax" (6 bytes).
The compiler generates lengthier code for "cr3 |= X86_CR3_PCID_NOFLUSH" because it uses "MOVABS+OR" (13 bytes) rather than a single "BTS" (5 bytes).
ALTERNATIVE and static_cpu_has() are also different which depends on what alternative instructions for ALTERNATIVE are.
[V2]: https://lore.kernel.org/lkml/20220516131739.521817-1-jiangshanlai@gmail.com/ [V1]: https://lore.kernel.org/lkml/20220511072747.3960-1-jiangshanlai@gmail.com/
Changed from V2: Fix conflict in arch/x86/include/asm/proto.h in patch7
Changed from V1: remove unneeded cleanup in patch2
Changed from the old huge patchset: squash some patches
Lai Jiangshan (7): 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/entry: Add arch/x86/entry/entry64.c for C entry code x86/entry: Add the C verion of SWITCH_TO_KERNEL_CR3 as switch_to_kernel_cr3() x86/traps: Add fence_swapgs_{user,kernel}_entry() and user_entry_swapgs_and_fence() x86/entry: Implement the whole error_entry() as C code
arch/x86/entry/Makefile | 3 +- arch/x86/entry/calling.h | 10 -- arch/x86/entry/entry64.c | 137 +++++++++++++++++++++++++ arch/x86/entry/entry_64.S | 85 +-------------- arch/x86/include/asm/idtentry.h | 3 + arch/x86/include/asm/processor-flags.h | 15 +++ arch/x86/include/asm/proto.h | 1 + arch/x86/include/asm/special_insns.h | 4 +- arch/x86/include/asm/traps.h | 1 + arch/x86/kernel/traps.c | 2 - include/linux/compiler_types.h | 8 +- 11 files changed, 169 insertions(+), 100 deletions(-) create mode 100644 arch/x86/entry/entry64.c
-- 2.19.1.6.gb485710b
| |