diff options
author | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-04-27 10:01:40 -0400 |
---|---|---|
committer | Martin Schwidefsky <schwidefsky@de.ibm.com> | 2007-04-27 10:01:42 -0400 |
commit | 03ff9a235a0602724fc54916469b6e0939c62c9b (patch) | |
tree | 86ab2236897eb59542be2ccd667d6ca221153a44 /arch/s390/kernel/compat_linux.c | |
parent | ef99516c9646802c3d38c3eb83de302e05b3c1b5 (diff) |
[S390] System call cleanup.
Remove system call glue for sys_clone, sys_fork, sys_vfork, sys_execve,
sys_sigreturn, sys_rt_sigreturn and sys_sigaltstack. Call do_execve from
kernel_execve directly, move pt_regs to the right place and branch to
sysc_return to start the user space program. This removes the last
in-kernel system call.
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Diffstat (limited to 'arch/s390/kernel/compat_linux.c')
-rw-r--r-- | arch/s390/kernel/compat_linux.c | 60 |
1 files changed, 33 insertions, 27 deletions
diff --git a/arch/s390/kernel/compat_linux.c b/arch/s390/kernel/compat_linux.c index 664c669b1856..5236fdb17fcb 100644 --- a/arch/s390/kernel/compat_linux.c +++ b/arch/s390/kernel/compat_linux.c | |||
@@ -495,29 +495,34 @@ sys32_rt_sigqueueinfo(int pid, int sig, compat_siginfo_t __user *uinfo) | |||
495 | * sys32_execve() executes a new program after the asm stub has set | 495 | * sys32_execve() executes a new program after the asm stub has set |
496 | * things up for us. This should basically do what I want it to. | 496 | * things up for us. This should basically do what I want it to. |
497 | */ | 497 | */ |
498 | asmlinkage long | 498 | asmlinkage long sys32_execve(void) |
499 | sys32_execve(struct pt_regs regs) | ||
500 | { | 499 | { |
501 | int error; | 500 | struct pt_regs *regs = task_pt_regs(current); |
502 | char * filename; | 501 | char *filename; |
502 | unsigned long result; | ||
503 | int rc; | ||
503 | 504 | ||
504 | filename = getname(compat_ptr(regs.orig_gpr2)); | 505 | filename = getname(compat_ptr(regs->orig_gpr2)); |
505 | error = PTR_ERR(filename); | 506 | if (IS_ERR(filename)) { |
506 | if (IS_ERR(filename)) | 507 | result = PTR_ERR(filename); |
507 | goto out; | 508 | goto out; |
508 | error = compat_do_execve(filename, compat_ptr(regs.gprs[3]), | ||
509 | compat_ptr(regs.gprs[4]), ®s); | ||
510 | if (error == 0) | ||
511 | { | ||
512 | task_lock(current); | ||
513 | current->ptrace &= ~PT_DTRACE; | ||
514 | task_unlock(current); | ||
515 | current->thread.fp_regs.fpc=0; | ||
516 | asm volatile("sfpc %0,0" : : "d" (0)); | ||
517 | } | 509 | } |
510 | rc = compat_do_execve(filename, compat_ptr(regs->gprs[3]), | ||
511 | compat_ptr(regs->gprs[4]), regs); | ||
512 | if (rc) { | ||
513 | result = rc; | ||
514 | goto out_putname; | ||
515 | } | ||
516 | task_lock(current); | ||
517 | current->ptrace &= ~PT_DTRACE; | ||
518 | task_unlock(current); | ||
519 | current->thread.fp_regs.fpc=0; | ||
520 | asm volatile("sfpc %0,0" : : "d" (0)); | ||
521 | result = regs->gprs[2]; | ||
522 | out_putname: | ||
518 | putname(filename); | 523 | putname(filename); |
519 | out: | 524 | out: |
520 | return error; | 525 | return result; |
521 | } | 526 | } |
522 | 527 | ||
523 | 528 | ||
@@ -918,19 +923,20 @@ asmlinkage long sys32_write(unsigned int fd, char __user * buf, size_t count) | |||
918 | return sys_write(fd, buf, count); | 923 | return sys_write(fd, buf, count); |
919 | } | 924 | } |
920 | 925 | ||
921 | asmlinkage long sys32_clone(struct pt_regs regs) | 926 | asmlinkage long sys32_clone(void) |
922 | { | 927 | { |
923 | unsigned long clone_flags; | 928 | struct pt_regs *regs = task_pt_regs(current); |
924 | unsigned long newsp; | 929 | unsigned long clone_flags; |
930 | unsigned long newsp; | ||
925 | int __user *parent_tidptr, *child_tidptr; | 931 | int __user *parent_tidptr, *child_tidptr; |
926 | 932 | ||
927 | clone_flags = regs.gprs[3] & 0xffffffffUL; | 933 | clone_flags = regs->gprs[3] & 0xffffffffUL; |
928 | newsp = regs.orig_gpr2 & 0x7fffffffUL; | 934 | newsp = regs->orig_gpr2 & 0x7fffffffUL; |
929 | parent_tidptr = compat_ptr(regs.gprs[4]); | 935 | parent_tidptr = compat_ptr(regs->gprs[4]); |
930 | child_tidptr = compat_ptr(regs.gprs[5]); | 936 | child_tidptr = compat_ptr(regs->gprs[5]); |
931 | if (!newsp) | 937 | if (!newsp) |
932 | newsp = regs.gprs[15]; | 938 | newsp = regs->gprs[15]; |
933 | return do_fork(clone_flags, newsp, ®s, 0, | 939 | return do_fork(clone_flags, newsp, regs, 0, |
934 | parent_tidptr, child_tidptr); | 940 | parent_tidptr, child_tidptr); |
935 | } | 941 | } |
936 | 942 | ||