diff options
author | Heiko Carstens <heiko.carstens@de.ibm.com> | 2009-09-22 16:58:41 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2009-09-22 16:58:43 -0400 |
commit | 2d70ca23f86647e076e3a8b64b3a90e583b894d5 (patch) | |
tree | 38c95c0728211e872fd652cc9d2f371fa0145773 /arch | |
parent | 6541f7b68f229aacd2e453bc9e94335fc56419fe (diff) |
[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: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/s390/kernel/compat_linux.c | 17 | ||||
-rw-r--r-- | arch/s390/kernel/compat_linux.h | 1 | ||||
-rw-r--r-- | arch/s390/kernel/compat_wrapper.S | 8 | ||||
-rw-r--r-- | arch/s390/kernel/entry.h | 3 | ||||
-rw-r--r-- | arch/s390/kernel/process.c | 10 | ||||
-rw-r--r-- | arch/s390/kernel/syscalls.S | 2 |
6 files changed, 13 insertions, 28 deletions
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 9ab188d67a3d..f741cd49111a 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -801,23 +801,6 @@ asmlinkage long sys32_write(unsigned int fd, char __user * buf, size_t count) | |||
801 | return sys_write(fd, buf, count); | 801 | return sys_write(fd, buf, count); |
802 | } | 802 | } |
803 | 803 | ||
804 | asmlinkage long sys32_clone(void) | ||
805 | { | ||
806 | struct pt_regs *regs = task_pt_regs(current); | ||
807 | unsigned long clone_flags; | ||
808 | unsigned long newsp; | ||
809 | int __user *parent_tidptr, *child_tidptr; | ||
810 | |||
811 | clone_flags = regs->gprs[3] & 0xffffffffUL; | ||
812 | newsp = regs->orig_gpr2 & 0x7fffffffUL; | ||
813 | parent_tidptr = compat_ptr(regs->gprs[4]); | ||
814 | child_tidptr = compat_ptr(regs->gprs[5]); | ||
815 | if (!newsp) | ||
816 | newsp = regs->gprs[15]; | ||
817 | return do_fork(clone_flags, newsp, regs, 0, | ||
818 | parent_tidptr, child_tidptr); | ||
819 | } | ||
820 | |||
821 | /* | 804 | /* |
822 | * 31 bit emulation wrapper functions for sys_fadvise64/fadvise64_64. | 805 | * 31 bit emulation wrapper functions for sys_fadvise64/fadvise64_64. |
823 | * These need to rewrite the advise values for POSIX_FADV_{DONTNEED,NOREUSE} | 806 | * These need to rewrite the advise values for POSIX_FADV_{DONTNEED,NOREUSE} |
diff --git a/arch/s390/kernel/compat_linux.h b/arch/s390/kernel/compat_linux.h index 836a28842900..7cceb67ff8a2 100644 --- a/arch/s390/kernel/compat_linux.h +++ b/arch/s390/kernel/compat_linux.h | |||
@@ -222,7 +222,6 @@ unsigned long old32_mmap(struct mmap_arg_struct_emu31 __user *arg); | |||
222 | long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg); | 222 | long sys32_mmap2(struct mmap_arg_struct_emu31 __user *arg); |
223 | long sys32_read(unsigned int fd, char __user * buf, size_t count); | 223 | long sys32_read(unsigned int fd, char __user * buf, size_t count); |
224 | long sys32_write(unsigned int fd, char __user * buf, size_t count); | 224 | long sys32_write(unsigned int fd, char __user * buf, size_t count); |
225 | long sys32_clone(void); | ||
226 | long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); | 225 | long sys32_fadvise64(int fd, loff_t offset, size_t len, int advise); |
227 | long sys32_fadvise64_64(struct fadvise64_64_args __user *args); | 226 | long sys32_fadvise64_64(struct fadvise64_64_args __user *args); |
228 | long sys32_sigaction(int sig, const struct old_sigaction32 __user *act, | 227 | long sys32_sigaction(int sig, const struct old_sigaction32 __user *act, |
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S index 624790042d41..28f8440d2ec3 100644 --- a/arch/s390/kernel/compat_wrapper.S +++ b/arch/s390/kernel/compat_wrapper.S | |||
@@ -1840,3 +1840,11 @@ sys_perf_event_open_wrapper: | |||
1840 | lgfr %r5,%r5 # int | 1840 | lgfr %r5,%r5 # int |
1841 | llgfr %r6,%r6 # unsigned long | 1841 | llgfr %r6,%r6 # unsigned long |
1842 | jg sys_perf_event_open # branch to system call | 1842 | jg sys_perf_event_open # branch to system call |
1843 | |||
1844 | .globl sys_clone_wrapper | ||
1845 | sys_clone_wrapper: | ||
1846 | llgfr %r2,%r2 # unsigned long | ||
1847 | llgfr %r3,%r3 # unsigned long | ||
1848 | llgtr %r4,%r4 # int * | ||
1849 | llgtr %r5,%r5 # int * | ||
1850 | jg sys_clone # branch to system call | ||
diff --git a/arch/s390/kernel/entry.h b/arch/s390/kernel/entry.h index 950c59c6688b..91fd78839c57 100644 --- a/arch/s390/kernel/entry.h +++ b/arch/s390/kernel/entry.h | |||
@@ -42,7 +42,8 @@ long sys_s390_fadvise64_64(struct fadvise64_64_args __user *args); | |||
42 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, | 42 | long sys_s390_fallocate(int fd, int mode, loff_t offset, u32 len_high, |
43 | u32 len_low); | 43 | u32 len_low); |
44 | long sys_fork(void); | 44 | long sys_fork(void); |
45 | long sys_clone(void); | 45 | long sys_clone(unsigned long newsp, unsigned long clone_flags, |
46 | int __user *parent_tidptr, int __user *child_tidptr); | ||
46 | long sys_vfork(void); | 47 | long sys_vfork(void); |
47 | void execve_tail(void); | 48 | void execve_tail(void); |
48 | long sys_execve(void); | 49 | long sys_execve(void); |
diff --git a/arch/s390/kernel/process.c b/arch/s390/kernel/process.c index 5a43f27eec13..189d978f76d6 100644 --- a/arch/s390/kernel/process.c +++ b/arch/s390/kernel/process.c | |||
@@ -230,17 +230,11 @@ SYSCALL_DEFINE0(fork) | |||
230 | return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL); | 230 | return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL); |
231 | } | 231 | } |
232 | 232 | ||
233 | SYSCALL_DEFINE0(clone) | 233 | SYSCALL_DEFINE4(clone, unsigned long, newsp, unsigned long, clone_flags, |
234 | int __user *, parent_tidptr, int __user *, child_tidptr) | ||
234 | { | 235 | { |
235 | struct pt_regs *regs = task_pt_regs(current); | 236 | struct pt_regs *regs = task_pt_regs(current); |
236 | unsigned long clone_flags; | ||
237 | unsigned long newsp; | ||
238 | int __user *parent_tidptr, *child_tidptr; | ||
239 | 237 | ||
240 | clone_flags = regs->gprs[3]; | ||
241 | newsp = regs->orig_gpr2; | ||
242 | parent_tidptr = (int __user *) regs->gprs[4]; | ||
243 | child_tidptr = (int __user *) regs->gprs[5]; | ||
244 | if (!newsp) | 238 | if (!newsp) |
245 | newsp = regs->gprs[15]; | 239 | newsp = regs->gprs[15]; |
246 | return do_fork(clone_flags, newsp, regs, 0, | 240 | return do_fork(clone_flags, newsp, regs, 0, |
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S index 0b5083681e77..ff79d58e0eb3 100644 --- a/arch/s390/kernel/syscalls.S +++ b/arch/s390/kernel/syscalls.S | |||
@@ -128,7 +128,7 @@ SYSCALL(sys_sysinfo,sys_sysinfo,compat_sys_sysinfo_wrapper) | |||
128 | SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper) | 128 | SYSCALL(sys_ipc,sys_ipc,sys32_ipc_wrapper) |
129 | SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper) | 129 | SYSCALL(sys_fsync,sys_fsync,sys32_fsync_wrapper) |
130 | SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn) | 130 | SYSCALL(sys_sigreturn,sys_sigreturn,sys32_sigreturn) |
131 | SYSCALL(sys_clone,sys_clone,sys32_clone) /* 120 */ | 131 | SYSCALL(sys_clone,sys_clone,sys_clone_wrapper) /* 120 */ |
132 | SYSCALL(sys_setdomainname,sys_setdomainname,sys32_setdomainname_wrapper) | 132 | SYSCALL(sys_setdomainname,sys_setdomainname,sys32_setdomainname_wrapper) |
133 | SYSCALL(sys_newuname,sys_s390_newuname,sys32_newuname_wrapper) | 133 | SYSCALL(sys_newuname,sys_s390_newuname,sys32_newuname_wrapper) |
134 | NI_SYSCALL /* modify_ldt for i386 */ | 134 | NI_SYSCALL /* modify_ldt for i386 */ |