syscalls/x86: Use 'struct pt_regs' based syscall calling for IA32_EMULATION and x32
authorDominik Brodowski <linux@dominikbrodowski.net>
Thu, 5 Apr 2018 09:53:04 +0000 (11:53 +0200)
committerIngo Molnar <mingo@kernel.org>
Thu, 5 Apr 2018 14:59:38 +0000 (16:59 +0200)
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: Dominik Brodowski <linux@dominikbrodowski.net>
Acked-by: Linus 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.net
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/Kconfig
arch/x86/entry/common.c
arch/x86/entry/syscall_32.c
arch/x86/entry/syscalls/syscall_32.tbl
arch/x86/entry/syscalls/syscall_64.tbl
arch/x86/include/asm/syscall_wrapper.h

index 67348efc2540ace96db4c6a206f2795519385add..7bbd6a174722c6506b0ba458dc14be281b9e3484 100644 (file)
@@ -2957,5 +2957,5 @@ source "lib/Kconfig"
 
 config SYSCALL_PTREGS
        def_bool y
-       depends on X86_64 && !COMPAT
+       depends on X86_64
        select ARCH_HAS_SYSCALL_WRAPPER
index e1b91bffa988367c32d1eed0bb76aaa6f724e722..425f798b39e333706edfd88adde865314d5a98fc 100644 (file)
@@ -325,6 +325,9 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs)
 
        if (likely(nr < IA32_NR_syscalls)) {
                nr = array_index_nospec(nr, IA32_NR_syscalls);
+#ifdef CONFIG_SYSCALL_PTREGS
+               regs->ax = ia32_sys_call_table[nr](regs);
+#else
                /*
                 * It's possible that a 32-bit syscall implementation
                 * takes a 64-bit parameter but nonetheless assumes that
@@ -335,6 +338,7 @@ static __always_inline void do_syscall_32_irqs_on(struct pt_regs *regs)
                        (unsigned int)regs->bx, (unsigned int)regs->cx,
                        (unsigned int)regs->dx, (unsigned int)regs->si,
                        (unsigned int)regs->di, (unsigned int)regs->bp);
+#endif /* CONFIG_SYSCALL_PTREGS */
        }
 
        syscall_return_slowpath(regs);
index 95c2949636129e057976714a738d058baa3a242c..47060dd8efb1113b55e69266c7bf62f000fbcfaf 100644 (file)
@@ -7,14 +7,23 @@
 #include <asm/asm-offsets.h>
 #include <asm/syscall.h>
 
-#define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long) ;
+#ifdef CONFIG_SYSCALL_PTREGS
+/* On X86_64, we use struct pt_regs * to pass parameters to syscalls */
+#define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(const struct pt_regs *);
+
+/* this is a lie, but it does not hurt as sys_ni_syscall just returns -EINVAL */
+extern asmlinkage long sys_ni_syscall(const struct pt_regs *);
+
+#else /* CONFIG_SYSCALL_PTREGS */
+#define __SYSCALL_I386(nr, sym, qual) extern asmlinkage long sym(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
+extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
+#endif /* CONFIG_SYSCALL_PTREGS */
+
 #include <asm/syscalls_32.h>
 #undef __SYSCALL_I386
 
 #define __SYSCALL_I386(nr, sym, qual) [nr] = sym,
 
