Commit bb37b84a authored by Linus Torvalds's avatar Linus Torvalds

Merge penguin:v2.5/linux

into home.transmeta.com:/home/torvalds/v2.5/linux
parents da94c7b2 68494a35
...@@ -235,23 +235,18 @@ int ...@@ -235,23 +235,18 @@ int
alpha_clone(unsigned long clone_flags, unsigned long usp, int *parent_tid, alpha_clone(unsigned long clone_flags, unsigned long usp, int *parent_tid,
int *child_tid, unsigned long tls_value, struct pt_regs *regs) int *child_tid, unsigned long tls_value, struct pt_regs *regs)
{ {
struct task_struct *p;
if (!usp) if (!usp)
usp = rdusp(); usp = rdusp();
p = do_fork(clone_flags & ~CLONE_IDLETASK, usp, regs, 0, return do_fork(clone_flags & ~CLONE_IDLETASK, usp, regs, 0,
parent_tid, child_tid); parent_tid, child_tid);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
int int
alpha_vfork(struct pt_regs *regs) alpha_vfork(struct pt_regs *regs)
{ {
struct task_struct *p; return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(),
p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, rdusp(), regs, 0, NULL, NULL);
regs, 0, NULL, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
/* /*
......
...@@ -366,8 +366,8 @@ do_sys_ptrace(long request, long pid, long addr, long data, ...@@ -366,8 +366,8 @@ do_sys_ptrace(long request, long pid, long addr, long data,
ret = -EIO; ret = -EIO;
if ((unsigned long) data > _NSIG) if ((unsigned long) data > _NSIG)
break; break;
/* Mark single stepping. */ /* Set single stepping. */
child->thread_info->bpt_nsaved = -1; ptrace_set_bpt(child);
clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE); clear_tsk_thread_flag(child, TIF_SYSCALL_TRACE);
wake_up_process(child); wake_up_process(child);
child->exit_code = data; child->exit_code = data;
...@@ -397,11 +397,11 @@ syscall_trace(void) ...@@ -397,11 +397,11 @@ syscall_trace(void)
return; return;
if (!(current->ptrace & PT_PTRACED)) if (!(current->ptrace & PT_PTRACED))
return; return;
current->exit_code = SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD) /* The 0x80 provides a way for the tracing parent to distinguish
? 0x80 : 0); between a syscall stop and SIGTRAP delivery */
current->state = TASK_STOPPED; ptrace_notify(SIGTRAP | ((current->ptrace & PT_TRACESYSGOOD)
notify_parent(current, SIGCHLD); ? 0x80 : 0));
schedule();
/* /*
* This isn't the same as continuing with a signal, but it will do * This isn't the same as continuing with a signal, but it will do
* for normal use. strace only continues with a signal if the * for normal use. strace only continues with a signal if the
......
...@@ -417,7 +417,12 @@ fork_by_hand(void) ...@@ -417,7 +417,12 @@ fork_by_hand(void)
/* Don't care about the contents of regs since we'll never /* Don't care about the contents of regs since we'll never
reschedule the forked task. */ reschedule the forked task. */
struct pt_regs regs; struct pt_regs regs;
return do_fork(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL); int pid;
pid = do_fork(CLONE_VM|CLONE_IDLETASK, 0, &regs, 0, NULL, NULL);
if (pid < 0)
return NULL;
return find_task_by_pid (pid);
} }
/* /*
...@@ -436,7 +441,7 @@ smp_boot_one_cpu(int cpuid) ...@@ -436,7 +441,7 @@ smp_boot_one_cpu(int cpuid)
wish. We can't use kernel_thread since we must avoid wish. We can't use kernel_thread since we must avoid
rescheduling the child. */ rescheduling the child. */
idle = fork_by_hand(); idle = fork_by_hand();
if (IS_ERR(idle)) if (!idle)
panic("failed fork for CPU %d", cpuid); panic("failed fork for CPU %d", cpuid);
init_idle(idle, cpuid); init_idle(idle, cpuid);
......
...@@ -238,9 +238,7 @@ asmlinkage int sys_ipc (uint call, int first, int second, int third, void *ptr, ...@@ -238,9 +238,7 @@ asmlinkage int sys_ipc (uint call, int first, int second, int third, void *ptr,
*/ */
asmlinkage int sys_fork(struct pt_regs *regs) asmlinkage int sys_fork(struct pt_regs *regs)
{ {
struct task_struct *p; return do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
p = do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
/* Clone a task - this clones the calling program thread. /* Clone a task - this clones the calling program thread.
...@@ -248,8 +246,6 @@ asmlinkage int sys_fork(struct pt_regs *regs) ...@@ -248,8 +246,6 @@ asmlinkage int sys_fork(struct pt_regs *regs)
*/ */
asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, struct pt_regs *regs) asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, struct pt_regs *regs)
{ {
struct task_struct *p;
/* /*
* We don't support SETTID / CLEARTID * We don't support SETTID / CLEARTID
*/ */
...@@ -259,16 +255,12 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, struct ...@@ -259,16 +255,12 @@ asmlinkage int sys_clone(unsigned long clone_flags, unsigned long newsp, struct
if (!newsp) if (!newsp)
newsp = regs->ARM_sp; newsp = regs->ARM_sp;
p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, regs, 0, NULL, NULL); return do_fork(clone_flags & ~CLONE_IDLETASK, newsp, regs, 0, NULL, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
asmlinkage int sys_vfork(struct pt_regs *regs) asmlinkage int sys_vfork(struct pt_regs *regs)
{ {
struct task_struct *p; return do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0, NULL, NULL);
return IS_ERR(p) ? PTR_ERR(p) : p->pid;
} }
/* sys_execve() executes a new program. /* sys_execve() executes a new program.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment