Skip to content

Commit

Permalink
sh: Conditionalize gUSA support.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Paul Mundt committed Sep 28, 2007
1 parent 995bb78 commit 8366246
Show file tree
Hide file tree
Showing 4 changed files with 18 additions and 2 deletions.
14 changes: 14 additions & 0 deletions arch/sh/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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"
Expand Down
2 changes: 1 addition & 1 deletion arch/sh/kernel/entry-common.S
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion arch/sh/kernel/process.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down
2 changes: 2 additions & 0 deletions arch/sh/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -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 */
Expand Down

0 comments on commit 8366246

Please sign in to comment.