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