Commit 83662461 authored by Paul Mundt's avatar Paul Mundt
Browse files

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: default avatarPaul Mundt <lethal@linux-sh.org>
parent 995bb781
Loading
Loading
Loading
Loading
+14 −0
Original line number Diff line number Diff line
@@ -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"
+1 −1
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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;

+2 −0
Original line number Diff line number Diff line
@@ -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 */