فهرست منبع

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>
Paul Mundt 17 سال پیش
والد
کامیت
836624619b
4فایلهای تغییر یافته به همراه18 افزوده شده و 2 حذف شده
  1. 14 0
      arch/sh/Kconfig
  2. 1 1
      arch/sh/kernel/entry-common.S
  3. 1 1
      arch/sh/kernel/process.c
  4. 2 0
      arch/sh/kernel/signal.c

+ 14 - 0
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"

+ 1 - 1
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

+ 1 - 1
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;
 

+ 2 - 0
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 */