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>
This commit is contained in:
Родитель
995bb781d4
Коммит
836624619b
|
@ -570,6 +570,20 @@ config NR_CPUS
|
||||||
|
|
||||||
source "kernel/Kconfig.preempt"
|
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
|
endmenu
|
||||||
|
|
||||||
menu "Boot options"
|
menu "Boot options"
|
||||||
|
|
|
@ -176,7 +176,7 @@ work_notifysig:
|
||||||
jmp @r1
|
jmp @r1
|
||||||
lds r0, pr
|
lds r0, pr
|
||||||
work_resched:
|
work_resched:
|
||||||
#ifndef CONFIG_PREEMPT
|
#if defined(CONFIG_GUSA) && !defined(CONFIG_PREEMPT)
|
||||||
! gUSA handling
|
! gUSA handling
|
||||||
mov.l @(OFF_SP,r15), r0 ! get user space stack pointer
|
mov.l @(OFF_SP,r15), r0 ! get user space stack pointer
|
||||||
mov r0, r1
|
mov r0, r1
|
||||||
|
|
|
@ -350,7 +350,7 @@ struct task_struct *__switch_to(struct task_struct *prev,
|
||||||
unlazy_fpu(prev, task_pt_regs(prev));
|
unlazy_fpu(prev, task_pt_regs(prev));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPT
|
#if defined(CONFIG_GUSA) && defined(CONFIG_PREEMPT)
|
||||||
{
|
{
|
||||||
struct pt_regs *regs;
|
struct pt_regs *regs;
|
||||||
|
|
||||||
|
|
|
@ -507,6 +507,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
ctrl_inw(regs->pc - 4));
|
ctrl_inw(regs->pc - 4));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_GUSA
|
||||||
} else {
|
} else {
|
||||||
/* gUSA handling */
|
/* gUSA handling */
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
@ -523,6 +524,7 @@ handle_signal(unsigned long sig, struct k_sigaction *ka, siginfo_t *info,
|
||||||
}
|
}
|
||||||
|
|
||||||
preempt_enable_no_resched();
|
preempt_enable_no_resched();
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set up the stack frame */
|
/* Set up the stack frame */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче