From c4bf5bc5f0edbcbc5965c924db069483b2cf6049 Mon Sep 17 00:00:00 2001 From: Andrew Cooper Date: Mon, 6 Jul 2026 15:59:40 +0100 Subject: [PATCH] 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 Reviewed-by: Jan Beulich --- xen/arch/x86/include/asm/asm_defns.h | 45 ---------------------------- xen/arch/x86/x86_64/compat/entry.S | 4 ++- xen/arch/x86/x86_64/entry.S | 25 ++++++++++------ 3 files changed, 19 insertions(+), 55 deletions(-) diff --git a/xen/arch/x86/include/asm/asm_defns.h b/xen/arch/x86/include/asm/asm_defns.h index d1b80186c1..6c65acd083 100644 --- a/xen/arch/x86/include/asm/asm_defns.h +++ b/xen/arch/x86/include/asm/asm_defns.h @@ -219,51 +219,6 @@ static always_inline void stac(void) #endif #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 */ diff --git a/xen/arch/x86/x86_64/compat/entry.S b/xen/arch/x86/x86_64/compat/entry.S index 4bf4ee7c94..ca20ea12f9 100644 --- a/xen/arch/x86/x86_64/compat/entry.S +++ b/xen/arch/x86/x86_64/compat/entry.S @@ -11,12 +11,14 @@ #include #include +/* DPL1 gate, restricted to 32bit PV guest kernels only. */ FUNC(entry_int82) ENDBR64 + cld ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP pushq $0 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) diff --git a/xen/arch/x86/x86_64/entry.S b/xen/arch/x86/x86_64/entry.S index cd3532d7d1..22729b1f43 100644 --- a/xen/arch/x86/x86_64/entry.S +++ b/xen/arch/x86/x86_64/entry.S @@ -305,7 +305,7 @@ FUNC(lstar_enter) pushq $0 BUILD_BUG_ON(TRAP_syscall & 0xff) movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp) - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -345,7 +345,7 @@ FUNC(cstar_enter) pushq $0 BUILD_BUG_ON(TRAP_syscall & 0xff) movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp) - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -383,13 +383,14 @@ FUNC(sysenter_entry) pushq $0 pushfq LABEL(sysenter_eflags_saved, 0) + cld ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP pushq $3 /* ring 3 null cs */ pushq $0 /* null rip */ pushq $0 BUILD_BUG_ON(TRAP_syscall & 0xff) movb $TRAP_syscall >> 8, EFRAME_entry_vector + 1(%rsp) - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -442,10 +443,11 @@ END(sysenter_entry) FUNC(entry_int80) ENDBR64 + cld ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP pushq $0 movb $0x80, EFRAME_entry_vector(%rsp) - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -722,8 +724,9 @@ END(ret_from_intr) .section .init.text, "ax", @progbits FUNC(early_page_fault) ENDBR64 + cld movb $X86_EXC_PF, EFRAME_entry_vector(%rsp) - SAVE_ALL + PUSH_AND_CLEAR_GPRS movq %rsp, %rdi call do_early_page_fault jmp restore_all_xen @@ -769,8 +772,9 @@ UNLIKELY_END(exit_cr3) END(restore_all_xen) FUNC(common_interrupt) + cld ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -805,8 +809,9 @@ FUNC(entry_PF) END(entry_PF) /* No special register assumptions. */ FUNC(handle_exception, 0) + cld ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -1103,9 +1108,10 @@ END(entry_CP) FUNC(entry_DF) ENDBR64 movb $X86_EXC_DF, EFRAME_entry_vector(%rsp) + cld /* Set AC to reduce chance of further SMAP faults */ ALTERNATIVE "", stac, X86_FEATURE_XEN_SMAP - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14) @@ -1132,8 +1138,9 @@ FUNC(entry_NMI) END(entry_NMI) FUNC(handle_ist_exception) + cld ALTERNATIVE "", clac, X86_FEATURE_XEN_SMAP - SAVE_ALL + PUSH_AND_CLEAR_GPRS GET_STACK_END(14)