x86/entry: Use PUSH_AND_CLEAR_GPRS and drop SAVE_ALL

PUSH_AND_CLEAR_GPRS is shorter than SAVE_ALL in terms of emitted code.

lstar_enter() and cstar_enter() do not need CLD.  The SYSCALL instruction
sanitises flags based on MSR_SYSCALL_MASK.  For all other cases, place the CLD
instruction next to STAC/CLAC so the flag handling is together.

Get rid of the compat=1 special case for PV32.  It's not obviously a win, and
PV32 is getting increasingly rare these days.

No functional change.

Signed-off-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Jan Beulich <jbeulich@suse.com>
This commit is contained in:
Andrew Cooper committed 2026-07-07 17:19:38 +01:00
1 parent 8af337dfb8
commit c4bf5bc5f0
3 files changed
+19 -55

No files matched your search

-45
View File
@@ -219,51 +219,6 @@ static always_inline void stac(void)
#endif #endif
#ifdef __ASSEMBLER__ #ifdef __ASSEMBLER__
.macro SAVE_ALL compat=0
addq $-(UREGS_error_code-UREGS_r15), %rsp
cld
movq %rdi,UREGS_rdi(%rsp)
xor %edi, %edi
movq %rsi,UREGS_rsi(%rsp)
xor %esi, %esi
movq %rdx,UREGS_rdx(%rsp)
xor %edx, %edx
movq %rcx,UREGS_rcx(%rsp)
xor %ecx, %ecx
movq %rax,UREGS_rax(%rsp)
xor %eax, %eax
.if !\compat
movq %r8,UREGS_r8(%rsp)
movq %r9,UREGS_r9(%rsp)
movq %r10,UREGS_r10(%rsp)
movq %r11,UREGS_r11(%rsp)
.endif
xor %r8d, %r8d
xor %r9d, %r9d
xor %r10d, %r10d
xor %r11d, %r11d
movq %rbx,UREGS_rbx(%rsp)
xor %ebx, %ebx
movq %rbp,UREGS_rbp(%rsp)
#ifdef CONFIG_FRAME_POINTER
/* Indicate special exception stack frame by inverting the frame pointer. */
leaq UREGS_rbp(%rsp), %rbp
notq %rbp
#else
xor %ebp, %ebp
#endif
.if !\compat
movq %r12,UREGS_r12(%rsp)
movq %r13,UREGS_r13(%rsp)
movq %r14,UREGS_r14(%rsp)
movq %r15,UREGS_r15(%rsp)
.endif
xor %r12d, %r12d
xor %r13d, %r13d
xor %r14d, %r14d
xor %r15d, %r15d
.endm
/* /*
* Push and clear GPRs * Push and clear GPRs
*/ */
+3 -1
View File
@@ -11,12 +11,14 @@
#include <asm/desc.h> #include <asm/desc.h>
#include <public/xen.h> #include <public/xen.h>
/* DPL1 gate, restricted to 32bit PV guest kernels only. */
FUNC(entry_int82) FUNC(entry_int82)
ENDBR64 ENDBR64
cld
ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP
pushq $0 pushq $0
movb $HYPERCALL_VECTOR, EFRAME_entry_vector(%rsp) movb $HYPERCALL_VECTOR, EFRAME_entry_vector(%rsp)
SAVE_ALL compat=1 /* DPL1 gate, restricted to 32bit PV guests only. */ PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
+16 -9
View File
@@ -305,7 +305,7 @@ FUNC(lstar_enter)
pushq $0 pushq $0
BUILD_BUG_ON(TRAP_syscall & 0xff) BUILD_BUG_ON(TRAP_syscall & 0xff)
movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp) movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp)
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -345,7 +345,7 @@ FUNC(cstar_enter)
pushq $0 pushq $0
BUILD_BUG_ON(TRAP_syscall & 0xff) BUILD_BUG_ON(TRAP_syscall & 0xff)
movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp) movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp)
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -383,13 +383,14 @@ FUNC(sysenter_entry)
pushq $0 pushq $0
pushfq pushfq
LABEL(sysenter_eflags_saved, 0) LABEL(sysenter_eflags_saved, 0)
cld
ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP
pushq $3 /* ring 3 null cs */ pushq $3 /* ring 3 null cs */
pushq $0 /* null rip */ pushq $0 /* null rip */
pushq $0 pushq $0
BUILD_BUG_ON(TRAP_syscall & 0xff) BUILD_BUG_ON(TRAP_syscall & 0xff)
movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp) movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp)
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -442,10 +443,11 @@ END(sysenter_entry)
FUNC(entry_int80) FUNC(entry_int80)
ENDBR64 ENDBR64
cld
ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP
pushq $0 pushq $0
movb $0x80, EFRAME_entry_vector(%rsp) movb $0x80, EFRAME_entry_vector(%rsp)
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -722,8 +724,9 @@ END(ret_from_intr)
.section .init.text, "ax", @progbits .section .init.text, "ax", @progbits
FUNC(early_page_fault) FUNC(early_page_fault)
ENDBR64 ENDBR64
cld
movb $X86_EXC_PF, EFRAME_entry_vector(%rsp) movb $X86_EXC_PF, EFRAME_entry_vector(%rsp)
SAVE_ALL PUSH_AND_CLEAR_GPRS
movq %rsp, %rdi movq %rsp, %rdi
call do_early_page_fault call do_early_page_fault
jmp restore_all_xen jmp restore_all_xen
@@ -769,8 +772,9 @@ UNLIKELY_END(exit_cr3)
END(restore_all_xen) END(restore_all_xen)
FUNC(common_interrupt) FUNC(common_interrupt)
cld
ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -805,8 +809,9 @@ FUNC(entry_PF)
END(entry_PF) END(entry_PF)
/* No special register assumptions. */ /* No special register assumptions. */
FUNC(handle_exception, 0) FUNC(handle_exception, 0)
cld
ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -1103,9 +1108,10 @@ END(entry_CP)
FUNC(entry_DF) FUNC(entry_DF)
ENDBR64 ENDBR64
movb $X86_EXC_DF, EFRAME_entry_vector(%rsp) movb $X86_EXC_DF, EFRAME_entry_vector(%rsp)
cld
/* Set AC to reduce chance of further SMAP faults */ /* Set AC to reduce chance of further SMAP faults */
ALTERNATIVE "", stac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", stac, X86_FEATURE_XEN_SMAP
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
@@ -1132,8 +1138,9 @@ FUNC(entry_NMI)
END(entry_NMI) END(entry_NMI)
FUNC(handle_ist_exception) FUNC(handle_ist_exception)
cld
ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP
SAVE_ALL PUSH_AND_CLEAR_GPRS
GET_STACK_END(14) GET_STACK_END(14)
Reference in new issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.