Commit eda96977 authored by Al Viro's avatar Al Viro
Browse files

score: switch to generic fork/vfork/clone



Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 951b3961
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@ config SCORE
	select MODULES_USE_ELF_REL
	select GENERIC_KERNEL_THREAD
	select GENERIC_KERNEL_EXECVE
	select CLONE_BACKWARDS

choice
	prompt "System type"
+0 −1
Original line number Diff line number Diff line
#ifndef _ASM_SCORE_SYSCALLS_H
#define _ASM_SCORE_SYSCALLS_H

asmlinkage long score_clone(struct pt_regs *regs);
asmlinkage long score_sigaltstack(struct pt_regs *regs);
asmlinkage long score_rt_sigreturn(struct pt_regs *regs);

+3 −0
Original line number Diff line number Diff line
@@ -5,5 +5,8 @@
#define __ARCH_WANT_SYSCALL_OFF_T
#define __ARCH_WANT_SYSCALL_DEPRECATED
#define __ARCH_WANT_SYS_EXECVE
#define __ARCH_WANT_SYS_CLONE
#define __ARCH_WANT_SYS_FORK
#define __ARCH_WANT_SYS_VFORK

#include <asm-generic/unistd.h>
+0 −18
Original line number Diff line number Diff line
@@ -487,11 +487,6 @@ illegal_syscall:
	sw	r9, [r0, PT_R7]
	j	syscall_return

ENTRY(sys_clone)
	mv	r4, r0
	la	r8, score_clone
	br	r8

ENTRY(sys_rt_sigreturn)
	mv	r4, r0
	la	r8, score_rt_sigreturn
@@ -501,16 +496,3 @@ ENTRY(sys_sigaltstack)
	mv	r4, r0
	la	r8, score_sigaltstack
	br	r8

#ifdef __ARCH_WANT_SYSCALL_DEPRECATED
ENTRY(sys_fork)
	mv	r4, r0
	la	r8, score_fork
	br	r8

ENTRY(sys_vfork)
	mv	r4, r0
	la	r8, score_vfork
	br	r8
#endif /* __ARCH_WANT_SYSCALL_DEPRECATED */
+4 −4
Original line number Diff line number Diff line
@@ -94,17 +94,17 @@ int copy_thread(unsigned long clone_flags, unsigned long usp,
	struct pt_regs *childregs = task_pt_regs(p);

	p->thread.reg0 = (unsigned long) childregs;
	if (unlikely(!regs)) {
	if (unlikely(p->flags & PF_KTHREAD)) {
		memset(childregs, 0, sizeof(struct pt_regs));
		p->thread->reg12 = usp;
		p->thread->reg13 = arg;
		p->thread.reg3 = (unsigned long) ret_from_kernel_thread;
	} else {
		*childregs = *regs;
		*childregs = *current_pt_regs();
		childregs->regs[7] = 0;		/* Clear error flag */
		childregs->regs[4] = 0;		/* Child gets zero as return value */
		if (usp)
			childregs->regs[0] = usp;	/* user fork */
		regs->regs[4] = p->pid;		/* WTF? */
		p->thread.reg3 = (unsigned long) ret_from_fork;
	}

Loading