• Andy Lutomirski's avatar
    x86/vdso/32: Save extra registers in the INT80 vsyscall path · 8242c6c8
    Andy Lutomirski authored
    The goal is to integrate the SYSENTER and SYSCALL32 entry paths
    with the INT80 path.  SYSENTER clobbers ESP and EIP.  SYSCALL32
    clobbers ECX (and, invisibly, R11).  SYSRETL (long mode to
    compat mode) clobbers ECX and, invisibly, R11.  SYSEXIT (which
    we only need for native 32-bit) clobbers ECX and EDX.
    
    This means that we'll need to provide ESP to the kernel in a
    register (I chose ECX, since it's only needed for SYSENTER) and
    we need to provide the args that normally live in ECX and EDX in
    memory.
    
    The epilogue needs to restore ECX and EDX, since user code
    relies on regs being preserved.
    
    We don't need to do anything special about EIP, since the kernel
    already knows where we are.  The kernel will eventually need to
    know where int $0x80 lands, so add a vdso_image entry for it.
    
    The only user-visible effect of this code is that ptrace-induced
    changes to ECX and EDX during fast syscalls will be lost.  This
    is already the case for the SYSENTER path.
    Signed-off-by: default avatarAndy Lutomirski <luto@kernel.org>
    Cc: Andy Lutomirski <luto@amacapital.net>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: linux-kernel@vger.kernel.org
    Link: http://lkml.kernel.org/r/b860925adbee2d2627a0671fbfe23a7fd04127f8.1444091584.git.luto@kernel.orgSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    8242c6c8
vdso2c.c 6.81 KB