diff options
| author | Al Viro <viro@zeniv.linux.org.uk> | 2012-10-21 16:52:56 -0400 |
|---|---|---|
| committer | Al Viro <viro@zeniv.linux.org.uk> | 2012-11-28 22:36:46 -0500 |
| commit | 92bbe6cdfdeeaf9ac2a240b1829bab219e7e91d0 (patch) | |
| tree | 01f0fcd9307bbf09850fcc82baaec879f8313bfc /arch/m32r/kernel | |
| parent | 27d892fb27f492921cfd6df15ab4153f1badbb46 (diff) | |
m32r: switch to generic fork/vfork/clone
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'arch/m32r/kernel')
| -rw-r--r-- | arch/m32r/kernel/process.c | 46 |
1 files changed, 4 insertions, 42 deletions
diff --git a/arch/m32r/kernel/process.c b/arch/m32r/kernel/process.c index 62c713f5694a..c37e9a9a8f27 100644 --- a/arch/m32r/kernel/process.c +++ b/arch/m32r/kernel/process.c | |||
| @@ -192,7 +192,7 @@ int dump_fpu(struct pt_regs *regs, elf_fpregset_t *fpu) | |||
| 192 | } | 192 | } |
| 193 | 193 | ||
| 194 | int copy_thread(unsigned long clone_flags, unsigned long spu, | 194 | int copy_thread(unsigned long clone_flags, unsigned long spu, |
| 195 | unsigned long arg, struct task_struct *tsk, struct pt_regs *regs) | 195 | unsigned long arg, struct task_struct *tsk, struct pt_regs *unused) |
| 196 | { | 196 | { |
| 197 | struct pt_regs *childregs = task_pt_regs(tsk); | 197 | struct pt_regs *childregs = task_pt_regs(tsk); |
| 198 | extern void ret_from_fork(void); | 198 | extern void ret_from_fork(void); |
| @@ -206,8 +206,9 @@ int copy_thread(unsigned long clone_flags, unsigned long spu, | |||
| 206 | tsk->thread.lr = (unsigned long)ret_from_kernel_thread; | 206 | tsk->thread.lr = (unsigned long)ret_from_kernel_thread; |
| 207 | } else { | 207 | } else { |
| 208 | /* Copy registers */ | 208 | /* Copy registers */ |
| 209 | *childregs = *regs; | 209 | *childregs = *current_pt_regs(); |
| 210 | childregs->spu = spu; | 210 | if (spu) |
| 211 | childregs->spu = spu; | ||
| 211 | childregs->r0 = 0; /* Child gets zero as return value */ | 212 | childregs->r0 = 0; /* Child gets zero as return value */ |
| 212 | tsk->thread.lr = (unsigned long)ret_from_fork; | 213 | tsk->thread.lr = (unsigned long)ret_from_fork; |
| 213 | } | 214 | } |
| @@ -216,45 +217,6 @@ int copy_thread(unsigned long clone_flags, unsigned long spu, | |||
| 216 | return 0; | 217 | return 0; |
| 217 | } | 218 | } |
| 218 | 219 | ||
| 219 | asmlinkage int sys_fork(void) | ||
| 220 | { | ||
| 221 | #ifdef CONFIG_MMU | ||
| 222 | struct pt_regs *regs = current_pt_regs(); | ||
| 223 | return do_fork(SIGCHLD, regs->spu, regs, 0, NULL, NULL); | ||
| 224 | #else | ||
| 225 | return -EINVAL; | ||
| 226 | #endif /* CONFIG_MMU */ | ||
| 227 | } | ||
| 228 | |||
| 229 | asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, | ||
| 230 | unsigned long parent_tidptr, | ||
| 231 | unsigned long child_tidptr) | ||
| 232 | { | ||
| 233 | struct pt_regs *regs = current_pt_regs(); | ||
| 234 | if (!newsp) | ||
| 235 | newsp = regs->spu; | ||
| 236 | |||
| 237 | return do_fork(clone_flags, newsp, regs, 0, | ||
| 238 | (int __user *)parent_tidptr, (int __user *)child_tidptr); | ||
| 239 | } | ||
| 240 | |||
| 241 | /* | ||
| 242 | * This is trivial, and on the face of it looks like it | ||
| 243 | * could equally well be done in user mode. | ||
| 244 | * | ||
| 245 | * Not so, for quite unobvious reasons - register pressure. | ||
| 246 | * In user mode vfork() cannot have a stack frame, and if | ||
| 247 | * done by calling the "clone()" system call directly, you | ||
| 248 | * do not have enough call-clobbered registers to hold all | ||
| 249 | * the information you need. | ||
| 250 | */ | ||
| 251 | asmlinkage int sys_vfork(void) | ||
| 252 | { | ||
| 253 | struct pt_regs *regs = current_pt_regs(); | ||
| 254 | return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->spu, regs, 0, | ||
| 255 | NULL, NULL); | ||
| 256 | } | ||
| 257 | |||
| 258 | /* | 220 | /* |
| 259 | * These bracket the sleeping functions.. | 221 | * These bracket the sleeping functions.. |
| 260 | */ | 222 | */ |
