Commit 2d70ca23 authored by Heiko Carstens's avatar Heiko Carstens Committed by Martin Schwidefsky
Browse files

[S390] Convert sys_clone to function with parameters.



Use function parameters instead of accessing the pt_regs structure
to get the parameters.
Also merge the 31 and 64 bit versions since they are identical.

Signed-off-by: default avatarHeiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 6541f7b6
Loading
Loading
Loading
Loading
+0 −17
Original line number Original line Diff line number Diff line
@@ -801,23 +801,6 @@ asmlinkage long sys32_write(unsigned int fd, char __user * buf, size_t count)
	return sys_write(fd, buf, count);
	return sys_write(fd, buf, count);
}
}


asmlinkage long sys32_clone(void)
{
	struct pt_regs *regs = task_pt_regs(current);
	unsigned long clone_flags;
	unsigned long newsp;
	int __user *parent_tidptr, *child_tidptr;

	clone_flags = regs->gprs[3] & 0xffffffffUL;
	newsp = regs->orig_gpr2 & 0x7fffffffUL;
	parent_tidptr = compat_ptr(regs->gprs[4]);
	child_tidptr = compat_ptr(regs->gprs[5]);
	if (!newsp)
		newsp = regs->gprs[15];
	return do_fork(clone_flags, newsp, regs, 0,
		       parent_tidptr, child_tidptr);
}

/*
/*
 * 31 bit emulation wrapper functions for sys_fadvise64/fadvise64_64.
 * 31 bit emulation wrapper functions for sys_fadvise64/fadvise64_64.
 * These need to rewrite the advise values for POSIX_FADV_{DONTNEED,NOREUSE}
 * These need to rewrite the advise values for POSIX_FADV_{DONTNEED,NOREUSE}
+0 −1
Original line number Original line Diff line number Diff line
@@ -222,7 +222,6 @@ unsigned long old32_mmap(struct mmap_arg_struct_emu31 __user *arg);
long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg);
long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg);
long sys32_read(unsigned int fd, char __user * buf, size_t count);
long sys32_read(unsigned int fd, char __user * buf, size_t count);
long sys32_write(unsigned int fd, char __user * buf, size_t count);
long sys32_write(unsigned int fd, char __user * buf, size_t count);
long sys32_clone(void);
long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise);
long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise);
long sys32_fadvise64_64(struct fadvise64_64_args __user *args);
long sys32_fadvise64_64(struct fadvise64_64_args __user *args);
long sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
long sys32_sigaction(int sig, const struct old_sigaction32 __user *act,
+8 −0
Original line number Original line Diff line number Diff line
@@ -1840,3 +1840,11 @@ sys_perf_event_open_wrapper:
	lgfr	%r5,%r5			# int
	lgfr	%r5,%r5			# int
	llgfr	%r6,%r6			# unsigned long
	llgfr	%r6,%r6			# unsigned long
	jg	sys_perf_event_open	# branch to system call
	jg	sys_perf_event_open	# branch to system call

	.globl	sys_clone_wrapper
sys_clone_wrapper:
	llgfr	%r2,%r2			# unsigned long
	llgfr	%r3,%r3			# unsigned long
	llgtr	%r4,%r4			# int *
	llgtr	%r5,%r5			# int *
	jg	sys_clone		# branch to system call
+2 −1
Original line number Original line Diff line number Diff line
@@ -42,7 +42,8 @@ long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args);
long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high,
			u32 len_low);
			u32 len_low);
long sys_fork(void);
long sys_fork(void);
long sys_clone(void);
long sys_clone(unsigned long newsp, unsigned long clone_flags,
	       int __user *parent_tidptr, int __user *child_tidptr);
long sys_vfork(void);
long sys_vfork(void);
void execve_tail(void);
void execve_tail(void);
long sys_execve(void);
long sys_execve(void);
+2 −8
Original line number Original line Diff line number Diff line
@@ -230,17 +230,11 @@ SYSCALL_DEFINE0(fork)
	return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
	return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
}
}


SYSCALL_DEFINE0(clone)
SYSCALL_DEFINE4(clone, unsigned long, newsp, unsigned long, clone_flags,
		int __user *, parent_tidptr, int __user *, child_tidptr)
{
{
	struct pt_regs *regs = task_pt_regs(current);
	struct pt_regs *regs = task_pt_regs(current);
	unsigned long clone_flags;
	unsigned long newsp;
	int __user *parent_tidptr, *child_tidptr;


	clone_flags = regs->gprs[3];
	newsp = regs->orig_gpr2;
	parent_tidptr = (int __user *) regs->gprs[4];
	child_tidptr = (int __user *) regs->gprs[5];
	if (!newsp)
	if (!newsp)
		newsp = regs->gprs[15];
		newsp = regs->gprs[15];
	return do_fork(clone_flags, newsp, regs, 0,
	return do_fork(clone_flags, newsp, regs, 0,
Loading