Skip to content

Commit

Permalink
frv: switch to generic fork/vfork/clone
Browse files Browse the repository at this point in the history
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
  • Loading branch information
Al Viro committed Nov 29, 2012
1 parent 0bcfe54 commit b9763ce
Show file tree
Hide file tree
Showing 2 changed files with 8 additions and 40 deletions.
3 changes: 3 additions & 0 deletions arch/frv/include/asm/unistd.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,9 @@
#define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE

/*
* "Conditional" syscalls
Expand Down
45 changes: 5 additions & 40 deletions arch/frv/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -139,52 +139,20 @@ inline unsigned long user_stack(const struct pt_regs *regs)
return user_mode(regs) ? regs->sp : 0;
}

asmlinkage int sys_fork(void)
{
#ifndef CONFIG_MMU
/* fork almost works, enough to trick you into looking elsewhere:-( */
return -EINVAL;
#else
return do_fork(SIGCHLD, user_stack(__frame), __frame, 0, NULL, NULL);
#endif
}

asmlinkage int sys_vfork(void)
{
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, user_stack(__frame), __frame, 0,
NULL, NULL);
}

/*****************************************************************************/
/*
* clone a process
* - tlsptr is retrieved by copy_thread()
*/
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp,
int __user *parent_tidptr, int __user *child_tidptr,
int __user *tlsptr)
{
if (!newsp)
newsp = user_stack(__frame);
return do_fork(clone_flags, newsp, __frame, 0, parent_tidptr, child_tidptr);
} /* end sys_clone() */

/*
* set up the kernel stack and exception frames for a new process
*/
int copy_thread(unsigned long clone_flags,
unsigned long usp, unsigned long arg,
struct task_struct *p, struct pt_regs *regs)
struct task_struct *p, struct pt_regs *unused)
{
struct pt_regs *childregs;

childregs = (struct pt_regs *)
(task_stack_page(p) + THREAD_SIZE - FRV_FRAME0_SIZE);

/* set up the userspace frame (the only place that the USP is stored) */
*childregs = *__kernel_frame0_ptr;

p->set_child_tid = p->clear_child_tid = NULL;
*childregs = *current_pt_regs();

p->thread.frame = childregs;
p->thread.curr = p;
Expand All @@ -193,18 +161,15 @@ int copy_thread(unsigned long clone_flags,
p->thread.lr = 0;
p->thread.frame0 = childregs;

if (unlikely(!regs)) {
if (unlikely(p->flags & PF_KTHREAD)) {
childregs->gr9 = usp; /* function */
childregs->gr8 = arg;
p->thread.pc = (unsigned long) ret_from_kernel_thread;
save_user_regs(p->thread.user);
return 0;
}

/* set up the userspace frame (the only place that the USP is stored) */
*childregs = *regs;

childregs->sp = usp;
if (usp)
childregs->sp = usp;
childregs->next_frame = NULL;

p->thread.pc = (unsigned long) ret_from_fork;
Expand Down

0 comments on commit b9763ce

Please sign in to comment.