Commit 49bca4c2 authored by Nicolas Pitre's avatar Nicolas Pitre Committed by Russell King

[ARM] 3309/1: disable the pre-ARMv5 NPTL kernel helper in the non MMU case

Patch from Nicolas Pitre

The cmpxchg emulation on pre-ARMv5 relies on user code executed from a
kernel address.  If the operation cannot complete atomically, it is
aborted from the usr_entry macro by clearing the Z flag.  This clearing
of the Z flag is done whenever the user pc is above TASK_SIZE.

However this "pc >= TASK_SIZE" test cannot work in the non MMU case.
Worse: the current code will corrupt the Z flag on every entry to the
kernel.

Let's disable it in the non MMU case for now.  Using NPTL on non MMU
targets needs to be worked out anyway.
Signed-off-by: default avatarNicolas Pitre <nico@cam.org>
Signed-off-by: default avatarRussell King <rmk+kernel@arm.linux.org.uk>
parent 99595d02
...@@ -333,9 +333,13 @@ __pabt_svc: ...@@ -333,9 +333,13 @@ __pabt_svc:
@ from the exception stack @ from the exception stack
#if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG) #if __LINUX_ARM_ARCH__ < 6 && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
#ifndef CONFIG_MMU
#warning "NPTL on non MMU needs fixing"
#else
@ make sure our user space atomic helper is aborted @ make sure our user space atomic helper is aborted
cmp r2, #TASK_SIZE cmp r2, #TASK_SIZE
bichs r3, r3, #PSR_Z_BIT bichs r3, r3, #PSR_Z_BIT
#endif
#endif #endif
@ @
...@@ -756,12 +760,18 @@ __kuser_cmpxchg: @ 0xffff0fc0 ...@@ -756,12 +760,18 @@ __kuser_cmpxchg: @ 0xffff0fc0
* exception happening just after the str instruction which would * exception happening just after the str instruction which would
* clear the Z flag although the exchange was done. * clear the Z flag although the exchange was done.
*/ */
#ifdef CONFIG_MMU
teq ip, ip @ set Z flag teq ip, ip @ set Z flag
ldr ip, [r2] @ load current val ldr ip, [r2] @ load current val
add r3, r2, #1 @ prepare store ptr add r3, r2, #1 @ prepare store ptr
teqeq ip, r0 @ compare with oldval if still allowed teqeq ip, r0 @ compare with oldval if still allowed
streq r1, [r3, #-1]! @ store newval if still allowed streq r1, [r3, #-1]! @ store newval if still allowed
subs r0, r2, r3 @ if r2 == r3 the str occured subs r0, r2, r3 @ if r2 == r3 the str occured
#else
#warning "NPTL on non MMU needs fixing"
mov r0, #-1
adds r0, r0, #0
#endif
mov pc, lr mov pc, lr
#else #else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment