lkml.org 
[lkml]   [2021]   [Nov]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH V6 24/49] x86/entry: Use idtentry macro for entry_INT80_compat
    Date
    From: Lai Jiangshan <laijs@linux.alibaba.com>

    entry_INT80_compat is identical to idtentry macro except a special
    handling for %rax in the prolog.

    Add the prolog to idtentry and use idtentry for entry_INT80_compat.

    Signed-off-by: Lai Jiangshan <laijs@linux.alibaba.com>
    ---
    arch/x86/entry/entry_64.S | 18 ++++++
    arch/x86/entry/entry_64_compat.S | 102 -------------------------------
    arch/x86/include/asm/idtentry.h | 47 ++++++++++++++
    arch/x86/include/asm/proto.h | 4 --
    4 files changed, 65 insertions(+), 106 deletions(-)

    diff --git a/arch/x86/entry/entry_64.S b/arch/x86/entry/entry_64.S
    index 16b2215bdb23..dd0cb43627a3 100644
    --- a/arch/x86/entry/entry_64.S
    +++ b/arch/x86/entry/entry_64.S
    @@ -371,6 +371,24 @@ SYM_CODE_START(\asmsym)
    pushq $-1 /* ORIG_RAX: no syscall to restart */
    .endif

    + .if \vector == IA32_SYSCALL_VECTOR
    + /*
    + * User tracing code (ptrace or signal handlers) might assume
    + * that the saved RAX contains a 32-bit number when we're
    + * invoking a 32-bit syscall. Just in case the high bits are
    + * nonzero, zero-extend the syscall number. (This could almost
    + * certainly be deleted with no ill effects.)
    + */
    + movl %eax, %eax
    +
    + /*
    + * do_int80_syscall_32() expects regs->orig_ax to be user ax,
    + * and regs->ax to be $-ENOSYS.
    + */
    + movq %rax, (%rsp)
    + movq $-ENOSYS, %rax
    + .endif
    +
    .if \vector == X86_TRAP_BP
    /*
    * If coming from kernel space, create a 6-word gap to allow the
    diff --git a/arch/x86/entry/entry_64_compat.S b/arch/x86/entry/entry_64_compat.S
    index 0051cf5c792d..a4fcea0cab14 100644
    --- a/arch/x86/entry/entry_64_compat.S
    +++ b/arch/x86/entry/entry_64_compat.S
    @@ -311,105 +311,3 @@ sysret32_from_system_call:
    swapgs
    sysretl
    SYM_CODE_END(entry_SYSCALL_compat)
    -
    -/*
    - * 32-bit legacy system call entry.
    - *
    - * 32-bit x86 Linux system calls traditionally used the INT $0x80
    - * instruction. INT $0x80 lands here.
    - *
    - * This entry point can be used by 32-bit and 64-bit programs to perform
    - * 32-bit system calls. Instances of INT $0x80 can be found inline in
    - * various programs and libraries. It is also used by the vDSO's
    - * __kernel_vsyscall fallback for hardware that doesn't support a faster
    - * entry method. Restarted 32-bit system calls also fall back to INT
    - * $0x80 regardless of what instruction was originally used to do the
    - * system call.
    - *
    - * This is considered a slow path. It is not used by most libc
    - * implementations on modern hardware except during process startup.
    - *
    - * Arguments:
    - * eax system call number
    - * ebx arg1
    - * ecx arg2
    - * edx arg3
    - * esi arg4
    - * edi arg5
    - * ebp arg6
    - */
    -SYM_CODE_START(entry_INT80_compat)
    - UNWIND_HINT_EMPTY
    - /*
    - * Interrupts are off on entry.
    - */
    - ASM_CLAC /* Do this early to minimize exposure */
    - SWAPGS
    -
    - /*
    - * User tracing code (ptrace or signal handlers) might assume that
    - * the saved RAX contains a 32-bit number when we're invoking a 32-bit
    - * syscall. Just in case the high bits are nonzero, zero-extend
    - * the syscall number. (This could almost certainly be deleted
    - * with no ill effects.)
    - */
    - movl %eax, %eax
    -
    - /* switch to thread stack expects orig_ax and rdi to be pushed */
    - pushq %rax /* pt_regs->orig_ax */
    - pushq %rdi /* pt_regs->di */
    -
    - /* Need to switch before accessing the thread stack. */
    - SWITCH_TO_KERNEL_CR3 scratch_reg=%rdi
    -
    - /* In the Xen PV case we already run on the thread stack. */
    - ALTERNATIVE "", "jmp .Lint80_keep_stack", X86_FEATURE_XENPV
    -
    - movq %rsp, %rdi
    - movq PER_CPU_VAR(cpu_current_top_of_stack), %rsp
    -
    - pushq 6*8(%rdi) /* regs->ss */
    - pushq 5*8(%rdi) /* regs->rsp */
    - pushq 4*8(%rdi) /* regs->eflags */
    - pushq 3*8(%rdi) /* regs->cs */
    - pushq 2*8(%rdi) /* regs->ip */
    - pushq 1*8(%rdi) /* regs->orig_ax */
    - pushq (%rdi) /* pt_regs->di */
    -.Lint80_keep_stack:
    -
    - pushq %rsi /* pt_regs->si */
    - xorl %esi, %esi /* nospec si */
    - pushq %rdx /* pt_regs->dx */
    - xorl %edx, %edx /* nospec dx */
    - pushq %rcx /* pt_regs->cx */
    - xorl %ecx, %ecx /* nospec cx */
    - pushq $-ENOSYS /* pt_regs->ax */
    - pushq %r8 /* pt_regs->r8 */
    - xorl %r8d, %r8d /* nospec r8 */
    - pushq %r9 /* pt_regs->r9 */
    - xorl %r9d, %r9d /* nospec r9 */
    - pushq %r10 /* pt_regs->r10*/
    - xorl %r10d, %r10d /* nospec r10 */
    - pushq %r11 /* pt_regs->r11 */
    - xorl %r11d, %r11d /* nospec r11 */
    - pushq %rbx /* pt_regs->rbx */
    - xorl %ebx, %ebx /* nospec rbx */
    - pushq %rbp /* pt_regs->rbp */
    - xorl %ebp, %ebp /* nospec rbp */
    - pushq %r12 /* pt_regs->r12 */
    - xorl %r12d, %r12d /* nospec r12 */
    - pushq %r13 /* pt_regs->r13 */
    - xorl %r13d, %r13d /* nospec r13 */
    - pushq %r14 /* pt_regs->r14 */
    - xorl %r14d, %r14d /* nospec r14 */
    - pushq %r15 /* pt_regs->r15 */
    - xorl %r15d, %r15d /* nospec r15 */
    -
    - UNWIND_HINT_REGS
    -
    - cld
    -
    - movq %rsp, %rdi
    - call do_int80_syscall_32
    - jmp swapgs_restore_regs_and_return_to_usermode
    -SYM_CODE_END(entry_INT80_compat)
    diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
    index 6779def97591..49fabc3e3f0d 100644
    --- a/arch/x86/include/asm/idtentry.h
    +++ b/arch/x86/include/asm/idtentry.h
    @@ -207,6 +207,20 @@ __visible noinstr void func(struct pt_regs *regs, \
    \
    static noinline void __##func(struct pt_regs *regs, u32 vector)

    +/**
    + * DECLARE_IDTENTRY_IA32_EMULATION - Declare functions for int80
    + * @vector: Vector number (ignored for C)
    + * @asm_func: Function name of the entry point
    + * @cfunc: The C handler called from the ASM entry point (ignored for C)
    + *
    + * Declares two functions:
    + * - The ASM entry point: asm_func
    + * - The XEN PV trap entry point: xen_##asm_func (maybe unused)
    + */
    +#define DECLARE_IDTENTRY_IA32_EMULATION(vector, asm_func, cfunc) \
    + asmlinkage void asm_func(void); \
    + asmlinkage void xen_##asm_func(void)
    +
    /**
    * DECLARE_IDTENTRY_SYSVEC - Declare functions for system vector entry points
    * @vector: Vector number (ignored for C)
    @@ -433,6 +447,35 @@ __visible noinstr void func(struct pt_regs *regs, \
    #define DECLARE_IDTENTRY_ERRORCODE(vector, func) \
    idtentry vector asm_##func func has_error_code=1

    +/*
    + * 32-bit legacy system call entry.
    + *
    + * 32-bit x86 Linux system calls traditionally used the INT $0x80
    + * instruction. INT $0x80 lands here.
    + *
    + * This entry point can be used by 32-bit and 64-bit programs to perform
    + * 32-bit system calls. Instances of INT $0x80 can be found inline in
    + * various programs and libraries. It is also used by the vDSO's
    + * __kernel_vsyscall fallback for hardware that doesn't support a faster
    + * entry method. Restarted 32-bit system calls also fall back to INT
    + * $0x80 regardless of what instruction was originally used to do the
    + * system call.
    + *
    + * This is considered a slow path. It is not used by most libc
    + * implementations on modern hardware except during process startup.
    + *
    + * Arguments:
    + * eax system call number
    + * ebx arg1
    + * ecx arg2
    + * edx arg3
    + * esi arg4
    + * edi arg5
    + * ebp arg6
    + */
    +#define DECLARE_IDTENTRY_IA32_EMULATION(vector, asm_func, cfunc) \
    + idtentry vector asm_func cfunc has_error_code=0
    +
    /* Special case for 32bit IRET 'trap'. Do not emit ASM code */
    #define DECLARE_IDTENTRY_SW(vector, func)

    @@ -634,6 +677,10 @@ DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER, common_interrupt);
    DECLARE_IDTENTRY_IRQ(X86_TRAP_OTHER, spurious_interrupt);
    #endif

    +#ifdef CONFIG_IA32_EMULATION
    +DECLARE_IDTENTRY_IA32_EMULATION(IA32_SYSCALL_VECTOR, entry_INT80_compat, do_int80_syscall_32);
    +#endif
    +
    /* System vector entry points */
    #ifdef CONFIG_X86_LOCAL_APIC
    DECLARE_IDTENTRY_SYSVEC(ERROR_APIC_VECTOR, sysvec_error_interrupt);
    diff --git a/arch/x86/include/asm/proto.h b/arch/x86/include/asm/proto.h
    index 33ae276c8b34..597c767091cb 100644
    --- a/arch/x86/include/asm/proto.h
    +++ b/arch/x86/include/asm/proto.h
    @@ -29,10 +29,6 @@ void entry_SYSENTER_compat(void);
    void __end_entry_SYSENTER_compat(void);
    void entry_SYSCALL_compat(void);
    void entry_SYSCALL_compat_safe_stack(void);
    -void entry_INT80_compat(void);
    -#ifdef CONFIG_XEN_PV
    -void xen_entry_INT80_compat(void);
    -#endif
    #endif

    void x86_configure_nx(void);
    --
    2.19.1.6.gb485710b
    \
     
     \ /
      Last update: 2021-11-26 11:27    [W:2.903 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site