-extern asmlinkage long sys_ni_syscall(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long);
-
 __visible const sys_call_ptr_t ia32_sys_call_table[__NR_syscall_compat_max+1] = {
        /*
         * Smells like a compiler bug -- it doesn't work
index c58f75b088c50d965092ea36e35dd590cecd6ba3..7f09a3da0b3dab8ca0f8741e69f85c22c36b5001 100644 (file)
 # The format is:
 # <number> <abi> <name> <entry point> <compat entry point>
 #
+# The __sys_ia32 and __compat_sys_ia32 stubs are created on-the-fly for
+# sys_*() system calls and compat_sys_*() compat system calls if
+# IA32_EMULATION is defined, and expect struct pt_regs *regs as their only
+# parameter.
+#
 # The abi is always "i386" for this file.
 #
 0      i386    restart_syscall         sys_restart_syscall
-1      i386    exit                    sys_exit
+1      i386    exit                    sys_exit                        __sys_ia32_exit
 2      i386    fork                    sys_fork
-3      i386    read                    sys_read
-4      i386    write                   sys_write
-5      i386    open                    sys_open                        compat_sys_open
-6      i386    close                   sys_close
-7      i386    waitpid                 sys_waitpid
-8      i386    creat                   sys_creat
-9      i386    link                    sys_link
-10     i386    unlink                  sys_unlink
-11     i386    execve                  sys_execve                      compat_sys_execve
-12     i386    chdir                   sys_chdir
-13     i386    time                    sys_time                        compat_sys_time
-14     i386    mknod                   sys_mknod
-15     i386    chmod                   sys_chmod
-16     i386    lchown                  sys_lchown16
+3      i386    read                    sys_read                        __sys_ia32_read
+4      i386    write                   sys_write                       __sys_ia32_write
+5      i386    open                    sys_open                        __compat_sys_ia32_open
+6      i386    close                   sys_close                       __sys_ia32_close
+7      i386    waitpid                 sys_waitpid                     __sys_ia32_waitpid
+8      i386    creat                   sys_creat                       __sys_ia32_creat
+9      i386    link                    sys_link                        __sys_ia32_link
+10     i386    unlink                  sys_unlink                      __sys_ia32_unlink
+11     i386    execve                  sys_execve                      __compat_sys_ia32_execve
+12     i386    chdir                   sys_chdir                       __sys_ia32_chdir
+13     i386    time                    sys_time                        __compat_sys_ia32_time
+14     i386    mknod                   sys_mknod                       __sys_ia32_mknod
+15     i386    chmod                   sys_chmod                       __sys_ia32_chmod
+16     i386    lchown                  sys_lchown16                    __sys_ia32_lchown16
 17     i386    break
-18     i386    oldstat                 sys_stat
-19     i386    lseek                   sys_lseek                       compat_sys_lseek
+18     i386    oldstat                 sys_stat                        __sys_ia32_stat
+19     i386    lseek                   sys_lseek                       __compat_sys_ia32_lseek
 20     i386    getpid                  sys_getpid
-21     i386    mount                   sys_mount                       compat_sys_mount
-22     i386    umount                  sys_oldumount
-23     i386    setuid                  sys_setuid16
+21     i386    mount                   sys_mount                       __compat_sys_ia32_mount
+22     i386    umount                  sys_oldumount                   __sys_ia32_oldumount
+23     i386    setuid                  sys_setuid16                    __sys_ia32_setuid16
 24     i386    getuid                  sys_getuid16
-25     i386    stime                   sys_stime                       compat_sys_stime
-26     i386    ptrace                  sys_ptrace                      compat_sys_ptrace
-27     i386    alarm                   sys_alarm
-28     i386    oldfstat                sys_fstat
+25     i386    stime                   sys_stime                       __compat_sys_ia32_stime
+26     i386    ptrace                  sys_ptrace                      __compat_sys_ia32_ptrace
+27     i386    alarm                   sys_alarm                       __sys_ia32_alarm
+28     i386    oldfstat                sys_fstat                       __sys_ia32_fstat
 29     i386    pause                   sys_pause
-30     i386    utime                   sys_utime                       compat_sys_utime
+30     i386    utime                   sys_utime                       __compat_sys_ia32_utime
 31     i386    stty
 32     i386    gtty
-33     i386    access                  sys_access
-34     i386    nice                    sys_nice
+33     i386    access                  sys_access                      __sys_ia32_access
+34     i386    nice                    sys_nice                        __sys_ia32_nice
 35     i386    ftime
 36     i386    sync                    sys_sync
-37     i386    kill                    sys_kill
-38     i386    rename                  sys_rename
-39     i386    mkdir                   sys_mkdir
-40     i386    rmdir                   sys_rmdir
-41     i386    dup                     sys_dup
-42     i386    pipe                    sys_pipe
-43     i386    times                   sys_times                       compat_sys_times
+37     i386    kill                    sys_kill                        __sys_ia32_kill
+38     i386    rename                  sys_rename                      __sys_ia32_rename
+39     i386    mkdir                   sys_mkdir                       __sys_ia32_mkdir
+40     i386    rmdir                   sys_rmdir                       __sys_ia32_rmdir
+41     i386    dup                     sys_dup                         __sys_ia32_dup
+42     i386    pipe                    sys_pipe                        __sys_ia32_pipe
+43     i386    times                   sys_times                       __compat_sys_ia32_times
 44     i386    prof
-45     i386    brk                     sys_brk
-46     i386    setgid                  sys_setgid16
+45     i386    brk                     sys_brk                         __sys_ia32_brk
+46     i386    setgid                  sys_setgid16                    __sys_ia32_setgid16
 47     i386    getgid                  sys_getgid16
-48     i386    signal                  sys_signal
+48     i386    signal                  sys_signal                      __sys_ia32_signal
 49     i386    geteuid                 sys_geteuid16
 50     i386    getegid                 sys_getegid16
-51     i386    acct                    sys_acct
-52     i386    umount2                 sys_umount
+51     i386    acct                    sys_acct                        __sys_ia32_acct
+52     i386    umount2                 sys_umount                      __sys_ia32_umount
 53     i386    lock
-54     i386    ioctl                   sys_ioctl                       compat_sys_ioctl
-55     i386    fcntl                   sys_fcntl                       compat_sys_fcntl64
+54     i386    ioctl                   sys_ioctl                       __compat_sys_ia32_ioctl
+55     i386    fcntl                   sys_fcntl                       __compat_sys_ia32_fcntl64
 56     i386    mpx
-57     i386    setpgid                 sys_setpgid
+57     i386    setpgid                 sys_setpgid                     __sys_ia32_setpgid
 58     i386    ulimit
-59     i386    oldolduname             sys_olduname
-60     i386    umask                   sys_umask
-61     i386    chroot                  sys_chroot
-62     i386    ustat                   sys_ustat                       compat_sys_ustat
-63     i386    dup2                    sys_dup2
+59     i386    oldolduname             sys_olduname                    __sys_ia32_olduname
+60     i386    umask                   sys_umask                       __sys_ia32_umask
+61     i386    chroot                  sys_chroot                      __sys_ia32_chroot
+62     i386    ustat                   sys_ustat                       __compat_sys_ia32_ustat
+63     i386    dup2                    sys_dup2                        __sys_ia32_dup2
 64     i386    getppid                 sys_getppid
 65     i386    getpgrp                 sys_getpgrp
 66     i386    setsid                  sys_setsid
-67     i386    sigaction               sys_sigaction                   compat_sys_sigaction
+67     i386    sigaction               sys_sigaction                   __compat_sys_ia32_sigaction
 68     i386    sgetmask                sys_sgetmask
-69     i386    ssetmask                sys_ssetmask
-70     i386    setreuid                sys_setreuid16
-71     i386    setregid                sys_setregid16
-72     i386    sigsuspend              sys_sigsuspend
-73     i386    sigpending              sys_sigpending                  compat_sys_sigpending
-74     i386    sethostname             sys_sethostname
-75     i386    setrlimit               sys_setrlimit                   compat_sys_setrlimit
-76     i386    getrlimit               sys_old_getrlimit               compat_sys_old_getrlimit
-77     i386    getrusage               sys_getrusage                   compat_sys_getrusage
-78     i386    gettimeofday            sys_gettimeofday                compat_sys_gettimeofday
-79     i386    settimeofday            sys_settimeofday                compat_sys_settimeofday
-80     i386    getgroups               sys_getgroups16
-81     i386    setgroups               sys_setgroups16
-82     i386    select                  sys_old_select                  compat_sys_old_select
-83     i386    symlink                 sys_symlink
-84     i386    oldlstat                sys_lstat
-85     i386    readlink                sys_readlink
-86     i386    uselib                  sys_uselib
-87     i386    swapon                  sys_swapon
-88     i386    reboot                  sys_reboot
-89     i386    readdir                 sys_old_readdir                 compat_sys_old_readdir
-90     i386    mmap                    sys_old_mmap                    compat_sys_x86_mmap
-91     i386    munmap                  sys_munmap
-92     i386    truncate                sys_truncate                    compat_sys_truncate
-93     i386    ftruncate               sys_ftruncate                   compat_sys_ftruncate
-94     i386    fchmod                  sys_fchmod
-95     i386    fchown                  sys_fchown16
-96     i386    getpriority             sys_getpriority
-97     i386    setpriority             sys_setpriority
+69     i386    ssetmask                sys_ssetmask                    __sys_ia32_ssetmask
+70     i386    setreuid                sys_setreuid16                  __sys_ia32_setreuid16
+71     i386    setregid                sys_setregid16                  __sys_ia32_setregid16
+72     i386    sigsuspend              sys_sigsuspend                  __sys_ia32_sigsuspend
+73     i386    sigpending              sys_sigpending                  __compat_sys_ia32_sigpending
+74     i386    sethostname             sys_sethostname                 __sys_ia32_sethostname
+75     i386    setrlimit               sys_setrlimit                   __compat_sys_ia32_setrlimit
+76     i386    getrlimit               sys_old_getrlimit               __compat_sys_ia32_old_getrlimit
+77     i386    getrusage               sys_getrusage                   __compat_sys_ia32_getrusage
+78     i386    gettimeofday            sys_gettimeofday                __compat_sys_ia32_gettimeofday
+79     i386    settimeofday            sys_settimeofday                __compat_sys_ia32_settimeofday
+80     i386    getgroups               sys_getgroups16                 __sys_ia32_getgroups16
+81     i386    setgroups               sys_setgroups16                 __sys_ia32_setgroups16
+82     i386    select                  sys_old_select                  __compat_sys_ia32_old_select
+83     i386    symlink                 sys_symlink                     __sys_ia32_symlink
+84     i386    oldlstat                sys_lstat                       __sys_ia32_lstat
+85     i386    readlink                sys_readlink                    __sys_ia32_readlink
+86     i386    uselib                  sys_uselib                      __sys_ia32_uselib
+87     i386    swapon                  sys_swapon                      __sys_ia32_swapon
+88     i386    reboot                  sys_reboot                      __sys_ia32_reboot
+89     i386    readdir                 sys_old_readdir                 __compat_sys_ia32_old_readdir
+90     i386    mmap                    sys_old_mmap                    __compat_sys_ia32_x86_mmap
+91     i386    munmap                  sys_munmap                      __sys_ia32_munmap
+92     i386    truncate                sys_truncate                    __compat_sys_ia32_truncate
+93     i386    ftruncate               sys_ftruncate                   __compat_sys_ia32_ftruncate
+94     i386    fchmod                  sys_fchmod                      __sys_ia32_fchmod
+95     i386    fchown                  sys_fchown16                    __sys_ia32_fchown16
+96     i386    getpriority             sys_getpriority                 __sys_ia32_getpriority
+97     i386    setpriority             sys_setpriority                 __sys_ia32_setpriority
 98     i386    profil
-99     i386    statfs                  sys_statfs                      compat_sys_statfs
-100    i386    fstatfs                 sys_fstatfs                     compat_sys_fstatfs
-101    i386    ioperm                  sys_ioperm
-102    i386    socketcall              sys_socketcall                  compat_sys_socketcall
-103    i386    syslog                  sys_syslog
-104    i386    setitimer               sys_setitimer                   compat_sys_setitimer
-105    i386    getitimer               sys_getitimer                   compat_sys_getitimer
-106    i386    stat                    sys_newstat                     compat_sys_newstat
-107    i386    lstat                   sys_newlstat                    compat_sys_newlstat
-108    i386    fstat                   sys_newfstat                    compat_sys_newfstat
-109    i386    olduname                sys_uname
-110    i386    iopl                    sys_iopl
+99     i386    statfs                  sys_statfs                      __compat_sys_ia32_statfs
+100    i386    fstatfs                 sys_fstatfs                     __compat_sys_ia32_fstatfs
+101    i386    ioperm                  sys_ioperm                      __sys_ia32_ioperm
+102    i386    socketcall              sys_socketcall                  __compat_sys_ia32_socketcall
+103    i386    syslog                  sys_syslog                      __sys_ia32_syslog
+104    i386    setitimer               sys_setitimer                   __compat_sys_ia32_setitimer
+105    i386    getitimer               sys_getitimer                   __compat_sys_ia32_getitimer
+106    i386    stat                    sys_newstat                     __compat_sys_ia32_newstat
+107    i386    lstat                   sys_newlstat                    __compat_sys_ia32_newlstat
+108    i386    fstat                   sys_newfstat                    __compat_sys_ia32_newfstat
+109    i386    olduname                sys_uname                       __sys_ia32_uname
+110    i386    iopl                    sys_iopl                        __sys_ia32_iopl
 111    i386    vhangup                 sys_vhangup
 112    i386    idle
 113    i386    vm86old                 sys_vm86old                     sys_ni_syscall
-114    i386    wait4                   sys_wait4                       compat_sys_wait4
-115    i386    swapoff                 sys_swapoff
-116    i386    sysinfo                 sys_sysinfo                     compat_sys_sysinfo
-117    i386    ipc                     sys_ipc                         compat_sys_ipc
-118    i386    fsync                   sys_fsync
+114    i386    wait4                   sys_wait4                       __compat_sys_ia32_wait4
+115    i386    swapoff                 sys_swapoff                     __sys_ia32_swapoff
+116    i386    sysinfo                 sys_sysinfo                     __compat_sys_ia32_sysinfo
+117    i386    ipc                     sys_ipc                         __compat_sys_ia32_ipc
+118    i386    fsync                   sys_fsync                       __sys_ia32_fsync
 119    i386    sigreturn               sys_sigreturn                   sys32_sigreturn
-120    i386    clone                   sys_clone                       compat_sys_x86_clone
-121    i386    setdomainname           sys_setdomainname
-122    i386    uname                   sys_newuname
-123    i386    modify_ldt              sys_modify_ldt
-124    i386    adjtimex                sys_adjtimex                    compat_sys_adjtimex
-125    i386    mprotect                sys_mprotect
-126    i386    sigprocmask             sys_sigprocmask                 compat_sys_sigprocmask
+120    i386    clone                   sys_clone                       __compat_sys_ia32_x86_clone
+121    i386    setdomainname           sys_setdomainname               __sys_ia32_setdomainname
+122    i386    uname                   sys_newuname                    __sys_ia32_newuname
+123    i386    modify_ldt              sys_modify_ldt                  __sys_ia32_modify_ldt
+124    i386    adjtimex                sys_adjtimex                    __compat_sys_ia32_adjtimex
+125    i386    mprotect                sys_mprotect                    __sys_ia32_mprotect
+126    i386    sigprocmask             sys_sigprocmask                 __compat_sys_ia32_sigprocmask
 127    i386    create_module
-128    i386    init_module             sys_init_module
-129    i386    delete_module           sys_delete_module
+128    i386    init_module             sys_init_module                 __sys_ia32_init_module
+129    i386    delete_module           sys_delete_module               __sys_ia32_delete_module
 130    i386    get_kernel_syms
-131    i386    quotactl                sys_quotactl                    compat_sys_quotactl32
-132    i386    getpgid                 sys_getpgid
-133    i386    fchdir                  sys_fchdir
-134    i386    bdflush                 sys_bdflush
-135    i386    sysfs                   sys_sysfs
-136    i386    personality             sys_personality
+131    i386    quotactl                sys_quotactl                    __compat_sys_ia32_quotactl32
+132    i386    getpgid                 sys_getpgid                     __sys_ia32_getpgid
+133    i386    fchdir                  sys_fchdir                      __sys_ia32_fchdir
+134    i386    bdflush                 sys_bdflush                     __sys_ia32_bdflush
+135    i386    sysfs                   sys_sysfs                       __sys_ia32_sysfs
+136    i386    personality             sys_personality                 __sys_ia32_personality
 137    i386    afs_syscall
-138    i386    setfsuid                sys_setfsuid16
-139    i386    setfsgid                sys_setfsgid16
-140    i386    _llseek                 sys_llseek
-141    i386    getdents                sys_getdents                    compat_sys_getdents
-142    i386    _newselect              sys_select                      compat_sys_select
-143    i386    flock                   sys_flock
-144    i386    msync                   sys_msync
-145    i386    readv                   sys_readv                       compat_sys_readv
-146    i386    writev                  sys_writev                      compat_sys_writev
-147    i386    getsid                  sys_getsid
-148    i386    fdatasync               sys_fdatasync
-149    i386    _sysctl                 sys_sysctl                      compat_sys_sysctl
-150    i386    mlock                   sys_mlock
-151    i386    munlock                 sys_munlock
-152    i386    mlockall                sys_mlockall
+138    i386    setfsuid                sys_setfsuid16                  __sys_ia32_setfsuid16
+139    i386    setfsgid                sys_setfsgid16                  __sys_ia32_setfsgid16
+140    i386    _llseek                 sys_llseek                      __sys_ia32_llseek
+141    i386    getdents                sys_getdents                    __compat_sys_ia32_getdents
+142    i386    _newselect              sys_select                      __compat_sys_ia32_select
+143    i386    flock                   sys_flock                       __sys_ia32_flock
+144    i386    msync                   sys_msync                       __sys_ia32_msync
+145    i386    readv                   sys_readv                       __compat_sys_ia32_readv
+146    i386    writev                  sys_writev                      __compat_sys_ia32_writev
+147    i386    getsid                  sys_getsid                      __sys_ia32_getsid
+148    i386    fdatasync               sys_fdatasync                   __sys_ia32_fdatasync
+149    i386    _sysctl                 sys_sysctl                      __compat_sys_ia32_sysctl
+150    i386    mlock                   sys_mlock                       __sys_ia32_mlock
+151    i386    munlock                 sys_munlock                     __sys_ia32_munlock
+152    i386    mlockall                sys_mlockall                    __sys_ia32_mlockall
 153    i386    munlockall              sys_munlockall
-154    i386    sched_setparam          sys_sched_setparam
-155    i386    sched_getparam          sys_sched_getparam
-156    i386    sched_setscheduler      sys_sched_setscheduler
-157    i386    sched_getscheduler      sys_sched_getscheduler
+154    i386    sched_setparam          sys_sched_setparam              __sys_ia32_sched_setparam
+155    i386    sched_getparam          sys_sched_getparam              __sys_ia32_sched_getparam
+156    i386    sched_setscheduler      sys_sched_setscheduler          __sys_ia32_sched_setscheduler
+157    i386    sched_getscheduler      sys_sched_getscheduler          __sys_ia32_sched_getscheduler
 158    i386    sched_yield             sys_sched_yield
-159    i386    sched_get_priority_max  sys_sched_get_priority_max
-160    i386    sched_get_priority_min  sys_sched_get_priority_min
-161    i386    sched_rr_get_interval   sys_sched_rr_get_interval       compat_sys_sched_rr_get_interval
-162    i386    nanosleep               sys_nanosleep                   compat_sys_nanosleep
-163    i386    mremap                  sys_mremap
-164    i386    setresuid               sys_setresuid16
-165    i386    getresuid               sys_getresuid16
+159    i386    sched_get_priority_max  sys_sched_get_priority_max      __sys_ia32_sched_get_priority_max
+160    i386    sched_get_priority_min  sys_sched_get_priority_min      __sys_ia32_sched_get_priority_min
+161    i386    sched_rr_get_interval   sys_sched_rr_get_interval       __compat_sys_ia32_sched_rr_get_interval
+162    i386    nanosleep               sys_nanosleep                   __compat_sys_ia32_nanosleep
+163    i386    mremap                  sys_mremap                      __sys_ia32_mremap
+164    i386    setresuid               sys_setresuid16                 __sys_ia32_setresuid16
+165    i386    getresuid               sys_getresuid16                 __sys_ia32_getresuid16
 166    i386    vm86                    sys_vm86                        sys_ni_syscall
 167    i386    query_module
-168    i386    poll                    sys_poll
+168    i386    poll                    sys_poll                        __sys_ia32_poll
 169    i386    nfsservctl
-170    i386    setresgid               sys_setresgid16
-171    i386    getresgid               sys_getresgid16
-172    i386    prctl                   sys_prctl
+170    i386    setresgid               sys_setresgid16                 __sys_ia32_setresgid16
+171    i386    getresgid               sys_getresgid16                 __sys_ia32_getresgid16
+172    i386    prctl                   sys_prctl                       __sys_ia32_prctl
 173    i386    rt_sigreturn            sys_rt_sigreturn                sys32_rt_sigreturn
-174    i386    rt_sigaction            sys_rt_sigaction                compat_sys_rt_sigaction
-175    i386    rt_sigprocmask          sys_rt_sigprocmask
-176    i386    rt_sigpending           sys_rt_sigpending               compat_sys_rt_sigpending
-177    i386    rt_sigtimedwait         sys_rt_sigtimedwait             compat_sys_rt_sigtimedwait
-178    i386    rt_sigqueueinfo         sys_rt_sigqueueinfo             compat_sys_rt_sigqueueinfo
-179    i386    rt_sigsuspend           sys_rt_sigsuspend
-180    i386    pread64                 sys_pread64                     compat_sys_x86_pread
-181    i386    pwrite64                sys_pwrite64                    compat_sys_x86_pwrite
-182    i386    chown                   sys_chown16
-183    i386    getcwd                  sys_getcwd
-184    i386    capget                  sys_capget
-185    i386    capset                  sys_capset
-186    i386    sigaltstack             sys_sigaltstack                 compat_sys_sigaltstack
-187    i386    sendfile                sys_sendfile                    compat_sys_sendfile
+174    i386    rt_sigaction            sys_rt_sigaction                __compat_sys_ia32_rt_sigaction
+175    i386    rt_sigprocmask          sys_rt_sigprocmask              __sys_ia32_rt_sigprocmask
+176    i386    rt_sigpending           sys_rt_sigpending               __compat_sys_ia32_rt_sigpending
+177    i386    rt_sigtimedwait         sys_rt_sigtimedwait             __compat_sys_ia32_rt_sigtimedwait
+178    i386    rt_sigqueueinfo         sys_rt_sigqueueinfo             __compat_sys_ia32_rt_sigqueueinfo
+179    i386    rt_sigsuspend           sys_rt_sigsuspend               __sys_ia32_rt_sigsuspend
+180    i386    pread64                 sys_pread64                     __compat_sys_ia32_x86_pread
+181    i386    pwrite64                sys_pwrite64                    __compat_sys_ia32_x86_pwrite
+182    i386    chown                   sys_chown16                     __sys_ia32_chown16
+183    i386    getcwd                  sys_getcwd                      __sys_ia32_getcwd
+184    i386    capget                  sys_capget                      __sys_ia32_capget
+185    i386    capset                  sys_capset                      __sys_ia32_capset
+186    i386    sigaltstack             sys_sigaltstack                 __compat_sys_ia32_sigaltstack
+187    i386    sendfile                sys_sendfile                    __compat_sys_ia32_sendfile
 188    i386    getpmsg
 189    i386    putpmsg
 190    i386    vfork                   sys_vfork
-191    i386    ugetrlimit              sys_getrlimit                   compat_sys_getrlimit
-192    i386    mmap2                   sys_mmap_pgoff
-193    i386    truncate64              sys_truncate64                  compat_sys_x86_truncate64
-194    i386    ftruncate64             sys_ftruncate64                 compat_sys_x86_ftruncate64
-195    i386    stat64                  sys_stat64                      compat_sys_x86_stat64
-196    i386    lstat64                 sys_lstat64                     compat_sys_x86_lstat64
-197    i386    fstat64                 sys_fstat64                     compat_sys_x86_fstat64
-198    i386    lchown32                sys_lchown
+191    i386    ugetrlimit              sys_getrlimit                   __compat_sys_ia32_getrlimit
+192    i386    mmap2                   sys_mmap_pgoff                  __sys_ia32_mmap_pgoff
+193    i386    truncate64              sys_truncate64                  __compat_sys_ia32_x86_truncate64
+194    i386    ftruncate64             sys_ftruncate64                 __compat_sys_ia32_x86_ftruncate64
+195    i386    stat64                  sys_stat64                      __compat_sys_ia32_x86_stat64
+196    i386    lstat64                 sys_lstat64                     __compat_sys_ia32_x86_lstat64
+197    i386    fstat64                 sys_fstat64                     __compat_sys_ia32_x86_fstat64
+198    i386    lchown32                sys_lchown                      __sys_ia32_lchown
 199    i386    getuid32                sys_getuid
 200    i386    getgid32                sys_getgid
 201    i386    geteuid32               sys_geteuid
 202    i386    getegid32               sys_getegid
-203    i386    setreuid32              sys_setreuid
-204    i386    setregid32              sys_setregid
-205    i386    getgroups32             sys_getgroups
-206    i386    setgroups32             sys_setgroups
-207    i386    fchown32                sys_fchown
-208    i386    setresuid32             sys_setresuid
-209    i386    getresuid32             sys_getresuid
-210    i386    setresgid32             sys_setresgid
-211    i386    getresgid32             sys_getresgid
-212    i386    chown32                 sys_chown
-213    i386    setuid32                sys_setuid
-214    i386    setgid32                sys_setgid
-215    i386    setfsuid32              sys_setfsuid
-216    i386    setfsgid32              sys_setfsgid
-217    i386    pivot_root              sys_pivot_root
-218    i386    mincore                 sys_mincore
-219    i386    madvise                 sys_madvise
-220    i386    getdents64              sys_getdents64
-221    i386    fcntl64                 sys_fcntl64                     compat_sys_fcntl64
+203    i386    setreuid32              sys_setreuid                    __sys_ia32_setreuid
+204    i386    setregid32              sys_setregid                    __sys_ia32_setregid
+205    i386    getgroups32             sys_getgroups                   __sys_ia32_getgroups
+206    i386    setgroups32             sys_setgroups                   __sys_ia32_setgroups
+207    i386    fchown32                sys_fchown                      __sys_ia32_fchown
+208    i386    setresuid32             sys_setresuid                   __sys_ia32_setresuid
+209    i386    getresuid32             sys_getresuid                   __sys_ia32_getresuid
+210    i386    setresgid32             sys_setresgid                   __sys_ia32_setresgid
+211    i386    getresgid32             sys_getresgid                   __sys_ia32_getresgid
+212    i386    chown32                 sys_chown                       __sys_ia32_chown
+213    i386    setuid32                sys_setuid                      __sys_ia32_setuid
+214    i386    setgid32                sys_setgid                      __sys_ia32_setgid
+215    i386    setfsuid32              sys_setfsuid                    __sys_ia32_setfsuid
+216    i386    setfsgid32              sys_setfsgid                    __sys_ia32_setfsgid
+217    i386    pivot_root              sys_pivot_root                  __sys_ia32_pivot_root
+218    i386    mincore                 sys_mincore                     __sys_ia32_mincore
+219    i386    madvise                 sys_madvise                     __sys_ia32_madvise
+220    i386    getdents64              sys_getdents64                  __sys_ia32_getdents64
+221    i386    fcntl64                 sys_fcntl64                     __compat_sys_ia32_fcntl64
 # 222 is unused
 # 223 is unused
 224    i386    gettid                  sys_gettid
-225    i386    readahead               sys_readahead                   compat_sys_x86_readahead
-226    i386    setxattr                sys_setxattr
-227    i386    lsetxattr               sys_lsetxattr
-228    i386    fsetxattr               sys_fsetxattr
-229    i386    getxattr                sys_getxattr
-230    i386    lgetxattr               sys_lgetxattr
-231    i386    fgetxattr               sys_fgetxattr
-232    i386    listxattr               sys_listxattr
-233    i386    llistxattr              sys_llistxattr
-234    i386    flistxattr              sys_flistxattr
-235    i386    removexattr             sys_removexattr
-236    i386    lremovexattr            sys_lremovexattr
-237    i386    fremovexattr            sys_fremovexattr
-238    i386    tkill                   sys_tkill
-239    i386    sendfile64              sys_sendfile64
-240    i386    futex                   sys_futex                       compat_sys_futex
-241    i386    sched_setaffinity       sys_sched_setaffinity           compat_sys_sched_setaffinity
-242    i386    sched_getaffinity       sys_sched_getaffinity           compat_sys_sched_getaffinity
-243    i386    set_thread_area         sys_set_thread_area
-244    i386    get_thread_area         sys_get_thread_area
-245    i386    io_setup                sys_io_setup                    compat_sys_io_setup
-246    i386    io_destroy              sys_io_destroy
-247    i386    io_getevents            sys_io_getevents                compat_sys_io_getevents
-248    i386    io_submit               sys_io_submit                   compat_sys_io_submit
-249    i386    io_cancel               sys_io_cancel
-250    i386    fadvise64               sys_fadvise64                   compat_sys_x86_fadvise64
+225    i386    readahead               sys_readahead                   __compat_sys_ia32_x86_readahead
+226    i386    setxattr                sys_setxattr                    __sys_ia32_setxattr
+227    i386    lsetxattr               sys_lsetxattr                   __sys_ia32_lsetxattr
+228    i386    fsetxattr               sys_fsetxattr                   __sys_ia32_fsetxattr
+229    i386    getxattr                sys_getxattr                    __sys_ia32_getxattr
+230    i386    lgetxattr               sys_lgetxattr                   __sys_ia32_lgetxattr
+231    i386    fgetxattr               sys_fgetxattr                   __sys_ia32_fgetxattr
+232    i386    listxattr               sys_listxattr                   __sys_ia32_listxattr
+233    i386    llistxattr              sys_llistxattr                  __sys_ia32_llistxattr
+234    i386    flistxattr              sys_flistxattr                  __sys_ia32_flistxattr
+235    i386    removexattr             sys_removexattr                 __sys_ia32_removexattr
+236    i386    lremovexattr            sys_lremovexattr                __sys_ia32_lremovexattr
+237    i386    fremovexattr            sys_fremovexattr                __sys_ia32_fremovexattr
+238    i386    tkill                   sys_tkill                       __sys_ia32_tkill
+239    i386    sendfile64              sys_sendfile64                  __sys_ia32_sendfile64
+240    i386    futex                   sys_futex                       __compat_sys_ia32_futex
+241    i386    sched_setaffinity       sys_sched_setaffinity           __compat_sys_ia32_sched_setaffinity
+242    i386    sched_getaffinity       sys_sched_getaffinity           __compat_sys_ia32_sched_getaffinity
+243    i386    set_thread_area         sys_set_thread_area             __sys_ia32_set_thread_area
+244    i386    get_thread_area         sys_get_thread_area             __sys_ia32_get_thread_area
+245    i386    io_setup                sys_io_setup                    __compat_sys_ia32_io_setup
+246    i386    io_destroy              sys_io_destroy                  __sys_ia32_io_destroy
+247    i386    io_getevents            sys_io_getevents                __compat_sys_ia32_io_getevents
+248    i386    io_submit               sys_io_submit                   __compat_sys_ia32_io_submit
+249    i386    io_cancel               sys_io_cancel                   __sys_ia32_io_cancel
+250    i386    fadvise64               sys_fadvise64                   __compat_sys_ia32_x86_fadvise64
 # 251 is available for reuse (was briefly sys_set_zone_reclaim)
-252    i386    exit_group              sys_exit_group
-253    i386    lookup_dcookie          sys_lookup_dcookie              compat_sys_lookup_dcookie
-254    i386    epoll_create            sys_epoll_create
-255    i386    epoll_ctl               sys_epoll_ctl
-256    i386    epoll_wait              sys_epoll_wait
-257    i386    remap_file_pages        sys_remap_file_pages
-258    i386    set_tid_address         sys_set_tid_address
-259    i386    timer_create            sys_timer_create                compat_sys_timer_create
-260    i386    timer_settime           sys_timer_settime               compat_sys_timer_settime
-261    i386    timer_gettime           sys_timer_gettime               compat_sys_timer_gettime
-262    i386    timer_getoverrun        sys_timer_getoverrun
-263    i386    timer_delete            sys_timer_delete
-264    i386    clock_settime           sys_clock_settime               compat_sys_clock_settime
-265    i386    clock_gettime           sys_clock_gettime               compat_sys_clock_gettime
-266    i386    clock_getres            sys_clock_getres                compat_sys_clock_getres
-267    i386    clock_nanosleep         sys_clock_nanosleep             compat_sys_clock_nanosleep
-268    i386    statfs64                sys_statfs64                    compat_sys_statfs64
-269    i386    fstatfs64               sys_fstatfs64                   compat_sys_fstatfs64
-270    i386    tgkill                  sys_tgkill
-271    i386    utimes                  sys_utimes                      compat_sys_utimes
-272    i386    fadvise64_64            sys_fadvise64_64                compat_sys_x86_fadvise64_64
+252    i386    exit_group              sys_exit_group                  __sys_ia32_exit_group
+253    i386    lookup_dcookie          sys_lookup_dcookie              __compat_sys_ia32_lookup_dcookie
+254    i386    epoll_create            sys_epoll_create                __sys_ia32_epoll_create
+255    i386    epoll_ctl               sys_epoll_ctl                   __sys_ia32_epoll_ctl
+256    i386    epoll_wait              sys_epoll_wait                  __sys_ia32_epoll_wait
+257    i386    remap_file_pages        sys_remap_file_pages            __sys_ia32_remap_file_pages
+258    i386    set_tid_address         sys_set_tid_address             __sys_ia32_set_tid_address
+259    i386    timer_create            sys_timer_create                __compat_sys_ia32_timer_create
+260    i386    timer_settime           sys_timer_settime               __compat_sys_ia32_timer_settime
+261    i386    timer_gettime           sys_timer_gettime               __compat_sys_ia32_timer_gettime
+262    i386    timer_getoverrun        sys_timer_getoverrun            __sys_ia32_timer_getoverrun
+263    i386    timer_delete            sys_timer_delete                __sys_ia32_timer_delete
+264    i386    clock_settime           sys_clock_settime               __compat_sys_ia32_clock_settime
+265    i386    clock_gettime           sys_clock_gettime               __compat_sys_ia32_clock_gettime
+266    i386    clock_getres            sys_clock_getres                __compat_sys_ia32_clock_getres
+267    i386    clock_nanosleep         sys_clock_nanosleep             __compat_sys_ia32_clock_nanosleep
+268    i386    statfs64                sys_statfs64                    __compat_sys_ia32_statfs64
+269    i386    fstatfs64               sys_fstatfs64                   __compat_sys_ia32_fstatfs64
+270    i386    tgkill                  sys_tgkill                      __sys_ia32_tgkill
+271    i386    utimes                  sys_utimes                      __compat_sys_ia32_utimes
+272    i386    fadvise64_64            sys_fadvise64_64                __compat_sys_ia32_x86_fadvise64_64
 273    i386    vserver
-274    i386    mbind                   sys_mbind
-275    i386    get_mempolicy           sys_get_mempolicy               compat_sys_get_mempolicy
-276    i386    set_mempolicy           sys_set_mempolicy
-277    i386    mq_open                 sys_mq_open                     compat_sys_mq_open
-278    i386    mq_unlink               sys_mq_unlink
-279    i386    mq_timedsend            sys_mq_timedsend                compat_sys_mq_timedsend
-280    i386    mq_timedreceive         sys_mq_timedreceive             compat_sys_mq_timedreceive
-281    i386    mq_notify               sys_mq_notify                   compat_sys_mq_notify
-282    i386    mq_getsetattr           sys_mq_getsetattr               compat_sys_mq_getsetattr
-283    i386    kexec_load              sys_kexec_load                  compat_sys_kexec_load
-284    i386    waitid                  sys_waitid                      compat_sys_waitid
+274    i386    mbind                   sys_mbind                       __sys_ia32_mbind
+275    i386    get_mempolicy           sys_get_mempolicy               __compat_sys_ia32_get_mempolicy
+276    i386    set_mempolicy           sys_set_mempolicy               __sys_ia32_set_mempolicy
+277    i386    mq_open                 sys_mq_open                     __compat_sys_ia32_mq_open
+278    i386    mq_unlink               sys_mq_unlink                   __sys_ia32_mq_unlink
+279    i386    mq_timedsend            sys_mq_timedsend                __compat_sys_ia32_mq_timedsend
+280    i386    mq_timedreceive         sys_mq_timedreceive             __compat_sys_ia32_mq_timedreceive
+281    i386    mq_notify               sys_mq_notify                   __compat_sys_ia32_mq_notify
+282    i386    mq_getsetattr           sys_mq_getsetattr               __compat_sys_ia32_mq_getsetattr
+283    i386    kexec_load              sys_kexec_load                  __compat_sys_ia32_kexec_load
+284    i386    waitid                  sys_waitid                      __compat_sys_ia32_waitid
 # 285 sys_setaltroot
-286    i386    add_key                 sys_add_key
-287    i386    request_key             sys_request_key
-288    i386    keyctl                  sys_keyctl                      compat_sys_keyctl
-289    i386    ioprio_set              sys_ioprio_set
-290    i386    ioprio_get              sys_ioprio_get
+286    i386    add_key                 sys_add_key                     __sys_ia32_add_key
+287    i386    request_key             sys_request_key                 __sys_ia32_request_key
+288    i386    keyctl                  sys_keyctl                      __compat_sys_ia32_keyctl
+289    i386    ioprio_set              sys_ioprio_set                  __sys_ia32_ioprio_set
+290    i386    ioprio_get              sys_ioprio_get                  __sys_ia32_ioprio_get
 291    i386    inotify_init            sys_inotify_init
-292    i386    inotify_add_watch       sys_inotify_add_watch
-293    i386    inotify_rm_watch        sys_inotify_rm_watch
-294    i386    migrate_pages           sys_migrate_pages
-295    i386    openat                  sys_openat                      compat_sys_openat
-296    i386    mkdirat                 sys_mkdirat
-297    i386    mknodat                 sys_mknodat
-298    i386    fchownat                sys_fchownat
-299    i386    futimesat               sys_futimesat                   compat_sys_futimesat
-300    i386    fstatat64               sys_fstatat64                   compat_sys_x86_fstatat
-301    i386    unlinkat                sys_unlinkat
-302    i386    renameat                sys_renameat
-303    i386    linkat                  sys_linkat
-304    i386    symlinkat               sys_symlinkat
-305    i386    readlinkat              sys_readlinkat
-306    i386    fchmodat                sys_fchmodat
-307    i386    faccessat               sys_faccessat
-308    i386    pselect6                sys_pselect6                    compat_sys_pselect6
-309    i386    ppoll                   sys_ppoll                       compat_sys_ppoll
-310    i386    unshare                 sys_unshare
-311    i386    set_robust_list         sys_set_robust_list             compat_sys_set_robust_list
-312    i386    get_robust_list         sys_get_robust_list             compat_sys_get_robust_list
-313    i386    splice                  sys_splice
-314    i386    sync_file_range         sys_sync_file_range             compat_sys_x86_sync_file_range
-315    i386    tee                     sys_tee
-316    i386    vmsplice                sys_vmsplice                    compat_sys_vmsplice
-317    i386    move_pages              sys_move_pages                  compat_sys_move_pages
-318    i386    getcpu                  sys_getcpu
-319    i386    epoll_pwait             sys_epoll_pwait
-320    i386    utimensat               sys_utimensat                   compat_sys_utimensat
-321    i386    signalfd                sys_signalfd                    compat_sys_signalfd
-322    i386    timerfd_create          sys_timerfd_create
-323    i386    eventfd                 sys_eventfd
-324    i386    fallocate               sys_fallocate                   compat_sys_x86_fallocate
-325    i386    timerfd_settime         sys_timerfd_settime             compat_sys_timerfd_settime
-326    i386    timerfd_gettime         sys_timerfd_gettime             compat_sys_timerfd_gettime
-327    i386    signalfd4               sys_signalfd4                   compat_sys_signalfd4
-328    i386    eventfd2                sys_eventfd2
-329    i386    epoll_create1           sys_epoll_create1
-330    i386    dup3                    sys_dup3
-331    i386    pipe2                   sys_pipe2
-332    i386    inotify_init1           sys_inotify_init1
-333    i386    preadv                  sys_preadv                      compat_sys_preadv
-334    i386    pwritev                 sys_pwritev                     compat_sys_pwritev
-335    i386    rt_tgsigqueueinfo       sys_rt_tgsigqueueinfo           compat_sys_rt_tgsigqueueinfo
-336    i386    perf_event_open         sys_perf_event_open
-337    i386    recvmmsg                sys_recvmmsg                    compat_sys_recvmmsg
-338    i386    fanotify_init           sys_fanotify_init
-339    i386    fanotify_mark           sys_fanotify_mark               compat_sys_fanotify_mark
-340    i386    prlimit64               sys_prlimit64
-341    i386    name_to_handle_at       sys_name_to_handle_at
-342    i386    open_by_handle_at       sys_open_by_handle_at           compat_sys_open_by_handle_at
-343    i386    clock_adjtime           sys_clock_adjtime               compat_sys_clock_adjtime
-344    i386    syncfs                  sys_syncfs
-345    i386    sendmmsg                sys_sendmmsg                    compat_sys_sendmmsg
-346    i386    setns                   sys_setns
-347    i386    process_vm_readv        sys_process_vm_readv            compat_sys_process_vm_readv
-348    i386    process_vm_writev       sys_process_vm_writev           compat_sys_process_vm_writev
-349    i386    kcmp                    sys_kcmp
-350    i386    finit_module            sys_finit_module
-351    i386    sched_setattr           sys_sched_setattr
-352    i386    sched_getattr           sys_sched_getattr
-353    i386    renameat2               sys_renameat2
-354    i386    seccomp                 sys_seccomp
-355    i386    getrandom               sys_getrandom
-356    i386    memfd_create            sys_memfd_create
-357    i386    bpf                     sys_bpf
-358    i386    execveat                sys_execveat                    compat_sys_execveat
-359    i386    socket                  sys_socket
-360    i386    socketpair              sys_socketpair
-361    i386    bind                    sys_bind
-362    i386    connect                 sys_connect
-363    i386    listen                  sys_listen
-364    i386    accept4                 sys_accept4
-365    i386    getsockopt              sys_getsockopt                  compat_sys_getsockopt
-366    i386    setsockopt              sys_setsockopt                  compat_sys_setsockopt
-367    i386    getsockname             sys_getsockname
-368    i386    getpeername             sys_getpeername
-369    i386    sendto                  sys_sendto
-370    i386    sendmsg                 sys_sendmsg                     compat_sys_sendmsg
-371    i386    recvfrom                sys_recvfrom                    compat_sys_recvfrom
-372    i386    recvmsg                 sys_recvmsg                     compat_sys_recvmsg
-373    i386    shutdown                sys_shutdown
-374    i386    userfaultfd             sys_userfaultfd
-375    i386    membarrier              sys_membarrier
-376    i386    mlock2                  sys_mlock2
-377    i386    copy_file_range         sys_copy_file_range
-378    i386    preadv2                 sys_preadv2                     compat_sys_preadv2
-379    i386    pwritev2                sys_pwritev2                    compat_sys_pwritev2
-380    i386    pkey_mprotect           sys_pkey_mprotect
-381    i386    pkey_alloc              sys_pkey_alloc
-382    i386    pkey_free               sys_pkey_free
-383    i386    statx                   sys_statx
-384    i386    arch_prctl              sys_arch_prctl                  compat_sys_arch_prctl
+292    i386    inotify_add_watch       sys_inotify_add_watch           __sys_ia32_inotify_add_watch
+293    i386    inotify_rm_watch        sys_inotify_rm_watch            __sys_ia32_inotify_rm_watch
+294    i386    migrate_pages           sys_migrate_pages               __sys_ia32_migrate_pages
+295    i386    openat                  sys_openat                      __compat_sys_ia32_openat
+296    i386    mkdirat                 sys_mkdirat                     __sys_ia32_mkdirat
+297    i386    mknodat                 sys_mknodat                     __sys_ia32_mknodat
+298    i386    fchownat                sys_fchownat                    __sys_ia32_fchownat
+299    i386    futimesat               sys_futimesat                   __compat_sys_ia32_futimesat
+300    i386    fstatat64               sys_fstatat64                   __compat_sys_ia32_x86_fstatat
+301    i386    unlinkat                sys_unlinkat                    __sys_ia32_unlinkat
+302    i386    renameat                sys_renameat                    __sys_ia32_renameat
+303    i386    linkat                  sys_linkat                      __sys_ia32_linkat
+304    i386    symlinkat               sys_symlinkat                   __sys_ia32_symlinkat
+305    i386    readlinkat              sys_readlinkat                  __sys_ia32_readlinkat
+306    i386    fchmodat                sys_fchmodat                    __sys_ia32_fchmodat
+307    i386    faccessat               sys_faccessat                   __sys_ia32_faccessat
+308    i386    pselect6                sys_pselect6                    __compat_sys_ia32_pselect6
+309    i386    ppoll                   sys_ppoll                       __compat_sys_ia32_ppoll
+310    i386    unshare                 sys_unshare                     __sys_ia32_unshare
+311    i386    set_robust_list         sys_set_robust_list             __compat_sys_ia32_set_robust_list
+312    i386    get_robust_list         sys_get_robust_list             __compat_sys_ia32_get_robust_list
+313    i386    splice                  sys_splice                      __sys_ia32_splice
+314    i386    sync_file_range         sys_sync_file_range             __compat_sys_ia32_x86_sync_file_range
+315    i386    tee                     sys_tee                         __sys_ia32_tee
+316    i386    vmsplice                sys_vmsplice                    __compat_sys_ia32_vmsplice
+317    i386    move_pages              sys_move_pages                  __compat_sys_ia32_move_pages
+318    i386    getcpu                  sys_getcpu                      __sys_ia32_getcpu
+319    i386    epoll_pwait             sys_epoll_pwait                 __sys_ia32_epoll_pwait
+320    i386    utimensat               sys_utimensat                   __compat_sys_ia32_utimensat
+321    i386    signalfd                sys_signalfd                    __compat_sys_ia32_signalfd
+322    i386    timerfd_create          sys_timerfd_create              __sys_ia32_timerfd_create
+323    i386    eventfd                 sys_eventfd                     __sys_ia32_eventfd
+324    i386    fallocate               sys_fallocate                   __compat_sys_ia32_x86_fallocate
+325    i386    timerfd_settime         sys_timerfd_settime             __compat_sys_ia32_timerfd_settime
+326    i386    timerfd_gettime         sys_timerfd_gettime             __compat_sys_ia32_timerfd_gettime
+327    i386    signalfd4               sys_signalfd4                   __compat_sys_ia32_signalfd4
+328    i386    eventfd2                sys_eventfd2                    __sys_ia32_eventfd2
+329    i386    epoll_create1           sys_epoll_create1               __sys_ia32_epoll_create1
+330    i386    dup3                    sys_dup3                        __sys_ia32_dup3
+331    i386    pipe2                   sys_pipe2                       __sys_ia32_pipe2
+332    i386    inotify_init1           sys_inotify_init1               __sys_ia32_inotify_init1
+333    i386    preadv                  sys_preadv                      __compat_sys_ia32_preadv
+334    i386    pwritev                 sys_pwritev                     __compat_sys_ia32_pwritev
+335    i386    rt_tgsigqueueinfo       sys_rt_tgsigqueueinfo           __compat_sys_ia32_rt_tgsigqueueinfo
+336    i386    perf_event_open         sys_perf_event_open             __sys_ia32_perf_event_open
+337    i386    recvmmsg                sys_recvmmsg                    __compat_sys_ia32_recvmmsg
+338    i386    fanotify_init           sys_fanotify_init               __sys_ia32_fanotify_init
+339    i386    fanotify_mark           sys_fanotify_mark               __compat_sys_ia32_fanotify_mark
+340    i386    prlimit64               sys_prlimit64                   __sys_ia32_prlimit64
+341    i386    name_to_handle_at       sys_name_to_handle_at           __sys_ia32_name_to_handle_at
+342    i386    open_by_handle_at       sys_open_by_handle_at           __compat_sys_ia32_open_by_handle_at
+343    i386    clock_adjtime           sys_clock_adjtime               __compat_sys_ia32_clock_adjtime
+344    i386    syncfs                  sys_syncfs                      __sys_ia32_syncfs
+345    i386    sendmmsg                sys_sendmmsg                    __compat_sys_ia32_sendmmsg
+346    i386    setns                   sys_setns                       __sys_ia32_setns
+347    i386    process_vm_readv        sys_process_vm_readv            __compat_sys_ia32_process_vm_readv
+348    i386    process_vm_writev       sys_process_vm_writev           __compat_sys_ia32_process_vm_writev
+349    i386    kcmp                    sys_kcmp                        __sys_ia32_kcmp
+350    i386    finit_module            sys_finit_module                __sys_ia32_finit_module
+351    i386    sched_setattr           sys_sched_setattr               __sys_ia32_sched_setattr
+352    i386    sched_getattr           sys_sched_getattr               __sys_ia32_sched_getattr
+353    i386    renameat2               sys_renameat2                   __sys_ia32_renameat2
+354    i386    seccomp                 sys_seccomp                     __sys_ia32_seccomp
+355    i386    getrandom               sys_getrandom                   __sys_ia32_getrandom
+356    i386    memfd_create            sys_memfd_create                __sys_ia32_memfd_create
+357    i386    bpf                     sys_bpf                         __sys_ia32_bpf
+358    i386    execveat                sys_execveat                    __compat_sys_ia32_execveat
+359    i386    socket                  sys_socket                      __sys_ia32_socket
+360    i386    socketpair              sys_socketpair                  __sys_ia32_socketpair
+361    i386    bind                    sys_bind                        __sys_ia32_bind
+362    i386    connect                 sys_connect                     __sys_ia32_connect
+363    i386    listen                  sys_listen                      __sys_ia32_listen
+364    i386    accept4                 sys_accept4                     __sys_ia32_accept4
+365    i386    getsockopt              sys_getsockopt                  __compat_sys_ia32_getsockopt
+366    i386    setsockopt              sys_setsockopt                  __compat_sys_ia32_setsockopt
+367    i386    getsockname             sys_getsockname                 __sys_ia32_getsockname
+368    i386    getpeername             sys_getpeername                 __sys_ia32_getpeername
+369    i386    sendto                  sys_sendto                      __sys_ia32_sendto
+370    i386    sendmsg                 sys_sendmsg                     __compat_sys_ia32_sendmsg
+371    i386    recvfrom                sys_recvfrom                    __compat_sys_ia32_recvfrom
+372    i386    recvmsg                 sys_recvmsg                     __compat_sys_ia32_recvmsg
+373    i386    shutdown                sys_shutdown                    __sys_ia32_shutdown
+374    i386    userfaultfd             sys_userfaultfd                 __sys_ia32_userfaultfd
+375    i386    membarrier              sys_membarrier                  __sys_ia32_membarrier
+376    i386    mlock2                  sys_mlock2                      __sys_ia32_mlock2
+377    i386    copy_file_range         sys_copy_file_range             __sys_ia32_copy_file_range
+378    i386    preadv2                 sys_preadv2                     __compat_sys_ia32_preadv2
+379    i386    pwritev2                sys_pwritev2                    __compat_sys_ia32_pwritev2
+380    i386    pkey_mprotect           sys_pkey_mprotect               __sys_ia32_pkey_mprotect
+381    i386    pkey_alloc              sys_pkey_alloc                  __sys_ia32_pkey_alloc
+382    i386    pkey_free               sys_pkey_free                   __sys_ia32_pkey_free
+383    i386    statx                   sys_statx                       __sys_ia32_statx
+384    i386    arch_prctl              sys_arch_prctl                  __compat_sys_ia32_arch_prctl
index 5aef183e2f85c5f6c45e44d4e9a68c9ea62c0d74..a83c0f7f462fb235508726d7c163434bdd8d4f4f 100644 (file)
 
 #
 # x32-specific system call numbers start at 512 to avoid cache impact
-# for native 64-bit operation.
+# for native 64-bit operation. The __compat_sys_x32 stubs are created
+# on-the-fly for compat_sys_*() compatibility system calls if X86_X32
+# is defined.
 #
-512    x32     rt_sigaction            compat_sys_rt_sigaction
+512    x32     rt_sigaction            __compat_sys_x32_rt_sigaction
 513    x32     rt_sigreturn            sys32_x32_rt_sigreturn
-514    x32     ioctl                   compat_sys_ioctl
-515    x32     readv                   compat_sys_readv
-516    x32     writev                  compat_sys_writev
-517    x32     recvfrom                compat_sys_recvfrom
-518    x32     sendmsg                 compat_sys_sendmsg
-519    x32     recvmsg                 compat_sys_recvmsg
-520    x32     execve                  compat_sys_execve/ptregs
-521    x32     ptrace                  compat_sys_ptrace
-522    x32     rt_sigpending           compat_sys_rt_sigpending
-523    x32     rt_sigtimedwait         compat_sys_rt_sigtimedwait
-524    x32     rt_sigqueueinfo         compat_sys_rt_sigqueueinfo
-525    x32     sigaltstack             compat_sys_sigaltstack
-526    x32     timer_create            compat_sys_timer_create
-527    x32     mq_notify               compat_sys_mq_notify
-528    x32     kexec_load              compat_sys_kexec_load
-529    x32     waitid                  compat_sys_waitid
-530    x32     set_robust_list         compat_sys_set_robust_list
-531    x32     get_robust_list         compat_sys_get_robust_list
-532    x32     vmsplice                compat_sys_vmsplice
-533    x32     move_pages              compat_sys_move_pages
-534    x32     preadv                  compat_sys_preadv64
-535    x32     pwritev                 compat_sys_pwritev64
-536    x32     rt_tgsigqueueinfo       compat_sys_rt_tgsigqueueinfo
-537    x32     recvmmsg                compat_sys_recvmmsg
-538    x32     sendmmsg                compat_sys_sendmmsg
-539    x32     process_vm_readv        compat_sys_process_vm_readv
-540    x32     process_vm_writev       compat_sys_process_vm_writev
-541    x32     setsockopt              compat_sys_setsockopt
-542    x32     getsockopt              compat_sys_getsockopt
-543    x32     io_setup                compat_sys_io_setup
-544    x32     io_submit               compat_sys_io_submit
-545    x32     execveat                compat_sys_execveat/ptregs
-546    x32     preadv2                 compat_sys_preadv64v2
-547    x32     pwritev2                compat_sys_pwritev64v2
+514    x32     ioctl                   __compat_sys_x32_ioctl
+515    x32     readv                   __compat_sys_x32_readv
+516    x32     writev                  __compat_sys_x32_writev
+517    x32     recvfrom                __compat_sys_x32_recvfrom
+518    x32     sendmsg                 __compat_sys_x32_sendmsg
+519    x32     recvmsg                 __compat_sys_x32_recvmsg
+520    x32     execve                  __compat_sys_x32_execve/ptregs
+521    x32     ptrace                  __compat_sys_x32_ptrace
+522    x32     rt_sigpending           __compat_sys_x32_rt_sigpending
+523    x32     rt_sigtimedwait         __compat_sys_x32_rt_sigtimedwait
+524    x32     rt_sigqueueinfo         __compat_sys_x32_rt_sigqueueinfo
+525    x32     sigaltstack             __compat_sys_x32_sigaltstack
+526    x32     timer_create            __compat_sys_x32_timer_create
+527    x32     mq_notify               __compat_sys_x32_mq_notify
+528    x32     kexec_load              __compat_sys_x32_kexec_load
+529    x32     waitid                  __compat_sys_x32_waitid
+530    x32     set_robust_list         __compat_sys_x32_set_robust_list
+531    x32     get_robust_list         __compat_sys_x32_get_robust_list
+532    x32     vmsplice                __compat_sys_x32_vmsplice
+533    x32     move_pages              __compat_sys_x32_move_pages
+534    x32     preadv                  __compat_sys_x32_preadv64
+535    x32     pwritev                 __compat_sys_x32_pwritev64
+536    x32     rt_tgsigqueueinfo       __compat_sys_x32_rt_tgsigqueueinfo
+537    x32     recvmmsg                __compat_sys_x32_recvmmsg
+538    x32     sendmmsg                __compat_sys_x32_sendmmsg
+539    x32     process_vm_readv        __compat_sys_x32_process_vm_readv
+540    x32     process_vm_writev       __compat_sys_x32_process_vm_writev
+541    x32     setsockopt              __compat_sys_x32_setsockopt
+542    x32     getsockopt              __compat_sys_x32_getsockopt
+543    x32     io_setup                __compat_sys_x32_io_setup
+544    x32     io_submit               __compat_sys_x32_io_submit
+545    x32     execveat                __compat_sys_x32_execveat/ptregs
+546    x32     preadv2                 __compat_sys_x32_preadv64v2
+547    x32     pwritev2                __compat_sys_x32_pwritev64v2
index 702bdee377af312f01c735803c9986202ac97eb2..49d7e4970110833a0d977c10e2ef47bfe8718e40 100644 (file)
@@ -6,6 +6,111 @@
 #ifndef _ASM_X86_SYSCALL_WRAPPER_H
 #define _ASM_X86_SYSCALL_WRAPPER_H
 
+/* Mapping of registers to parameters for syscalls on x86-64 and x32 */
+#define SC_X86_64_REGS_TO_ARGS(x, ...)                                 \
+       __MAP(x,__SC_ARGS                                               \
+               ,,regs->di,,regs->si,,regs->dx                          \
+               ,,regs->r10,,regs->r8,,regs->r9)                        \
+
+/* Mapping of registers to parameters for syscalls on i386 */
+#define SC_IA32_REGS_TO_ARGS(x, ...)                                   \
+       __MAP(x,__SC_ARGS                                               \
+             ,,(unsigned int)regs->bx,,(unsigned int)regs->cx          \
+             ,,(unsigned int)regs->dx,,(unsigned int)regs->si          \
+             ,,(unsigned int)regs->di,,(unsigned int)regs->bp)
+
+#ifdef CONFIG_IA32_EMULATION
+/*
+ * For IA32 emulation, we need to handle "compat" syscalls *and* create
+ * additional wrappers (aptly named __sys_ia32_sys_xyzzy) which decode the
+ * ia32 regs in the proper order for shared or "common" syscalls. As some
+ * syscalls may not be implemented, we need to expand COND_SYSCALL in
+ * kernel/sys_ni.c and SYS_NI in kernel/time/posix-stubs.c to cover this
+ * case as well.
+ */
+#define COMPAT_SC_IA32_STUBx(x, name, ...)                             \
+       asmlinkage long __compat_sys_ia32##name(const struct pt_regs *regs);\
+       ALLOW_ERROR_INJECTION(__compat_sys_ia32##name, ERRNO);          \
+       asmlinkage long __compat_sys_ia32##name(const struct pt_regs *regs)\
+       {                                                               \
+               return c_SyS##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));\
+       }                                                               \
+
+#define SC_IA32_WRAPPERx(x, name, ...)                                 \
+       asmlinkage long __sys_ia32##name(const struct pt_regs *regs);   \
+       ALLOW_ERROR_INJECTION(__sys_ia32##name, ERRNO);                 \
+       asmlinkage long __sys_ia32##name(const struct pt_regs *regs)    \
+       {                                                               \
+               return SyS##name(SC_IA32_REGS_TO_ARGS(x,__VA_ARGS__));  \
+       }
+
+#define COND_SYSCALL(name)                                             \
+       cond_syscall(sys_##name);                                       \
+       cond_syscall(__sys_ia32_##name)
+
+#define SYS_NI(name)                                                   \
+       SYSCALL_ALIAS(sys_##name, sys_ni_posix_timers);                 \
+       SYSCALL_ALIAS(__sys_ia32_##name, sys_ni_posix_timers)
+
+#else /* CONFIG_IA32_EMULATION */
+#define COMPAT_SC_IA32_STUBx(x, name, ...)
+#define SC_IA32_WRAPPERx(x, fullname, name, ...)
+#endif /* CONFIG_IA32_EMULATION */
+
+
+#ifdef CONFIG_X86_X32
+/*
+ * For the x32 ABI, we need to create a stub for compat_sys_*() which is aware
+ * of the x86-64-style parameter ordering of x32 syscalls. The syscalls common
+ * with x86_64 obviously do not need such care.
+ */
+#define COMPAT_SC_X32_STUBx(x, name, ...)                              \
+       asmlinkage long __compat_sys_x32##name(const struct pt_regs *regs);\
+       ALLOW_ERROR_INJECTION(__compat_sys_x32##name, ERRNO);           \
+       asmlinkage long __compat_sys_x32##name(const struct pt_regs *regs)\
+       {                                                               \
+               return c_SyS##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\
+       }                                                               \
+
+#else /* CONFIG_X86_X32 */
+#define COMPAT_SC_X32_STUBx(x, name, ...)
+#endif /* CONFIG_X86_X32 */
+
+
+#ifdef CONFIG_COMPAT
+/*
+ * Compat means IA32_EMULATION and/or X86_X32. As they use a different
+ * mapping of registers to parameters, we need to generate stubs for each
+ * of them. There is no need to implement COMPAT_SYSCALL_DEFINE0, as it is
+ * unused on x86.
+ */
+#define COMPAT_SYSCALL_DEFINEx(x, name, ...)                           \
+       static long c_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__));        \
+       static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));\
+       COMPAT_SC_IA32_STUBx(x, name, __VA_ARGS__)                      \
+       COMPAT_SC_X32_STUBx(x, name, __VA_ARGS__)                       \
+       static long c_SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))         \
+       {                                                               \
+               return C_SYSC##name(__MAP(x,__SC_DELOUSE,__VA_ARGS__)); \
+       }                                                               \
+       static inline long C_SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
+
+/*
+ * As some compat syscalls may not be implemented, we need to expand
+ * COND_SYSCALL_COMPAT in kernel/sys_ni.c and COMPAT_SYS_NI in
+ * kernel/time/posix-stubs.c to cover this case as well.
+ */
+#define COND_SYSCALL_COMPAT(name)                                      \
+       cond_syscall(__compat_sys_ia32_##name);                         \
+       cond_syscall(__compat_sys_x32_##name)
+
+#define COMPAT_SYS_NI(name)                                            \
+       SYSCALL_ALIAS(__compat_sys_ia32_##name, sys_ni_posix_timers);   \
+       SYSCALL_ALIAS(__compat_sys_x32_##name, sys_ni_posix_timers)
+
+#endif /* CONFIG_COMPAT */
+
+
 /*
  * Instead of the generic __SYSCALL_DEFINEx() definition, this macro takes
  * struct pt_regs *regs as the only argument of the syscall stub named
  * This approach avoids leaking random user-provided register content down
  * the call chain.
  *
+ * If IA32_EMULATION is enabled, this macro generates an additional wrapper
+ * named __sys_ia32_*() which decodes the struct pt_regs *regs according
+ * to the i386 calling convention (bx, cx, dx, si, di, bp).
+ *
  * As the generic SYSCALL_DEFINE0() macro does not decode any parameters for
  * obvious reasons, and passing struct pt_regs *regs to it in %rdi does not
- * hurt, there is no need to override it.
+ * hurt, there is no need to override it, or to define it differently for
+ * IA32_EMULATION.
  */
 #define __SYSCALL_DEFINEx(x, name, ...)                                        \
        asmlinkage long sys##name(const struct pt_regs *regs);          \
        static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
        asmlinkage long sys##name(const struct pt_regs *regs)           \
        {                                                               \
-               return SyS##name(__MAP(x,__SC_ARGS                      \
-                       ,,regs->di,,regs->si,,regs->dx                  \
-                       ,,regs->r10,,regs->r8,,regs->r9));              \
+               return SyS##name(SC_X86_64_REGS_TO_ARGS(x,__VA_ARGS__));\
        }                                                               \
+       SC_IA32_WRAPPERx(x, name, __VA_ARGS__)                          \
        static long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))           \
        {                                                               \
                long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));  \