Skip to contentSkip to conversation

Consolidate sys32_readv and sys32_writev

PATCH In review Arnd Bergmann 4 participants 15 messages Apr 4, 2004 – Apr 13, 2004 1 message not in the archive

Subsystems (5)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

Arnd Bergmann

author maintainer
#1 lore raw

PATCH 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 */
author maintainer
#2 lore raw

PATCH 2/4 Consolidate do_execve32

In reply to a message not in the archive

The 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], &regs);
+	error = compat_do_execve(filename, compat_ptr(regs.regs[5]),
+				 compat_ptr(regs.regs[6]), &regs);
 	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 */
#3 lore raw

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.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.

Attached is a patch that takes care of ia64.

-Arun

arch/ia64/ia32/sys_ia32.c +13 -55
diff -purN -X dontdiff linux-2.6.5-compat4/arch/ia64/ia32/sys_ia32.c linux-2.6.5-compat/arch/ia64/ia32/sys_ia32.c
@@ -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
diff -purN -X dontdiff linux-2.6.5-compat4/fs/compat.c linux-2.6.5-compat/fs/compat.c
@@ -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))
 
author maintainer
#4 lore raw

PATCH 3/4 Consolidate sys32_select

In reply to a message not in the archive

sys32_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 */
#5 lore raw

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_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.

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

author maintainer
#6 lore raw

Re: [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 <><
#7 lore raw

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

#8 lore raw

Re: [PATCH 3/4] Consolidate sys32_select

In reply to Andi Kleen
Quoted 4 lines · On Sun, 4 Apr 2004 02:22:40 +0200 Arnd Bergmann <[email protected]> wrote:
Quoted 4 lines

sys32_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.

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

author maintainer
#9 lore raw

Re: [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)
#10 lore raw

Re: [PATCH 3/4] Consolidate sys32_select

fs/compat.c line 1382

Quoted 12 lines

===== 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;

Are you sure? They should be equivalent. __put_user returns -EFAULT on error.

-Andi

author maintainer
#11 lore raw

Re: [PATCH 3/4] Consolidate sys32_select

Quoted 7 lines · Andi Kleen
Quoted 7 lines

===== fs/compat.c 1.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_user returns -EFAULT on 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 <><
#12 lore raw

Re: [PATCH 3/4] Consolidate sys32_select

In reply to Arnd Bergmann
Quoted 6 lines · Arnd Bergmann

sys32_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.

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

author maintainer
#13 lore raw

Re: [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->BROK

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.

	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)
#14 lore raw

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
recvmsg01 PASS->BROK
recvfrom01 PASS->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

author maintainer
#15 lore raw

PATCH 4/4 Consolidate sys32_nfsservctl

In reply to a message not in the archive

sys32_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