diff options
author | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-09-09 16:19:49 -0400 |
---|---|---|
committer | Russell King <rmk+kernel@arm.linux.org.uk> | 2015-09-09 18:26:44 -0400 |
commit | af4cb25df93d2e7a97d65db2bfacaa4400988dea (patch) | |
tree | a19e89d89937303b0196351636d81df712c9a456 | |
parent | 296254f3223d201f2aa53f5f717eedfdc63f3db8 (diff) |
ARM: uaccess: fix undefined instruction on ARMv7M/noMMU
The use of get_domain() in copy_thread() results in an oops on
ARMv7M/noMMU systems. The thread cpu_domain value is only used when
CONFIG_CPU_USE_DOMAINS is enabled, so there's no need to save the
value in copy_thread() except when this is enabled, and this option
will never be enabled on these platforms.
Unhandled exception: IPSR = 00000006 LR = fffffff1
CPU: 0 PID: 0 Comm: swapper Not tainted 4.2.0-next-20150909-00001-gb8ec5ad #41
Hardware name: NXP LPC18xx/43xx (Device Tree)
task: 2823fbe0 ti: 2823c000 task.ti: 2823c000
PC is at copy_thread+0x18/0x92
LR is at copy_thread+0x19/0x92
pc : [<2800a46e>] lr : [<2800a46f>] psr: 4100000b
sp : 2823df00 ip : 00000000 fp : 287c81c0
r10: 00000000 r9 : 00800300 r8 : 287c8000
r7 : 287c8000 r6 : 2818908d r5 : 00000000 r4 : 287ca000
r3 : 00000000 r2 : 00000000 r1 : fffffff0 r0 : 287ca048
xPSR: 4100000b
Reported-by: Ariel D'Alessandro <ariel@vanguardiasur.com.ar>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r-- | arch/arm/kernel/process.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/arch/arm/kernel/process.c b/arch/arm/kernel/process.c index 3f18098dfd08..e550a4541f48 100644 --- a/arch/arm/kernel/process.c +++ b/arch/arm/kernel/process.c | |||
@@ -233,6 +233,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, | |||
233 | 233 | ||
234 | memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); | 234 | memset(&thread->cpu_context, 0, sizeof(struct cpu_context_save)); |
235 | 235 | ||
236 | #ifdef CONFIG_CPU_USE_DOMAINS | ||
236 | /* | 237 | /* |
237 | * Copy the initial value of the domain access control register | 238 | * Copy the initial value of the domain access control register |
238 | * from the current thread: thread->addr_limit will have been | 239 | * from the current thread: thread->addr_limit will have been |
@@ -240,6 +241,7 @@ copy_thread(unsigned long clone_flags, unsigned long stack_start, | |||
240 | * kernel/fork.c | 241 | * kernel/fork.c |
241 | */ | 242 | */ |
242 | thread->cpu_domain = get_domain(); | 243 | thread->cpu_domain = get_domain(); |
244 | #endif | ||
243 | 245 | ||
244 | if (likely(!(p->flags & PF_KTHREAD))) { | 246 | if (likely(!(p->flags & PF_KTHREAD))) { |
245 | *childregs = *current_pt_regs(); | 247 | *childregs = *current_pt_regs(); |