• Dominik Brodowski's avatar
    syscalls/x86: Use 'struct pt_regs' based syscall calling for IA32_EMULATION and x32 · ebeb8c82
    Dominik Brodowski authored
    Extend ARCH_HAS_SYSCALL_WRAPPER for i386 emulation and for x32 on 64-bit
    x86.
    
    For x32, all we need to do is to create an additional stub for each
    compat syscall which decodes the parameters in x86-64 ordering, e.g.:
    
    	asmlinkage long __compat_sys_x32_xyzzy(struct pt_regs *regs)
    	{
    		return c_SyS_xyzzy(regs->di, regs->si, regs->dx);
    	}
    
    For i386 emulation, we need to teach compat_sys_*() to take struct
    pt_regs as its only argument, e.g.:
    
    	asmlinkage long __compat_sys_ia32_xyzzy(struct pt_regs *regs)
    	{
    		return c_SyS_xyzzy(regs->bx, regs->cx, regs->dx);
    	}
    
    In addition, we need to create additional stubs for common syscalls
    (that is, for syscalls which have the same parameters on 32-bit and
    64-bit), e.g.:
    
    	asmlinkage long __sys_ia32_xyzzy(struct pt_regs *regs)
    	{
    		return c_sys_xyzzy(regs->bx, regs->cx, regs->dx);
    	}
    
    This approach avoids leaking random user-provided register content down
    the call chain.
    
    This patch is based on an original proof-of-concept
    
     | From: Linus Torvalds <torvalds@linux-foundation.org>
     | Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
    
    and was split up and heavily modified by me, in particular to base it on
    ARCH_HAS_SYSCALL_WRAPPER.
    Signed-off-by: default avatarDominik Brodowski <linux@dominikbrodowski.net>
    Acked-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Cc: Al Viro <viro@zeniv.linux.org.uk>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    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: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/20180405095307.3730-6-linux@dominikbrodowski.netSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    ebeb8c82
syscall_wrapper.h 6.58 KB