h8300: switch to generic fork/vfork/clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Родитель
e9eac30418
Коммит
3416e8098a
|
@ -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)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* "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,
|
||||||
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)
|
||||||
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
|
||||||
|
|
Загрузка…
Ссылка в новой задаче