diff options
author | Paul Mundt <lethal@linux-sh.org> | 2007-09-28 16:04:49 +0900 |
---|---|---|
committer | Paul Mundt <lethal@linux-sh.org> | 2007-09-28 16:04:49 +0900 |
commit | 836624619b98535079053920a29a7e474ac17cbc (patch) | |
tree | beb3b4fc1b893b6a422be3645c3611b1c7adb456 /arch | |
parent | 995bb781d42441ed48517bc7ea6414c3df3386ef (diff) |
sh: Conditionalize gUSA support.
This conditionalizes gUSA support. gUSA is not supported on
SMP configurations, and it's not necessary there anyways due
to having other atomicity options (ie, movli.l/movco.l).
Anything implementing the LL/SC semantics (all SH-4A CPUs)
can switch to userspace atomicity implementations without
requiring gUSA. This is left default-enabled on all UP so
that glibc doesn't break.
Those that know what they are doing can disable this explicitly.
Signed-off-by: Paul Mundt <lethal@linux-sh.org>
Diffstat (limited to 'arch')
-rw-r--r-- | arch/sh/Kconfig | 14 | ||||
-rw-r--r-- | arch/sh/kernel/entry-common.S | 2 | ||||
-rw-r--r-- | arch/sh/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/sh/kernel/signal.c | 2 |
4 files changed, 18 insertions, 2 deletions
diff --git a/arch/sh/Kconfig b/arch/sh/Kconfig index a8693edd4f4..44982c1dfa2 100644 --- a/arch/sh/Kconfig +++ b/arch/sh/Kconfig @@ -570,6 +570,20 @@ config NR_CPUS source "kernel/Kconfig.preempt" +config GUSA + def_bool y + depends on !SMP + help + This enables support for gUSA (general UserSpace Atomicity). + This is the default implementation for both UP and non-ll/sc + CPUs, and is used by the libc, amongst others. + + For additional information, design information can be found + in <http://lc.linux.or.jp/lc2002/papers/niibe0919p.pdf>. + + This should only be disabled for special cases where alternate + atomicity implementations exist. + endmenu menu "Boot options" diff --git a/arch/sh/kernel/entry-common.S b/arch/sh/kernel/entry-common.S index b4672802719..e0317ed080c 100644 --- a/arch/sh/kernel/entry-common.S +++ b/arch/sh/kernel/entry-common.S @@ -176,7 +176,7 @@ work_notifysig: jmp @r1 lds r0, pr work_resched: -#ifndef CONFIG_PREEMPT +#if defined(CONFIG_GUSA) && !defined(CONFIG_PREEMPT) ! gUSA handling mov.l @(OFF_SP,r15), r0 ! get user space stack pointer mov r0, r1 diff --git a/arch/sh/kernel/process.c b/arch/sh/kernel/process.c index cd8dae16e94..b4469992d6b 100644 --- a/arch/sh/kernel/process.c +++ b/arch/sh/kernel/process.c @@ -350,7 +350,7 @@ struct task_struct *__switch_to(struct task_struct *prev, unlazy_fpu(prev, task_pt_regs(prev)); #endif -#ifdef CONFIG_PREEMPT +#if defined(CONFIG_GUSA) && defined(CONFIG_PREEMPT) { struct pt_regs *regs; diff --git a/arch/sh/kernel/signal.c b/arch/sh/kernel/signal.c index 0f657d32ceb..2f42442cf16 100644 --- a/arch/sh/kernel/signal.c +++ b/arch/sh/kernel/signal.c @@ -507,6 +507,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, ctrl_inw(regs->pc - 4)); break; } +#ifdef CONFIG_GUSA } else { /* gUSA handling */ preempt_disable(); @@ -523,6 +524,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info, } preempt_enable_no_resched(); +#endif } /* Set up the stack frame */ |