提交 3416e809 编写于 作者: A Al Viro

h8300: switch to generic fork/vfork/clone

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 e9eac304
...@@ -357,6 +357,9 @@ ...@@ -357,6 +357,9 @@
#define __ARCH_WANT_SYS_RT_SIGACTION #define __ARCH_WANT_SYS_RT_SIGACTION
#define __ARCH_WANT_SYS_RT_SIGSUSPEND #define __ARCH_WANT_SYS_RT_SIGSUSPEND
#define __ARCH_WANT_SYS_EXECVE #define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK
#define __ARCH_WANT_SYS_CLONE
/* /*
* "Conditional" syscalls * "Conditional" syscalls
......
...@@ -127,40 +127,9 @@ void flush_thread(void) ...@@ -127,40 +127,9 @@ void flush_thread(void)
{ {
} }
/*
* "h8300_fork()".. By the time we get here, the
* non-volatile registers have also been saved on the
* stack. We do some ugly pointer stuff here.. (see
* also copy_thread)
*/
asmlinkage int h8300_fork(struct pt_regs *regs)
{
return -EINVAL;
}
asmlinkage int h8300_vfork(struct pt_regs *regs)
{
return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL);
}
asmlinkage int h8300_clone(struct pt_regs *regs)
{
unsigned long clone_flags;
unsigned long newsp;
/* syscall2 puts clone_flags in er1 and usp in er2 */
clone_flags = regs->er1;
newsp = regs->er2;
if (!newsp)
newsp = rdusp();
return do_fork(clone_flags, newsp, regs, 0, NULL, NULL);
}
int copy_thread(unsigned long clone_flags, int copy_thread(unsigned long clone_flags,
unsigned long usp, unsigned long topstk, unsigned long usp, unsigned long topstk,
struct task_struct * p, struct pt_regs * regs) struct task_struct * p, struct pt_regs *unused)
{ {
struct pt_regs * childregs; struct pt_regs * childregs;
...@@ -173,11 +142,10 @@ int copy_thread(unsigned long clone_flags, ...@@ -173,11 +142,10 @@ int copy_thread(unsigned long clone_flags,
childregs->er5 = usp; /* fn */ childregs->er5 = usp; /* fn */
p->thread.ksp = (unsigned long)childregs; p->thread.ksp = (unsigned long)childregs;
} }
*childregs = *regs; *childregs = *current_pt_regs();
childregs->retpc = (unsigned long) ret_from_fork; childregs->retpc = (unsigned long) ret_from_fork;
childregs->er0 = 0; childregs->er0 = 0;
p->thread.usp = usp ?: rdusp();
p->thread.usp = usp;
p->thread.ksp = (unsigned long)childregs; p->thread.ksp = (unsigned long)childregs;
return 0; return 0;
......
...@@ -340,21 +340,12 @@ SYMBOL_NAME_LABEL(sys_call_table) ...@@ -340,21 +340,12 @@ SYMBOL_NAME_LABEL(sys_call_table)
bra SYMBOL_NAME(syscall_trampoline):8 bra SYMBOL_NAME(syscall_trampoline):8
.endm .endm
SYMBOL_NAME_LABEL(sys_clone)
call_sp h8300_clone
SYMBOL_NAME_LABEL(sys_sigreturn) SYMBOL_NAME_LABEL(sys_sigreturn)
call_sp do_sigreturn call_sp do_sigreturn
SYMBOL_NAME_LABEL(sys_rt_sigreturn) SYMBOL_NAME_LABEL(sys_rt_sigreturn)
call_sp do_rt_sigreturn call_sp do_rt_sigreturn
SYMBOL_NAME_LABEL(sys_fork)
call_sp h8300_fork
SYMBOL_NAME_LABEL(sys_vfork)
call_sp h8300_vfork
SYMBOL_NAME_LABEL(syscall_trampoline) SYMBOL_NAME_LABEL(syscall_trampoline)
mov.l sp,er0 mov.l sp,er0
jmp @er6 jmp @er6
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册