Consolidate sys32_readv and sys32_writev
Subsystems (5)
A message that is not in the archive (sent off-list or not yet received): [email protected]
Arnd Bergmann
maintainerPATCH 1/4 Consolidate sys32_readv and sys32_writev
The seven implementations of this have gone out of sync and are mostly buggy. The new compat_sys_* version is based on the ppc64 implementation, which most closely resembles the code in sys_readv/sys_writev.
Tested with LTP on x86_64.
===== arch/ia64/ia32/ia32_entry.S 1.35 vs edited =====
arch/ia64/ia32/ia32_entry.S +2 -2
@@ -353,8 +353,8 @@ data8 sys32_select data8 sys_flock data8 sys32_msync - data8 sys32_readv /* 145 */ - data8 sys32_writev + data8 compat_sys_readv /* 145 */ + data8 compat_sys_writev data8 sys_getsid data8 sys_fdatasync data8 sys32_sysctl
===== arch/ia64/ia32/sys_ia32.c 1.93 vs edited =====
arch/ia64/ia32/sys_ia32.c +0 -79
85 lines not on this page · raw message
===== arch/mips/kernel/linux32.c 1.22 vs edited =====
arch/mips/kernel/linux32.c +0 -144
150 lines not on this page · raw message
===== arch/mips/kernel/scall64-n32.S 1.2 vs edited =====
arch/mips/kernel/scall64-n32.S +2 -2
@@ -128,8 +128,8 @@ PTR compat_sys_ioctl /* 6015 */ PTR sys_pread64 PTR sys_pwrite64 - PTR sys32_readv - PTR sys32_writev + PTR compat_sys_readv + PTR compat_sys_writev PTR sys_access /* 6020 */ PTR sys_pipe PTR sys32_select
===== arch/mips/kernel/scall64-o32.S 1.2 vs edited =====
arch/mips/kernel/scall64-o32.S +2 -2
@@ -400,8 +400,8 @@ sys sys32_select 5 sys sys_flock 2 sys sys_msync 3 - sys sys32_readv 3 /* 4145 */ - sys sys32_writev 3 + sys compat_sys_readv 3 /* 4145 */ + sys compat_sys_writev 3 sys sys_cacheflush 3 sys sys_cachectl 3 sys sys_sysmips 4
===== arch/parisc/kernel/sys_parisc32.c 1.24 vs edited =====
arch/parisc/kernel/sys_parisc32.c +0 -143
149 lines not on this page · raw message
===== arch/parisc/kernel/syscall_table.S 1.5 vs edited =====
arch/parisc/kernel/syscall_table.S +2 -2
@@ -236,8 +236,8 @@ ENTRY_SAME(flock) ENTRY_SAME(msync) /* struct iovec contains pointers */ - ENTRY_DIFF(readv) /* 145 */ - ENTRY_DIFF(writev) + ENTRY_COMP(readv) /* 145 */ + ENTRY_COMP(writev) ENTRY_SAME(getsid) ENTRY_SAME(fdatasync) /* struct __sysctl_args is a mess */
===== arch/ppc64/kernel/misc.S 1.74 vs edited =====
arch/ppc64/kernel/misc.S +2 -2
@@ -717,8 +717,8 @@ .llong .ppc32_select .llong .sys_flock .llong .sys_msync - .llong .sys32_readv /* 145 */ - .llong .sys32_writev + .llong .compat_sys_readv /* 145 */ + .llong .compat_sys_writev .llong .sys32_getsid .llong .sys_fdatasync .llong .sys32_sysctl
===== arch/ppc64/kernel/sys_ppc32.c 1.86 vs edited =====
arch/ppc64/kernel/sys_ppc32.c +0 -172
178 lines not on this page · raw message
===== arch/s390/kernel/compat_linux.c 1.19 vs edited =====
arch/s390/kernel/compat_linux.c +0 -138
144 lines not on this page · raw message
===== arch/s390/kernel/compat_wrapper.S 1.9 vs edited =====
arch/s390/kernel/compat_wrapper.S +8 -8
@@ -663,19 +663,19 @@ lgfr %r4,%r4 # int jg sys_msync # branch to system call - .globl sys32_readv_wrapper -sys32_readv_wrapper: + .globl compat_sys_readv_wrapper +compat_sys_readv_wrapper: lgfr %r2,%r2 # int - llgtr %r3,%r3 # const struct iovec_emu31 * + llgtr %r3,%r3 # const struct compat_iovec * llgfr %r4,%r4 # unsigned long - jg sys32_readv # branch to system call + jg compat_sys_readv # branch to system call - .globl sys32_writev_wrapper -sys32_writev_wrapper: + .globl compat_sys_writev_wrapper +compat_sys_writev_wrapper: lgfr %r2,%r2 # int - llgtr %r3,%r3 # const struct iovec_emu31 * + llgtr %r3,%r3 # const struct compat_iovec * llgfr %r4,%r4 # unsigned long - jg sys32_writev # branch to system call + jg compat_sys_writev # branch to system call .globl sys32_getsid_wrapper sys32_getsid_wrapper:
===== arch/s390/kernel/syscalls.S 1.9 vs edited =====
arch/s390/kernel/syscalls.S +2 -2
@@ -153,8 +153,8 @@ SYSCALL(sys_select,sys_select,sys32_select_wrapper) SYSCALL(sys_flock,sys_flock,sys32_flock_wrapper) SYSCALL(sys_msync,sys_msync,sys32_msync_wrapper) -SYSCALL(sys_readv,sys_readv,sys32_readv_wrapper) /* 145 */ -SYSCALL(sys_writev,sys_writev,sys32_writev_wrapper) +SYSCALL(sys_readv,sys_readv,compat_sys_readv_wrapper) /* 145 */ +SYSCALL(sys_writev,sys_writev,compat_sys_writev_wrapper) SYSCALL(sys_getsid,sys_getsid,sys32_getsid_wrapper) SYSCALL(sys_fdatasync,sys_fdatasync,sys32_fdatasync_wrapper) SYSCALL(sys_sysctl,sys_sysctl,sys32_sysctl_wrapper)
===== arch/sparc64/kernel/sys_sparc32.c 1.95 vs edited =====
arch/sparc64/kernel/sys_sparc32.c +0 -176
182 lines not on this page · raw message
===== arch/sparc64/kernel/sys_sunos32.c 1.39 vs edited =====
arch/sparc64/kernel/sys_sunos32.c +2 -5
@@ -1203,9 +1203,6 @@return ret; } -extern asmlinkage int sys32_readv(u32 fd, u32 vector, s32 count); -extern asmlinkage int sys32_writev(u32 fd, u32 vector, s32 count); - asmlinkage int sunos_read(unsigned int fd, u32 buf, u32 count) {int ret;
@@ -1218,7 +1215,7 @@ {int ret; - ret =check_nonblock (sys32_readv (fd, vector, count), fd); + ret =check_nonblock (compat_sys_readv (fd, (void *)A (vector), count), fd);return ret; }
@@ -1234,7 +1231,7 @@ {int ret; - ret =check_nonblock (sys32_writev (fd, vector, count), fd); + ret =check_nonblock (compat_sys_writev (fd, (void *)A (vector), count), fd);return ret; }
===== arch/sparc64/kernel/systbls.S 1.52 vs edited =====
arch/sparc64/kernel/systbls.S +1 -1
@@ -43,7 +43,7 @@ .word sys32_rt_sigtimedwait, sys32_rt_sigqueueinfo, sys32_rt_sigsuspend, sys_setresuid, sys_getresuid /*110*/ .word sys_setresgid, sys_getresgid, sys_setregid, sys_nis_syscall, sys_nis_syscall .word sys_getgroups, sys32_gettimeofday, compat_sys_getrusage, sys_nis_syscall, sys_getcwd -/*120*/ .word sys32_readv, sys32_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod +/*120*/ .word compat_sys_readv, compat_sys_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod .word sys_nis_syscall, sys32_setreuid16, sys32_setregid16, sys_rename, sys_truncate /*130*/ .word sys_ftruncate, sys_flock, sys_lstat64, sys_nis_syscall, sys_nis_syscall .word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_stat64
===== arch/x86_64/ia32/ia32entry.S 1.30 vs edited =====
arch/x86_64/ia32/ia32entry.S +2 -2
@@ -450,8 +450,8 @@ .quad sys32_select .quad sys_flock .quad sys_msync - .quad sys32_readv /* 145 */ - .quad sys32_writev + .quad compat_sys_readv /* 145 */ + .quad compat_sys_writev .quad sys_getsid .quad sys_fdatasync .quad sys32_sysctl /* sysctl */
===== arch/x86_64/ia32/sys_ia32.c 1.56 vs edited =====
arch/x86_64/ia32/sys_ia32.c +0 -98
104 lines not on this page · raw message
===== fs/compat.c 1.22 vs edited =====
fs/compat.c +186 -0
198 lines not on this page · raw message
===== include/linux/compat.h 1.19 vs edited =====
include/linux/compat.h +6 -0
@@ -100,5 +100,11 @@long compat_sys_shmctl (int first,int second,void __user *uptr);long compat_sys_semtimedop (int semid,struct sembuf __user *tsems,unsigned nsems,const struct compat_timespec __user *timeout); + +asmlinkage ssize_t compat_sys_readv(unsigned long fd, +const struct compat_iovec __user *vec,unsigned long vlen); +asmlinkage ssize_t compat_sys_writev(unsigned long fd, +const struct compat_iovec __user *vec,unsigned long vlen); +#endif /* CONFIG_COMPAT */ #endif /* _LINUX_COMPAT_H */
Arnd Bergmann
maintainerPATCH 2/4 Consolidate do_execve32
In reply to a message not in the archiveThe code for sys32_execve/do_execve32 in most of the seven versions was copied from fs/exec.c but not kept up-to-date. The new compat_do_execve() function is based on the mips code and has been resync'ed with do_execve().
IA64 has some special fixup code in sys32_execve, so I'm not touching that.
Tested with LTP and more 32 bit binaries on x86_64, which previously used an implementation derived from ia64. The consolidated version is larger than that but should perform better.
===== arch/mips/kernel/linux32.c 1.23 vs edited =====
arch/mips/kernel/linux32.c +3 -225
@@ -142,228 +142,6 @@ }/* -* count32() counts the number of arguments/envelopes -*/ -static int count32 (u32 * argv,int max) -{ -int i =0 ; - -if (argv !=NULL ) { -for (;;) { -u32 p;int error; - - error =get_user (p,argv); -if (error) -return error; -if (!p) -break ; - argv++; -if (++i > max) -return -E2BIG ; - } - } -return i; -} - - -/* -* 'copy_strings32()' copies argument/envelope strings from user -* memory to free pages in kernel mem. These are in a format ready -* to be put directly into the top of new user memory. -*/ -int copy_strings32 (int argc,u32 * argv,struct linux_binprm *bprm) -{ -struct page *kmapped_page =NULL ; -char *kaddr =NULL ; -int ret; - -while (argc-- >0 ) { -u32 str; -int len; -unsigned long pos; - -if (get_user (str, argv+argc) || !str || - !(len =strnlen_user ((char *)A (str), bprm->p))) { - ret = -EFAULT ; - goto out; - } - -if (bprm->p < len) { - ret = -E2BIG ; - goto out; - } - - bprm->p -= len; -/* XXX: add architecture specific overflow check here. */ - - pos = bprm->p; -while (len >0 ) { -int i, new, err; -int offset, bytes_to_copy; -struct page *page; - - offset = pos %PAGE_SIZE ; - i = pos/PAGE_SIZE ; - page = bprm->page[i]; - new =0 ; -if (!page) { - page =alloc_page (GFP_HIGHUSER ); - bprm->page[i] = page; -if (!page) { - ret = -ENOMEM ; - goto out; - } - new =1 ; - } - -if (page != kmapped_page) { -if (kmapped_page) -kunmap (kmapped_page); - kmapped_page = page; - kaddr =kmap (kmapped_page); - } -if (new && offset) -memset (kaddr,0 , offset); - bytes_to_copy =PAGE_SIZE - offset; -if (bytes_to_copy > len) { - bytes_to_copy = len; -if (new) -memset (kaddr+offset+len,0 , -PAGE_SIZE -offset-len); - } - err =copy_from_user (kaddr + offset, (char *)A (str), - bytes_to_copy); -if (err) { - ret = -EFAULT ; - goto out; - } - - pos += bytes_to_copy; - str += bytes_to_copy; - len -= bytes_to_copy; - } - } - ret =0 ; -out: -if (kmapped_page) -kunmap (kmapped_page); -return ret; -} - -#ifdef CONFIG_MMU - -#define free_arg_pages (bprm) do { } while (0) - -#else - -static inline void free_arg_pages (struct linux_binprm *bprm) -{ -int i; - -for (i =0 ; i <MAX_ARG_PAGES ; i++) { -if (bprm->page[i]) -__free_page (bprm->page[i]); - bprm->page[i] =NULL ; - } -} - -#endif /* CONFIG_MMU */ - -/* -* sys32_execve() executes a new program. -*/ -static inline int -do_execve32 (char * filename,u32 * argv,u32 * envp,struct pt_regs * regs) -{ -struct linux_binprm bprm; -struct file * file; -int retval; - -sched_balance_exec (); - - file =open_exec (filename); - - retval =PTR_ERR (file); -if (IS_ERR (file)) -return retval; - - bprm.p =PAGE_SIZE *MAX_ARG_PAGES -sizeof (void *); -memset (bprm.page,0 ,MAX_ARG_PAGES *sizeof (bprm.page[0 ])); - - bprm.file = file; - bprm.filename = filename; - bprm.interp = filename; - bprm.sh_bang =0 ; - bprm.loader =0 ; - bprm.exec =0 ; - bprm.security =NULL ; - bprm.mm =mm_alloc (); - retval = -ENOMEM ; -if (!bprm.mm) - goto out_file; - - retval =init_new_context (current, bprm.mm); -if (retval <0 ) - goto out_mm; - - bprm.argc =count32 (argv, bprm.p /sizeof (u32)); -if ((retval = bprm.argc) <0 ) - goto out_mm; - - bprm.envc =count32 (envp, bprm.p /sizeof (u32)); -if ((retval = bprm.envc) <0 ) - goto out_mm; - - retval =security_bprm_alloc (&bprm); -if (retval) - goto out; - - retval =prepare_binprm (&bprm); -if (retval <0 ) - goto out; - - retval =copy_strings_kernel (1 , &bprm.filename, &bprm); -if (retval <0 ) - goto out; - - bprm.exec = bprm.p; - retval =copy_strings32 (bprm.envc, envp, &bprm); -if (retval <0 ) - goto out; - - retval =copy_strings32 (bprm.argc, argv, &bprm); -if (retval <0 ) - goto out; - - retval =search_binary_handler (&bprm, regs); -if (retval >=0 ) { -free_arg_pages (&bprm); - -/* execve success */ -security_bprm_free (&bprm); -return retval; - } - -out: -/* Something went wrong, return the inode and free the argument pages*/ -free_arg_pages (&bprm); - -if (bprm.security) -security_bprm_free (&bprm); - -out_mm: -if (bprm.mm) -mmdrop (bprm.mm); - -out_file: -if (bprm.file) { -allow_write_access (bprm.file); -fput (bprm.file); - } -return retval; -} - -/* * sys_execve() executes a new program. */ asmlinkage int sys32_execve(nabi_no_regargs struct pt_regs regs)
@@ -371,12 +149,12 @@int error;char * filename; - filename =getname ((char *) (long )regs.regs[4 ]); + filename =getname (compat_ptr (regs.regs[4 ])); error =PTR_ERR (filename);if (IS_ERR (filename)) goto out; - error =do_execve32 (filename, (u32 *) (long )regs.regs[5 ], - (u32 *) (long )regs.regs[6 ], ®s); + error =compat_do_execve (filename,compat_ptr (regs.regs[5 ]), +compat_ptr (regs.regs[6 ]), ®s);putname (filename); out:
===== arch/parisc/kernel/sys_parisc32.c 1.25 vs edited =====
arch/parisc/kernel/sys_parisc32.c +2 -185
199 lines not on this page · raw message
===== arch/ppc64/kernel/sys_ppc32.c 1.87 vs edited =====
arch/ppc64/kernel/sys_ppc32.c +1 -186
199 lines not on this page · raw message
===== arch/s390/kernel/compat_linux.c 1.20 vs edited =====
arch/s390/kernel/compat_linux.c +3 -184
202 lines not on this page · raw message
===== arch/sparc64/kernel/sys_sparc32.c 1.96 vs edited =====
arch/sparc64/kernel/sys_sparc32.c +3 -192
213 lines not on this page · raw message
===== arch/x86_64/ia32/sys_ia32.c 1.57 vs edited =====
arch/x86_64/ia32/sys_ia32.c +15 -86
108 lines not on this page · raw message
===== fs/compat.c 1.23 vs edited =====
fs/compat.c +233 -0
236 lines not on this page · raw message
===== include/linux/compat.h 1.20 vs edited =====
include/linux/compat.h +3 -0
@@ -106,5 +106,8 @@ asmlinkage ssize_t compat_sys_writev(unsigned long fd,const struct compat_iovec __user *vec,unsigned long vlen); +int compat_do_execve (char * filename,compat_uptr_t __user *argv, +compat_uptr_t __user *envp,struct pt_regs * regs); +#endif /* CONFIG_COMPAT */ #endif /* _LINUX_COMPAT_H */
Re: [PATCH 2/4] Consolidate do_execve32
Quoted 8 lines · Arnd Bergmann
The code for sys32_execve/do_execve32 in most of the seven versions was copied from
fs/exec.cbut not kept up-to-date. The newcompat_do_execve()function is based on the mips code and has been resync'ed withdo_execve().IA64 has some special fixup code in
sys32_execve, so I'm not touching that.
Attached is a patch that takes care of ia64.
-Arun
arch/ia64/ia32/sys_ia32.c +13 -55
@@ -90,58 +90,17 @@ extern unsigned long arch_get_unmapped_a/* XXX make per-mm: */ static DECLARE_MUTEX (ia32_mmap_sem); -static int -nargs (unsigned int arg,char **ap) -{ -unsigned int addr; -int n, err; - -if (!arg) -return 0 ; - - n =0 ; -do { - err =get_user (addr, (unsigned int *)A (arg)); -if (err) -return err; -if (ap) - *ap++ = (char *)A (addr); - arg +=sizeof (unsigned int ); - n++; - }while (addr); -return n -1 ; -} -asmlinkage long -sys32_execve (char *filename,unsigned int argv,unsigned int envp, -struct pt_regs *regs) +sys32_execve (char *name,compat_uptr_t __user *argv,compat_uptr_t __user *envp,struct pt_regs *regs) { +long error; +char *filename;unsigned long old_map_base, old_task_size, tssd; -char **av, **ae; -int na, ne, len; -long r; - - na =nargs (argv,NULL ); -if (na <0 ) -return na; - ne =nargs (envp,NULL ); -if (ne <0 ) -return ne; - len = (na + ne +2 ) *sizeof (*av); - av =kmalloc (len,GFP_KERNEL ); -if (!av) -return -ENOMEM ; - - ae = av + na +1 ; - av[na] =NULL ; - ae[ne] =NULL ; - r =nargs (argv, av); -if (r <0 ) - goto out; - r =nargs (envp, ae); -if (r <0 ) - goto out; + filename =getname (name); + error =PTR_ERR (filename); +if (IS_ERR (filename)) +return error; old_map_base = current->thread.map_base; old_task_size = current->thread.task_size;
@@ -152,20 +111,19 @@ sys32_execve (char *filename, unsigned i current->thread.task_size =DEFAULT_TASK_SIZE ;ia64_set_kr (IA64_KR_IO_BASE , current->thread.old_iob);ia64_set_kr (IA64_KR_TSSD , current->thread.old_k1); + + error =compat_do_execve (filename, argv, envp, regs); +putname (filename); -set_fs (KERNEL_DS ); - r =sys_execve (filename, av, ae, regs); -if (r <0 ) { +if (error <0 ) {/* oops, execve failed, switch back to old values... */ ia64_set_kr (IA64_KR_IO_BASE ,IA32_IOBASE );ia64_set_kr (IA64_KR_TSSD , tssd); current->thread.map_base = old_map_base; current->thread.task_size = old_task_size; -set_fs (USER_DS );/* establish new task-size as the address-limit */ } - out: -kfree (av); -return r; + +return error; }int cp_compat_stat (struct kstat *stat,struct compat_stat *ubuf)
fs/compat.c +0 -2
@@ -981,7 +981,6 @@ out:return ret; } -#ifndef __ia64__/* ia64 needs some extra tweaks */ /* * compat_count() counts the number of arguments/envelopes. It is basically * a copy of count() from fs/exec.c, except that it works with 32 bit argv
@@ -1212,7 +1211,6 @@ out_file:return retval; } -#endif /* !__ia64__ */ #define __COMPAT_NFDBITS (8 * sizeof(compat_ulong_t))
Arnd Bergmann
maintainerPATCH 3/4 Consolidate sys32_select
In reply to a message not in the archivesys32_select has seven mostly but not exactly identical versions, so consolidate them as compat_sys_select. Based on the ppc64 implementation, which most closely resembles sys_select.
Passes relevant LTP test cases on x86_64.
===== arch/ia64/ia32/ia32_entry.S 1.36 vs edited =====
arch/ia64/ia32/ia32_entry.S +1 -1
@@ -350,7 +350,7 @@ data8 sys_setfsgid /* 16-bit version */ data8 sys_llseek /* 140 */ data8 sys32_getdents - data8 sys32_select + data8 compat_sys_select data8 sys_flock data8 sys32_msync data8 compat_sys_readv /* 145 */
===== arch/ia64/ia32/sys_ia32.c 1.94 vs edited =====
arch/ia64/ia32/sys_ia32.c +2 -106
120 lines not on this page · raw message
===== arch/mips/kernel/linux32.c 1.24 vs edited =====
arch/mips/kernel/linux32.c +0 -161
167 lines not on this page · raw message
===== arch/mips/kernel/scall64-n32.S 1.3 vs edited =====
arch/mips/kernel/scall64-n32.S +1 -1
@@ -132,7 +132,7 @@ PTR compat_sys_writev PTR sys_access /* 6020 */ PTR sys_pipe - PTR sys32_select + PTR compat_sys_select PTR sys_sched_yield PTR sys_mremap PTR sys_msync /* 6025 */
===== arch/mips/kernel/scall64-o32.S 1.3 vs edited =====
arch/mips/kernel/scall64-o32.S +1 -1
@@ -397,7 +397,7 @@ sys sys_setfsgid 1 sys sys32_llseek 5 /* 4140 */ sys sys32_getdents 3 - sys sys32_select 5 + sys compat_sys_select 5 sys sys_flock 2 sys sys_msync 3 sys compat_sys_readv 3 /* 4145 */
===== arch/parisc/kernel/sys_parisc32.c 1.26 vs edited =====
arch/parisc/kernel/sys_parisc32.c +0 -121
133 lines not on this page · raw message
===== arch/parisc/kernel/syscall_table.S 1.4 vs edited =====
arch/parisc/kernel/syscall_table.S +1 -1
@@ -232,7 +232,7 @@ ENTRY_DIFF(getdents) /* it is POSSIBLE that select will be OK because even though fd_set * contains longs, the macros and sizes are clever. */ - ENTRY_DIFF(select) + ENTRY_COMP(select) ENTRY_SAME(flock) ENTRY_SAME(msync) /* struct iovec contains pointers */
===== arch/ppc64/kernel/sys_ppc32.c 1.88 vs edited =====
arch/ppc64/kernel/sys_ppc32.c +4 -159
171 lines not on this page · raw message
===== arch/s390/kernel/compat_linux.c 1.21 vs edited =====
arch/s390/kernel/compat_linux.c +0 -154
160 lines not on this page · raw message
===== arch/s390/kernel/compat_wrapper.S 1.10 vs edited =====
arch/s390/kernel/compat_wrapper.S +7 -7
@@ -641,14 +641,14 @@ llgfr %r4,%r4 # unsigned int jg sys32_getdents # branch to system call - .globl sys32_select_wrapper -sys32_select_wrapper: + .globl compat_sys_select_wrapper +compat_sys_select_wrapper: lgfr %r2,%r2 # int - llgtr %r3,%r3 # fd_set * - llgtr %r4,%r4 # fd_set * - llgtr %r5,%r5 # fd_set * - llgtr %r6,%r6 # struct timeval_emu31 * - jg sys32_select # branch to system call + llgtr %r3,%r3 # compat_fd_set * + llgtr %r4,%r4 # compat_fd_set * + llgtr %r5,%r5 # compat_fd_set * + llgtr %r6,%r6 # struct compat_timeval * + jg compat_sys_select # branch to system call .globl sys32_flock_wrapper sys32_flock_wrapper:
===== arch/s390/kernel/syscalls.S 1.10 vs edited =====
arch/s390/kernel/syscalls.S +1 -1
@@ -150,7 +150,7 @@ SYSCALL(sys_setfsgid16,sys_ni_syscall,sys32_setfsgid16_wrapper) /* old setfsgid16 syscall */ SYSCALL(sys_llseek,sys_llseek,sys32_llseek_wrapper) /* 140 */ SYSCALL(sys_getdents,sys_getdents,sys32_getdents_wrapper) -SYSCALL(sys_select,sys_select,sys32_select_wrapper) +SYSCALL(sys_select,sys_select,compat_sys_select_wrapper) SYSCALL(sys_flock,sys_flock,sys32_flock_wrapper) SYSCALL(sys_msync,sys_msync,sys32_msync_wrapper) SYSCALL(sys_readv,sys_readv,compat_sys_readv_wrapper) /* 145 */
===== arch/sparc64/kernel/sys_sparc32.c 1.97 vs edited =====
arch/sparc64/kernel/sys_sparc32.c +0 -152
158 lines not on this page · raw message
===== arch/sparc64/kernel/sys_sunos32.c 1.40 vs edited =====
arch/sparc64/kernel/sys_sunos32.c +3 -6
@@ -528,18 +528,15 @@return ret; } -/* SunOS mount system call emulation */ -extern asmlinkage int -sys32_select (int n,u32 inp,u32 outp,u32 exp,u32 tvp); - asmlinkage int sunos_select(int width, u32 inp, u32 outp, u32 exp, u32 tvp_x) {int ret;/* SunOS binaries expect that select won't change the tvp contents */ - ret =sys32_select (width, inp, outp, exp, tvp_x); + ret =compat_sys_select (width,compat_ptr (inp),compat_ptr (outp), +compat_ptr (exp),compat_ptr (tvp_x));if (ret == -EINTR && tvp_x) { -struct compat_timeval *tvp = (struct compat_timeval *)A (tvp_x); +struct compat_timeval *tvp =compat_ptr (tvp_x);time_t sec, usec;__get_user (sec, &tvp->tv_sec);
===== arch/sparc64/kernel/systbls.S 1.53 vs edited =====
arch/sparc64/kernel/systbls.S +2 -2
@@ -37,7 +37,7 @@ .word sys_madvise, sys_vhangup, sys32_truncate64, sys_mincore, sys32_getgroups16 /*80*/ .word sys32_setgroups16, sys_getpgrp, sys_setgroups, compat_sys_setitimer, sys32_ftruncate64 .word sys_swapon, compat_sys_getitimer, sys_setuid, sys_sethostname, sys_setgid -/*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, sys32_select, sys_setfsgid +/*90*/ .word sys_dup2, sys_setfsuid, compat_sys_fcntl, compat_sys_select, sys_setfsgid .word sys_fsync, sys_setpriority32, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall /*100*/ .word sys_getpriority, sys32_rt_sigreturn, sys32_rt_sigaction, sys32_rt_sigprocmask, sys32_rt_sigpending .word sys32_rt_sigtimedwait, sys32_rt_sigqueueinfo, sys32_rt_sigsuspend, sys_setresuid, sys_getresuid
@@ -65,7 +65,7 @@ .word sys32_ipc, sys32_sigreturn, sys_clone, sys_nis_syscall, sys32_adjtimex /*220*/ .word compat_sys_sigprocmask, sys_ni_syscall, sys32_delete_module, sys_ni_syscall, sys_getpgid .word sys32_bdflush, sys32_sysfs, sys_nis_syscall, sys32_setfsuid16, sys32_setfsgid16 -/*230*/ .word sys32_select, sys_time, sys_nis_syscall, sys_stime, compat_statfs64 +/*230*/ .word compat_sys_select, sys_time, sys_nis_syscall, sys_stime, compat_statfs64 .word compat_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep
===== arch/x86_64/ia32/ia32entry.S 1.31 vs edited =====
arch/x86_64/ia32/ia32entry.S +1 -1
@@ -447,7 +447,7 @@ .quad sys_setfsgid16 .quad sys_llseek /* 140 */ .quad sys32_getdents - .quad sys32_select + .quad compat_sys_select .quad sys_flock .quad sys_msync .quad compat_sys_readv /* 145 */
===== arch/x86_64/ia32/sys_ia32.c 1.58 vs edited =====
arch/x86_64/ia32/sys_ia32.c +2 -103
117 lines not on this page · raw message
===== fs/compat.c 1.24 vs edited =====
fs/compat.c +187 -0
190 lines not on this page · raw message
===== include/linux/compat.h 1.21 vs edited =====
include/linux/compat.h +4 -0
@@ -109,5 +109,9 @@int compat_do_execve (char * filename,compat_uptr_t __user *argv,compat_uptr_t __user *envp,struct pt_regs * regs); +asmlinkage long compat_sys_select (int n,compat_ulong_t __user *inp, +compat_ulong_t __user *outp,compat_ulong_t __user *exp, +struct compat_timeval __user *tvp); +#endif /* CONFIG_COMPAT */ #endif /* _LINUX_COMPAT_H */
Re: [PATCH 3/4] Consolidate sys32_select
Quoted 5 lines · On Sun, 4 Apr 2004 02:22:40 +0200 Arnd Bergmann <[email protected]> wrote:
sys32_selecthas seven mostly but not exactly identical versions, so consolidate them ascompat_sys_select. Based on the ppc64 implementation, which most closely resemblessys_select.Passes relevant LTP test cases on
x86_64.
I'm a bit dubious about LTP - often their test cases are very poor and just check EFAULT behaviour. For testing it's better to just boot a 32bit distribution and make sure that at least some X desktop works. That said your patches look fine to me.
-Andi
Arnd Bergmann
maintainerRe: [PATCH 3/4] Consolidate sys32_select
Quoted 4 lines · Andi Kleen
I'm a bit dubious about LTP - often their test cases are very poor and just check EFAULT behaviour. For testing it's better to just boot a 32bit distribution and make sure that at least some X desktop works.
Right, the quality of LTP testcases varies a lot, but they tend to check the more obscure stuff that you might not hit when everything goes right.
I forgot to say that I'm running mostly 32 bit user space on my Opteron box, so the good path was probably exercised as well.
Arnd <><
Re: [PATCH 3/4] Consolidate sys32_select
Quoted 9 lines · On Sun, 4 Apr 2004 12:36:49 +0200 Arnd Bergmann <[email protected]> wrote:
Quoted 4 lines · Andi Kleen
I'm a bit dubious about LTP - often their test cases are very poor and just check EFAULT behaviour. For testing it's better to just boot a 32bit distribution and make sure that at least some X desktop works.
Right, the quality of LTP testcases varies a lot, but they tend to check the more obscure stuff that you might not hit when everything goes right.
Well, barely. The LSB test suite is a bit better, but it takes forever to run. There is also another test suite called ballista, but I never got it to run properly.
Quoted 2 lines
I forgot to say that I'm running mostly 32 bit user space on my Opteron box, so the good path was probably exercised as well.
Ok fine. I do too actually on my workstation, but I haven't booted your patches yet ;-)
-Andi
Re: [PATCH 3/4] Consolidate sys32_select
In reply to Andi KleenQuoted 4 lines · On Sun, 4 Apr 2004 02:22:40 +0200 Arnd Bergmann <[email protected]> wrote:
Quoted 4 lines
sys32_selecthas seven mostly but not exactly identical versions, so consolidate them ascompat_sys_select. Based on the ppc64 implementation, which most closely resemblessys_select. Passes relevant LTP test cases onx86_64.
Quoted 5 lines · Andi Kleen
I'm a bit dubious about LTP - often their test cases are very poor and just check EFAULT behaviour. For testing it's better to just boot a 32bit distribution and make sure that at least some X desktop works. That said your patches look fine to me.
-Andi
I can second that one; I've seen stuff that "passes LTP" but blatantly flunks rather simplistic off-the-cuff a priori sanity checks. One example that stands out is a recent patch ppl were rather foolishly trying to get my endorsement on that pandered to (ir)Rational crap code. I've also found LTP to be insufficient/useless in a number of userspace ABI compatibility tests as well, where running a different distro sufficed and full-blown LTP did not.
-- wli
Arnd Bergmann
maintainerRe: [PATCH 3/4] Consolidate sys32_select
Quoted 4 lines · William Lee Irwin III
I can second that one; I've seen stuff that "passes LTP" but blatantly flunks rather simplistic off-the-cuff a priori sanity checks. One example that stands out is a recent patch ppl were rather foolishly trying to get my endorsement on that pandered to (ir)Rational crap code.
I just found another example when I tried to open a ppp connection with my patches :(
This needs to be applied on top of the sys32_select consolidation patch to get the correct return value from select when called with nonzero timeout.
===== fs/compat.c 1.25 vs edited =====
fs/compat.c +3 -2
@@ -1377,8 +1377,9 @@ usec = timeout %HZ ; usec *= (1000000 /HZ ); } - ret =__put_user (sec, &tvp->tv_sec); - ret |=__put_user (usec, &tvp->tv_usec); +if (put_user (sec, &tvp->tv_sec) || +put_user (usec, &tvp->tv_usec)) + ret = -EFAULT ; }if (ret <0 )
Re: [PATCH 3/4] Consolidate sys32_select
fs/compat.c line 1382
Quoted 12 lines
=====
fs/compat.c1.25 vs edited =====fs/compat.c +3
-2@@ -1377,8 +1377,9 @@ usec = timeout %HZ ; usec *= (1000000 /HZ ); } - ret =__put_user (sec, &tvp->tv_sec); - ret |=__put_user (usec, &tvp->tv_usec); +if (put_user (sec, &tvp->tv_sec) || +put_user (usec, &tvp->tv_usec)) + ret = -EFAULT ;
Are you sure? They should be equivalent. __put_user returns -EFAULT on error.
-Andi
Arnd Bergmann
maintainerRe: [PATCH 3/4] Consolidate sys32_select
Quoted 7 lines · Andi Kleen
Quoted 7 lines
=====
fs/compat.c1.25 vs edited =====fs/compat.c +0
-0@@ -1377,8 +1377,9 @@ usec = timeout %HZ ; usec *= (1000000 /HZ ); }
Quoted 8 lines
fs/compat.c line 1382
Quoted 5 lines
fs/compat.c +3
-2- ret =__put_user (sec, &tvp->tv_sec); - ret |=__put_user (usec, &tvp->tv_usec); +if (put_user (sec, &tvp->tv_sec) || +put_user (usec, &tvp->tv_usec)) + ret = -EFAULT ;Are you sure? They should be equivalent.
__put_userreturns-EFAULTon error.
Yes, but if put_user succeeds, the value of ret must not be set to zero here, it already contains the number of descriptors.
Arnd <><
Re: [PATCH 3/4] Consolidate sys32_select
In reply to Arnd BergmannQuoted 6 lines · Arnd Bergmann
sys32_selecthas seven mostly but not exactly identical versions, so consolidate them ascompat_sys_select. Based on the ppc64 implementation, which most closely resemblessys_select.Passes relevant LTP test cases on
x86_64.
While your patches improved compatibility with respect to LSB/LTP, we saw the following regressions on LTP on ia64:
recv01 PASS->BROK
recvmsg01 PASS->BROK
recvfrom01 PASS->BROK
While we're looking into it, did others see this ? Is it fixed already ?
-Arun
Arnd Bergmann
maintainerRe: [PATCH 3/4] Consolidate sys32_select
Quoted 9 lines · you
While your patches improved compatibility with respect to LSB/LTP, we saw the following regressions on LTP on ia64:
recv01 PASS->BROK
recvmsg01 PASS->BROK
recvfrom01 PASS->BROKWhile we're looking into it, did others see this ? Is it fixed already ?
Did you apply the patch I sent in the followup mail? It looks like you ran into the problem. Here it is again in case you missed it.
Arnd <><
===== fs/compat.c 1.25 vs edited =====
fs/compat.c +3 -2
@@ -1377,8 +1377,9 @@ usec = timeout %HZ ; usec *= (1000000 /HZ ); } - ret =__put_user (sec, &tvp->tv_sec); - ret |=__put_user (usec, &tvp->tv_usec); +if (put_user (sec, &tvp->tv_sec) || +put_user (usec, &tvp->tv_usec)) + ret = -EFAULT ; }if (ret <0 )
Re: [PATCH 3/4] Consolidate sys32_select
Quoted 8 lines · Arnd Bergmann
Quoted 7 lines · you
While your patches improved compatibility with respect to LSB/LTP, we saw the following regressions on LTP on ia64:
recv01
PASS->BROK
recvmsg01PASS->BROK
recvfrom01PASS->BROK
Quoted 6 lines
Quoted 2 lines
While we're looking into it, did others see this ? Is it fixed already ?
Did you apply the patch I sent in the followup mail? It looks like you ran into the problem. Here it is again in case you missed it.
Yes, that fixed it. Thanks!
-Arun
Arnd Bergmann
maintainerPATCH 4/4 Consolidate sys32_nfsservctl
In reply to a message not in the archivesys32_nfsservctl is the largest remaining syscall emulation handler that can be consolidated. mips and ia64 currently don't use this at all, parisc has a simpler implementation than the one used by s390, sparc, ppc and mips that the new compat_sys_nfsservctl is based on.
The user access checks in the code are inconsistant at least, which should be fixed here.
Compile tested only due to lack of proper test setup.
===== arch/ia64/ia32/sys_ia32.c 1.95 vs edited =====
arch/ia64/ia32/sys_ia32.c +0 -170
@@ -2241,176 +2241,6 @@return sys_setresgid (srgid, segid, ssgid); } -/* Stuff for NFS server syscalls... */ -struct nfsctl_svc32 { -u16 svc32_port; -s32 svc32_nthreads; -}; - -struct nfsctl_client32 { -s8 cl32_ident[NFSCLNT_IDMAX +1 ]; -s32 cl32_naddr; -struct in_addr cl32_addrlist[NFSCLNT_ADDRMAX ]; -s32 cl32_fhkeytype; -s32 cl32_fhkeylen; -u8 cl32_fhkey[NFSCLNT_KEYMAX ]; -}; - -struct nfsctl_export32 { -s8 ex32_client[NFSCLNT_IDMAX +1 ]; -s8 ex32_path[NFS_MAXPATHLEN +1 ]; -compat_dev_t ex32_dev; -compat_ino_t ex32_ino; -s32 ex32_flags; -compat_uid_t ex32_anon_uid; -compat_gid_t ex32_anon_gid; -}; - -struct nfsctl_arg32 { -s32 ca32_version;/* safeguard */ -union { -struct nfsctl_svc32 u32_svc; -struct nfsctl_client32 u32_client; -struct nfsctl_export32 u32_export; -u32 u32_debug; - } u; -#define ca32_svc u.u32_svc -#define ca32_client u.u32_client -#define ca32_export u.u32_export -#define ca32_debug u.u32_debug -}; - -union nfsctl_res32 { -struct knfs_fh cr32_getfh; -u32 cr32_debug; -}; - -static int -nfs_svc32_trans (struct nfsctl_arg *karg,struct nfsctl_arg32 *arg32) -{ -int err; - - err =__get_user (karg->ca_version, &arg32->ca32_version); - err |=__get_user (karg->ca_svc.svc_port, &arg32->ca32_svc.svc32_port); - err |=__get_user (karg->ca_svc.svc_nthreads, - &arg32->ca32_svc.svc32_nthreads); -return err; -} - -static int -nfs_clnt32_trans (struct nfsctl_arg *karg,struct nfsctl_arg32 *arg32) -{ -int err; - - err =__get_user (karg->ca_version, &arg32->ca32_version); - err |=copy_from_user (&karg->ca_client.cl_ident[0 ], - &arg32->ca32_client.cl32_ident[0 ], -NFSCLNT_IDMAX ); - err |=__get_user (karg->ca_client.cl_naddr, - &arg32->ca32_client.cl32_naddr); - err |=copy_from_user (&karg->ca_client.cl_addrlist[0 ], - &arg32->ca32_client.cl32_addrlist[0 ], - (sizeof (struct in_addr ) *NFSCLNT_ADDRMAX )); - err |=__get_user (karg->ca_client.cl_fhkeytype, - &arg32->ca32_client.cl32_fhkeytype); - err |=__get_user (karg->ca_client.cl_fhkeylen, - &arg32->ca32_client.cl32_fhkeylen); - err |=copy_from_user (&karg->ca_client.cl_fhkey[0 ], - &arg32->ca32_client.cl32_fhkey[0 ], -NFSCLNT_KEYMAX ); -return err; -} - -static int -nfs_exp32_trans (struct nfsctl_arg *karg,struct nfsctl_arg32 *arg32) -{ -int err; - - err =__get_user (karg->ca_version, &arg32->ca32_version); - err |=copy_from_user (&karg->ca_export.ex_client[0 ], - &arg32->ca32_export.ex32_client[0 ], -NFSCLNT_IDMAX ); - err |=copy_from_user (&karg->ca_export.ex_path[0 ], - &arg32->ca32_export.ex32_path[0 ], -NFS_MAXPATHLEN ); - err |=__get_user (karg->ca_export.ex_dev, - &arg32->ca32_export.ex32_dev); - err |=__get_user (karg->ca_export.ex_ino, - &arg32->ca32_export.ex32_ino); - err |=__get_user (karg->ca_export.ex_flags, - &arg32->ca32_export.ex32_flags); - err |=__get_user (karg->ca_export.ex_anon_uid, - &arg32->ca32_export.ex32_anon_uid); - err |=__get_user (karg->ca_export.ex_anon_gid, - &arg32->ca32_export.ex32_anon_gid); -return err; -} - -static int -nfs_getfh32_res_trans (union nfsctl_res *kres,union nfsctl_res32 *res32) -{ -int err; - - err =copy_to_user (&res32->cr32_getfh, - &kres->cr_getfh, -sizeof (res32->cr32_getfh)); - err |=__put_user (kres->cr_debug, &res32->cr32_debug); -return err; -} - -int asmlinkage -sys32_nfsservctl (int cmd,struct nfsctl_arg32 *arg32,union nfsctl_res32 *res32) -{ -struct nfsctl_arg *karg =NULL ; -union nfsctl_res *kres =NULL ; -mm_segment_t oldfs; -int err; - - karg =kmalloc (sizeof (*karg),GFP_USER ); -if (!karg) -return -ENOMEM ; -if (res32) { - kres =kmalloc (sizeof (*kres),GFP_USER ); -if (!kres) { -kfree (karg); -return -ENOMEM ; - } - } -switch (cmd) { -case NFSCTL_SVC : - err =nfs_svc32_trans (karg, arg32); -break ; -case NFSCTL_ADDCLIENT : - err =nfs_clnt32_trans (karg, arg32); -break ; -case NFSCTL_DELCLIENT : - err =nfs_clnt32_trans (karg, arg32); -break ; -case NFSCTL_EXPORT : - err =nfs_exp32_trans (karg, arg32); -break ; -default : - err = -EINVAL ; -break ; - } -if (err) - goto done; - oldfs =get_fs (); -set_fs (KERNEL_DS ); - err =sys_nfsservctl (cmd, karg, kres); -set_fs (oldfs); - -if (!err && cmd ==NFSCTL_GETFS ) - err =nfs_getfh32_res_trans (kres, res32); - -done: -if (karg) -kfree (karg); -if (kres) -kfree (kres); -return err; -} -/* Handle adjtimex compatibility. */ struct timex32 {
===== arch/parisc/kernel/sys_parisc32.c 1.27 vs edited =====
arch/parisc/kernel/sys_parisc32.c +0 -88
94 lines not on this page · raw message
===== arch/parisc/kernel/syscall_table.S 1.6 vs edited =====
arch/parisc/kernel/syscall_table.S +1 -1
@@ -266,7 +266,7 @@ ENTRY_SAME(ni_syscall) /* query_module */ ENTRY_SAME(poll) /* structs contain pointers and an in_addr... */ - ENTRY_DIFF(nfsservctl) + ENTRY_COMP(nfsservctl) ENTRY_SAME(setresgid) /* 170 */ ENTRY_SAME(getresgid) ENTRY_SAME(prctl)
===== arch/ppc64/kernel/misc.S 1.75 vs edited =====
arch/ppc64/kernel/misc.S +1 -1
@@ -740,7 +740,7 @@ .llong .sys_getresuid /* 165 */ .llong .sys_ni_syscall /* old query_module syscall */ .llong .sys_poll - .llong .sys32_nfsservctl + .llong .compat_sys_nfsservctl .llong .sys_setresgid .llong .sys_getresgid /* 170 */ .llong .sys32_prctl
===== arch/ppc64/kernel/sys_ppc32.c 1.89 vs edited =====
arch/ppc64/kernel/sys_ppc32.c +0 -239
245 lines not on this page · raw message
===== arch/s390/kernel/compat_linux.c 1.22 vs edited =====
arch/s390/kernel/compat_linux.c +0 -220
226 lines not on this page · raw message
===== arch/s390/kernel/compat_wrapper.S 1.11 vs edited =====
arch/s390/kernel/compat_wrapper.S +5 -5
@@ -786,12 +786,12 @@ lgfr %r4,%r4 # long jg sys_poll # branch to system call - .globl sys32_nfsservctl_wrapper -sys32_nfsservctl_wrapper: + .globl compat_sys_nfsservctl_wrapper +compat_sys_nfsservctl_wrapper: lgfr %r2,%r2 # int - llgtr %r3,%r3 # struct nfsctl_arg_emu31 * - llgtr %r4,%r4 # union nfsctl_res_emu31 * - jg sys32_nfsservctl # branch to system call + llgtr %r3,%r3 # struct compat_nfsctl_arg* + llgtr %r4,%r4 # union compat_nfsctl_res* + jg compat_sys_nfsservctl # branch to system call .globl sys32_setresgid16_wrapper sys32_setresgid16_wrapper:
===== arch/s390/kernel/syscalls.S 1.11 vs edited =====
arch/s390/kernel/syscalls.S +1 -1
@@ -177,7 +177,7 @@ NI_SYSCALL /* for vm86 */ NI_SYSCALL /* old sys_query_module */ SYSCALL(sys_poll,sys_poll,sys32_poll_wrapper) -SYSCALL(sys_nfsservctl,sys_nfsservctl,sys32_nfsservctl_wrapper) +SYSCALL(sys_nfsservctl,sys_nfsservctl,compat_sys_nfsservctl_wrapper) SYSCALL(sys_setresgid16,sys_ni_syscall,sys32_setresgid16_wrapper) /* 170 old setresgid16 syscall */ SYSCALL(sys_getresgid16,sys_ni_syscall,sys32_getresgid16_wrapper) /* old getresgid16 syscall */ SYSCALL(sys_prctl,sys_prctl,sys32_prctl_wrapper)
===== arch/sparc64/kernel/sys_sparc32.c 1.98 vs edited =====
arch/sparc64/kernel/sys_sparc32.c +0 -226
232 lines not on this page · raw message
===== arch/sparc64/kernel/systbls.S 1.54 vs edited =====
arch/sparc64/kernel/systbls.S +1 -1
@@ -69,7 +69,7 @@ .word compat_fstatfs64, sys_llseek, sys_mlock, sys_munlock, sys_mlockall /*240*/ .word sys_munlockall, sys_sched_setparam, sys_sched_getparam, sys_sched_setscheduler, sys_sched_getscheduler .word sys_sched_yield, sys_sched_get_priority_max, sys_sched_get_priority_min, sys32_sched_rr_get_interval, compat_sys_nanosleep -/*250*/ .word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, sys32_nfsservctl +/*250*/ .word sys32_mremap, sys32_sysctl, sys_getsid, sys_fdatasync, compat_sys_nfsservctl .word sys_ni_syscall, compat_clock_settime, compat_clock_gettime, compat_clock_getres, compat_clock_nanosleep /*260*/ .word compat_sys_sched_getaffinity, compat_sys_sched_setaffinity, compat_timer_settime, compat_timer_gettime, sys_timer_getoverrun .word sys_timer_delete, sys32_timer_create, sys_ni_syscall, compat_sys_io_setup, sys_io_destroy
===== arch/x86_64/ia32/ia32entry.S 1.32 vs edited =====
arch/x86_64/ia32/ia32entry.S +1 -1
@@ -474,7 +474,7 @@ .quad sys32_vm86_warning /* vm86 */ .quad quiet_ni_syscall /* query_module */ .quad sys_poll - .quad sys32_nfsservctl + .quad compat_sys_nfsservctl .quad sys_setresgid16 /* 170 */ .quad sys_getresgid16 .quad sys_prctl
===== arch/x86_64/ia32/sys_ia32.c 1.59 vs edited =====
arch/x86_64/ia32/sys_ia32.c +0 -227
233 lines not on this page · raw message
===== fs/compat.c 1.25 vs edited =====
fs/compat.c +239 -0
242 lines not on this page · raw message