summaryrefslogtreecommitdiff
path: root/arch/arm
diff options
context:
space:
mode:
authorRussell King <rmk@flint.arm.linux.org.uk>2002-09-29 19:12:05 +0100
committerRussell King <rmk@flint.arm.linux.org.uk>2002-09-29 19:12:05 +0100
commit3a8fb2567869eb19457ccfc8aac837355f005f2e (patch)
tree3b3e9d6e164141e45c0cac8fcc6e539af3128b00 /arch/arm
parent82e48db036cf5fc2323bd6c5eb68158750487ed8 (diff)
[ARM] 2.5.34 update
Update for changes in mainline 2.5.3[01234].
Diffstat (limited to 'arch/arm')
-rw-r--r--arch/arm/kernel/armksyms.c4
-rw-r--r--arch/arm/kernel/init_task.c2
-rw-r--r--arch/arm/kernel/setup.c4
-rw-r--r--arch/arm/kernel/signal.c31
-rw-r--r--arch/arm/kernel/sys_arm.c15
-rw-r--r--arch/arm/mach-rpc/riscpc.c6
6 files changed, 40 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 (&current->sigmask_lock);
- signr = dequeue_signal(&current->blocked, &info);
- spin_unlock_irq (&current->sigmask_lock);
+ unsigned long signr = 0;
+ struct k_sigaction *ka;
+ sigset_t *mask = &current->blocked;
+
+ local_irq_disable();
+ if (current->sig->shared_pending.head) {
+ spin_lock(&current->sig->siglock);
+ signr = dequeue_signal(&current->sig->shared_pending, mask, &info);
+ spin_unlock(&current->sig->siglock);
+ }
+ if (!signr) {
+ spin_lock(&current->sigmask_lock);
+ signr = dequeue_signal(&current->pending, mask, &info);
+ spin_unlock(&current->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;
}
diff --git a/arch/arm/mach-rpc/riscpc.c b/arch/arm/mach-rpc/riscpc.c
index e62acc952e68..8c1538aaacd0 100644
--- a/arch/arm/mach-rpc/riscpc.c
+++ b/arch/arm/mach-rpc/riscpc.c
@@ -16,6 +16,7 @@
#include <linux/init.h>
#include <asm/elf.h>
+#include <asm/io.h>
#include <asm/setup.h>
#include <asm/mach-types.h>
#include <asm/hardware.h>
@@ -72,6 +73,11 @@ void __init rpc_map_io(void)
iotable_init(rpc_io_desc, ARRAY_SIZE(rpc_io_desc));
/*
+ * Turn off floppy.
+ */
+ outb(0xc, 0x3f2);
+
+ /*
* RiscPC can't handle half-word loads and stores
*/
elf_hwcap &= ~HWCAP_HALF;