Merge tag 'v3.10.87' into update
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / arm / kernel / entry-armv.S
index d43c7e54ec6cafd568eb48c337d96c5bc4afa714..1d3968c693e625fd5270aa26d893af59d13cb68a 100644 (file)
@@ -192,6 +192,7 @@ __dabt_svc:
        svc_entry
        mov     r2, sp
        dabt_helper
+ THUMB(        ldr     r5, [sp, #S_PSR]        )       @ potentially updated CPSR
        svc_exit r5                             @ return from exception
  UNWIND(.fnend         )
 ENDPROC(__dabt_svc)
@@ -357,7 +358,8 @@ ENDPROC(__pabt_svc)
        .endm
 
        .macro  kuser_cmpxchg_check
-#if !defined(CONFIG_CPU_32v6K) && !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
+#if !defined(CONFIG_CPU_32v6K) && defined(CONFIG_KUSER_HELPERS) && \
+    !defined(CONFIG_NEEDS_SYSCALL_FOR_CMPXCHG)
 #ifndef CONFIG_MMU
 #warning "NPTL on non MMU needs fixing"
 #else
@@ -684,8 +686,29 @@ ENDPROC(ret_from_exception)
 ENTRY(__switch_to)
  UNWIND(.fnstart       )
  UNWIND(.cantunwind    )
+#ifdef CONFIG_VFP_OPT
+       add     ip, r1, #TI_CPU_SAVE
+       stmfa   ip!, {r0, r1, r2, r5, r6, r8, lr}
+
+       @1. save vfp state for previous thread_info
+       mov     r0, r1
+       add     r0, r0, #TI_VFPSTATE    @ r0 = workspace
+       VFPFMRX r1, FPEXC
+       mov     r5, ip                  @ save ip to r5, because vfp_save_state may change ip
+       mov     r6, r2                  @ save r2 to r6, because vfp_save_state may change r2
+       bl      vfp_save_state
+       mov     ip, r5
+       mov     r2, r6
+
+       @ 2. restore vfp state from next thread_info
+       add     r2, r2, #TI_VFPSTATE    @ r2 = workspace
+       VFPFLDMIA       r2, r0          @ reload the working registers while
+                                       @ FPEXC is in a safe state
+       ldmia   r2, {r1, r5, r6, r8}    @ load FPEXC, FPSCR, FPINST, FPINST2
+       VFPFMXR FPSCR, r5               @ restore status
+       ldmfa   ip!, {r0, r1, r2, r5, r6, r8, lr}
+#endif
        add     ip, r1, #TI_CPU_SAVE
-       ldr     r3, [r2, #TI_TP_VALUE]
  ARM(  stmia   ip!, {r4 - sl, fp, sp, lr} )    @ Store most regs on stack
  THUMB(        stmia   ip!, {r4 - sl, fp}         )    @ Store most regs on stack
  THUMB(        str     sp, [ip], #4               )
@@ -693,7 +716,7 @@ ENTRY(__switch_to)
 #ifdef CONFIG_CPU_USE_DOMAINS
        ldr     r6, [r2, #TI_CPU_DOMAIN]
 #endif
-       set_tls r3, r4, r5
+       switch_tls r1, r2, r4, r5, r3, r7
 #if defined(CONFIG_CC_STACKPROTECTOR) && !defined(CONFIG_SMP)
        ldr     r7, [r2, #TI_TASK]
        ldr     r8, =__stack_chk_guard