[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>
This commit is contained in:
@@ -280,24 +280,26 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long new_stackp,
|
||||
return 0;
|
||||
}
|
||||
|
||||
asmlinkage long sys_fork(struct pt_regs regs)
|
||||
asmlinkage long sys_fork(void)
|
||||
{
|
||||
return do_fork(SIGCHLD, regs.gprs[15], ®s, 0, NULL, NULL);
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
return do_fork(SIGCHLD, regs->gprs[15], regs, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
asmlinkage long sys_clone(struct pt_regs regs)
|
||||
asmlinkage long sys_clone(void)
|
||||
{
|
||||
unsigned long clone_flags;
|
||||
unsigned long newsp;
|
||||
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)
|
||||
newsp = regs.gprs[15];
|
||||
return do_fork(clone_flags, newsp, ®s, 0,
|
||||
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)
|
||||
newsp = regs->gprs[15];
|
||||
return do_fork(clone_flags, newsp, regs, 0,
|
||||
parent_tidptr, child_tidptr);
|
||||
}
|
||||
|
||||
@@ -311,40 +313,52 @@ asmlinkage long sys_clone(struct pt_regs regs)
|
||||
* do not have enough call-clobbered registers to hold all
|
||||
* the information you need.
|
||||
*/
|
||||
asmlinkage long sys_vfork(struct pt_regs regs)
|
||||
asmlinkage long sys_vfork(void)
|
||||
{
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD,
|
||||
regs.gprs[15], ®s, 0, NULL, NULL);
|
||||
regs->gprs[15], regs, 0, NULL, NULL);
|
||||
}
|
||||
|
||||
asmlinkage void execve_tail(void)
|
||||
{
|
||||
task_lock(current);
|
||||
current->ptrace &= ~PT_DTRACE;
|
||||
task_unlock(current);
|
||||
current->thread.fp_regs.fpc = 0;
|
||||
if (MACHINE_HAS_IEEE)
|
||||
asm volatile("sfpc %0,%0" : : "d" (0));
|
||||
}
|
||||
|
||||
/*
|
||||
* sys_execve() executes a new program.
|
||||
*/
|
||||
asmlinkage long sys_execve(struct pt_regs regs)
|
||||
asmlinkage long sys_execve(void)
|
||||
{
|
||||
int error;
|
||||
char * filename;
|
||||
struct pt_regs *regs = task_pt_regs(current);
|
||||
char *filename;
|
||||
unsigned long result;
|
||||
int rc;
|
||||
|
||||
filename = getname((char __user *) regs.orig_gpr2);
|
||||
error = PTR_ERR(filename);
|
||||
if (IS_ERR(filename))
|
||||
goto out;
|
||||
error = do_execve(filename, (char __user * __user *) regs.gprs[3],
|
||||
(char __user * __user *) regs.gprs[4], ®s);
|
||||
if (error == 0) {
|
||||
task_lock(current);
|
||||
current->ptrace &= ~PT_DTRACE;
|
||||
task_unlock(current);
|
||||
current->thread.fp_regs.fpc = 0;
|
||||
if (MACHINE_HAS_IEEE)
|
||||
asm volatile("sfpc %0,%0" : : "d" (0));
|
||||
filename = getname((char __user *) regs->orig_gpr2);
|
||||
if (IS_ERR(filename)) {
|
||||
result = PTR_ERR(filename);
|
||||
goto out;
|
||||
}
|
||||
putname(filename);
|
||||
rc = do_execve(filename, (char __user * __user *) regs->gprs[3],
|
||||
(char __user * __user *) regs->gprs[4], regs);
|
||||
if (rc) {
|
||||
result = rc;
|
||||
goto out_putname;
|
||||
}
|
||||
execve_tail();
|
||||
result = regs->gprs[2];
|
||||
out_putname:
|
||||
putname(filename);
|
||||
out:
|
||||
return error;
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* fill in the FPU structure for a core dump.
|
||||
*/
|
||||
|
Reference in New Issue
Block a user