diff options
| author | Russell King <rmk@flint.arm.linux.org.uk> | 2002-09-29 19:12:05 +0100 |
|---|---|---|
| committer | Russell King <rmk@flint.arm.linux.org.uk> | 2002-09-29 19:12:05 +0100 |
| commit | 3a8fb2567869eb19457ccfc8aac837355f005f2e (patch) | |
| tree | 3b3e9d6e164141e45c0cac8fcc6e539af3128b00 /arch/arm/kernel | |
| parent | 82e48db036cf5fc2323bd6c5eb68158750487ed8 (diff) | |
[ARM] 2.5.34 update
Update for changes in mainline 2.5.3[01234].
Diffstat (limited to 'arch/arm/kernel')
| -rw-r--r-- | arch/arm/kernel/armksyms.c | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/init_task.c | 2 | ||||
| -rw-r--r-- | arch/arm/kernel/setup.c | 4 | ||||
| -rw-r--r-- | arch/arm/kernel/signal.c | 31 | ||||
| -rw-r--r-- | arch/arm/kernel/sys_arm.c | 15 |
5 files changed, 34 insertions, 22 deletions
diff --git a/arch/arm/kernel/armksyms.c b/arch/arm/kernel/armksyms.c index 246601aea6a7..fc107e93f404 100644 --- a/arch/arm/kernel/armksyms.c +++ b/arch/arm/kernel/armksyms.c @@ -275,7 +275,3 @@ EXPORT_SYMBOL_NOVERS(__down_trylock_failed); EXPORT_SYMBOL_NOVERS(__up_wakeup); EXPORT_SYMBOL(get_wchan); - -#ifdef CONFIG_PREEMPT -EXPORT_SYMBOL(kernel_flag); -#endif diff --git a/arch/arm/kernel/init_task.c b/arch/arm/kernel/init_task.c index 0cdc608bd862..e1c830d099d5 100644 --- a/arch/arm/kernel/init_task.c +++ b/arch/arm/kernel/init_task.c @@ -12,7 +12,7 @@ static struct fs_struct init_fs = INIT_FS; static struct files_struct init_files = INIT_FILES; -static struct signal_struct init_signals = INIT_SIGNALS; +static struct signal_struct init_signals = INIT_SIGNALS(init_signals); struct mm_struct init_mm = INIT_MM(init_mm); /* diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c index 7c23b75e5e29..cf6c528b3947 100644 --- a/arch/arm/kernel/setup.c +++ b/arch/arm/kernel/setup.c @@ -36,10 +36,6 @@ #define MEM_SIZE (16*1024*1024) #endif -#ifdef CONFIG_PREEMPT -spinlock_t kernel_flag __cacheline_aligned_in_smp = SPIN_LOCK_UNLOCKED; -#endif - #if defined(CONFIG_FPE_NWFPE) || defined(CONFIG_FPE_FASTFPE) char fpe_type[8]; diff --git a/arch/arm/kernel/signal.c b/arch/arm/kernel/signal.c index 6efd090309ce..6f6701c99712 100644 --- a/arch/arm/kernel/signal.c +++ b/arch/arm/kernel/signal.c @@ -373,7 +373,7 @@ setup_return(struct pt_regs *regs, struct k_sigaction *ka, regs->ARM_r0 = usig; regs->ARM_sp = (unsigned long)frame; regs->ARM_lr = retcode; - regs->ARM_pc = handler & (thumb ? ~1 : ~3); + regs->ARM_pc = handler; #ifdef CONFIG_CPU_32 regs->ARM_cpsr = cpsr; @@ -503,7 +503,6 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, */ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) { - struct k_sigaction *ka; siginfo_t info; int single_stepping; @@ -519,11 +518,22 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) single_stepping = ptrace_cancel_bpt(current); for (;;) { - unsigned long signr; - - spin_lock_irq (¤t->sigmask_lock); - signr = dequeue_signal(¤t->blocked, &info); - spin_unlock_irq (¤t->sigmask_lock); + unsigned long signr = 0; + struct k_sigaction *ka; + sigset_t *mask = ¤t->blocked; + + local_irq_disable(); + if (current->sig->shared_pending.head) { + spin_lock(¤t->sig->siglock); + signr = dequeue_signal(¤t->sig->shared_pending, mask, &info); + spin_unlock(¤t->sig->siglock); + } + if (!signr) { + spin_lock(¤t->sigmask_lock); + signr = dequeue_signal(¤t->pending, mask, &info); + spin_unlock(¤t->sigmask_lock); + } + local_irq_enable(); if (!signr) break; @@ -531,13 +541,14 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) if ((current->ptrace & PT_PTRACED) && signr != SIGKILL) { /* Let the debugger run. */ current->exit_code = signr; - current->state = TASK_STOPPED; + set_current_state(TASK_STOPPED); notify_parent(current, SIGCHLD); schedule(); single_stepping |= ptrace_cancel_bpt(current); /* We're back. Did the debugger cancel the sig? */ - if (!(signr = current->exit_code)) + signr = current->exit_code; + if (signr == 0) continue; current->exit_code = 0; @@ -589,7 +600,7 @@ static int do_signal(sigset_t *oldset, struct pt_regs *regs, int syscall) case SIGSTOP: { struct signal_struct *sig; - current->state = TASK_STOPPED; + set_current_state(TASK_STOPPED); current->exit_code = signr; sig = current->parent->sig; if (sig && !(sig->action[SIGCHLD-1].sa.sa_flags & SA_NOCLDSTOP)) diff --git a/arch/arm/kernel/sys_arm.c b/arch/arm/kernel/sys_arm.c index 34713adaf4dc..47f4ff685a19 100644 --- a/arch/arm/kernel/sys_arm.c +++ b/arch/arm/kernel/sys_arm.c @@ -239,7 +239,7 @@ asmlinkage int sys_ipc (uint call, int first, int second, int third, void *ptr, asmlinkage int sys_fork(struct pt_regs *regs) { struct task_struct *p; - p = do_fork(SIGCHLD, regs->ARM_sp, regs, 0); + p = do_fork(SIGCHLD, regs->ARM_sp, regs, 0, NULL); return IS_ERR(p) ? PTR_ERR(p) : p->pid; } @@ -249,16 +249,25 @@ asmlinkage int sys_fork(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 + */ + if (clone_flags & (CLONE_SETTID | CLONE_CLEARTID)) + return -EINVAL; + if (!newsp) newsp = regs->ARM_sp; - p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, regs, 0); + + p = do_fork(clone_flags & ~CLONE_IDLETASK, newsp, regs, 0, NULL); + return IS_ERR(p) ? PTR_ERR(p) : p->pid; } asmlinkage int sys_vfork(struct pt_regs *regs) { struct task_struct *p; - p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0); + p = do_fork(CLONE_VFORK | CLONE_VM | SIGCHLD, regs->ARM_sp, regs, 0, NULL); return IS_ERR(p) ? PTR_ERR(p) : p->pid; } |
