linux 2.6.16.38 w/ vs2.0.3-rc1
[linux-2.6.git] / arch / arm / kernel / entry-armv.S
index de4e331..ec48d70 100644 (file)
  *  Note:  there is a StrongARM bug in the STMIA rn, {regs}^ instruction that causes
  *  it to save wrong values...  Be aware!
  */
+#include <linux/config.h>
 
 #include <asm/memory.h>
 #include <asm/glue.h>
 #include <asm/vfpmacros.h>
 #include <asm/arch/entry-macro.S>
-#include <asm/thread_notify.h>
 
 #include "entry-header.S"
 
@@ -484,6 +484,7 @@ call_fpe:
        movcss  r7, r5, lsr #(TIF_USING_IWMMXT + 1)
        bcs     iwmmxt_task_enable
 #endif
+       enable_irq
        add     pc, pc, r8, lsr #6
        mov     r0, r0
 
@@ -491,15 +492,9 @@ call_fpe:
        b       do_fpe                          @ CP#1 (FPE)
        b       do_fpe                          @ CP#2 (FPE)
        mov     pc, lr                          @ CP#3
-#ifdef CONFIG_CRUNCH
-       b       crunch_task_enable              @ CP#4 (MaverickCrunch)
-       b       crunch_task_enable              @ CP#5 (MaverickCrunch)
-       b       crunch_task_enable              @ CP#6 (MaverickCrunch)
-#else
        mov     pc, lr                          @ CP#4
        mov     pc, lr                          @ CP#5
        mov     pc, lr                          @ CP#6
-#endif
        mov     pc, lr                          @ CP#7
        mov     pc, lr                          @ CP#8
        mov     pc, lr                          @ CP#9
@@ -516,7 +511,6 @@ call_fpe:
        mov     pc, lr                          @ CP#15 (Control)
 
 do_fpe:
-       enable_irq
        ldr     r4, .LCfp
        add     r10, r10, #TI_FPSTATE           @ r10 = workspace
        ldr     pc, [r4]                        @ Call FP module USR entry point
@@ -566,8 +560,10 @@ ENTRY(__switch_to)
        add     ip, r1, #TI_CPU_SAVE
        ldr     r3, [r2, #TI_TP_VALUE]
        stmia   ip!, {r4 - sl, fp, sp, lr}      @ Store most regs on stack
-#ifdef CONFIG_MMU
-       ldr     r6, [r2, #TI_CPU_DOMAIN]
+#ifndef CONFIG_MMU
+       add     r2, r2, #TI_CPU_DOMAIN
+#else
+       ldr     r6, [r2, #TI_CPU_DOMAIN]!
 #endif
 #if __LINUX_ARM_ARCH__ >= 6
 #ifdef CONFIG_CPU_32v6K
@@ -589,18 +585,21 @@ ENTRY(__switch_to)
 #ifdef CONFIG_MMU
        mcr     p15, 0, r6, c3, c0, 0           @ Set domain register
 #endif
-#if defined(CONFIG_CPU_XSCALE) && !defined(CONFIG_IWMMXT)
-       add     r4, r2, #TI_CPU_DOMAIN + 40     @ cpu_context_save->extra
+#ifdef CONFIG_VFP
+       @ Always disable VFP so we can lazily save/restore the old
+       @ state. This occurs in the context of the previous thread.
+       VFPFMRX r4, FPEXC
+       bic     r4, r4, #FPEXC_ENABLE
+       VFPFMXR FPEXC, r4
+#endif
+#if defined(CONFIG_IWMMXT)
+       bl      iwmmxt_task_switch
+#elif defined(CONFIG_CPU_XSCALE)
+       add     r4, r2, #40                     @ cpu_context_save->extra
        ldmib   r4, {r4, r5}
        mar     acc0, r4, r5
 #endif
-       mov     r5, r0
-       add     r4, r2, #TI_CPU_SAVE
-       ldr     r0, =thread_notify_head
-       mov     r1, #THREAD_NOTIFY_SWITCH
-       bl      atomic_notifier_call_chain
-       mov     r0, r5
-       ldmia   r4, {r4 - sl, fp, sp, pc}       @ Load all regs saved previously
+       ldmib   r2, {r4 - sl, fp, sp, pc}       @ Load all regs saved previously
 
        __INIT
 
@@ -634,14 +633,6 @@ ENTRY(__switch_to)
  * purpose.
  */
 
-       .macro  usr_ret, reg
-#ifdef CONFIG_ARM_THUMB
-       bx      \reg
-#else
-       mov     pc, \reg
-#endif
-       .endm
-
        .align  5
        .globl  __kuser_helper_start
 __kuser_helper_start:
@@ -675,7 +666,7 @@ __kuser_helper_start:
  *
  * #define __kernel_dmb() \
  *         asm volatile ( "mov r0, #0xffff0fff; mov lr, pc; sub pc, r0, #95" \
- *             : : : "r0", "lr","cc" )
+ *             : : : "lr","cc" )
  */
 
 __kuser_memory_barrier:                                @ 0xffff0fa0
@@ -683,7 +674,7 @@ __kuser_memory_barrier:                             @ 0xffff0fa0
 #if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_SMP)
        mcr     p15, 0, r0, c7, c10, 5  @ dmb
 #endif
-       usr_ret lr
+       mov     pc, lr
 
        .align  5
 
@@ -786,7 +777,7 @@ __kuser_cmpxchg:                            @ 0xffff0fc0
        mov     r0, #-1
        adds    r0, r0, #0
 #endif
-       usr_ret lr
+       mov     pc, lr
 
 #else
 
@@ -800,7 +791,7 @@ __kuser_cmpxchg:                            @ 0xffff0fc0
 #ifdef CONFIG_SMP
        mcr     p15, 0, r0, c7, c10, 5  @ dmb
 #endif
-       usr_ret lr
+       mov     pc, lr
 
 #endif
 
@@ -842,11 +833,16 @@ __kuser_cmpxchg:                          @ 0xffff0fc0
 __kuser_get_tls:                               @ 0xffff0fe0
 
 #if !defined(CONFIG_HAS_TLS_REG) && !defined(CONFIG_TLS_REG_EMUL)
+
        ldr     r0, [pc, #(16 - 8)]             @ TLS stored at 0xffff0ff0
+       mov     pc, lr
+
 #else
+
        mrc     p15, 0, r0, c13, c0, 3          @ read TLS register
+       mov     pc, lr
+
 #endif
-       usr_ret lr
 
        .rep    5
        .word   0                       @ pad up to __kuser_helper_version