[PATCH V3 0/7] x86/entry: Convert error_entry() to C code
From: Lai Jiangshan
Date: Mon Jun 06 2022 - 10:44:27 EST
From: Lai Jiangshan <jiangshan.ljs@xxxxxxxxxxxx>
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@xxxxxxxxx/
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@xxxxxxxxx/
[V1]: https://lore.kernel.org/lkml/20220511072747.3960-1-jiangshanlai@xxxxxxxxx/
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