import PULS_20160108
[GitHub/mt8127/android_kernel_alcatel_ttab.git] / arch / arm / kernel / entry-armv.S
index bc2180d3f6ec2d987ab6ddf9bafd1648b263dd49..ea4e710f4774f377ff2e57e2a48720c96d2c9949 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)
@@ -684,6 +685,28 @@ 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
@@ -752,6 +775,7 @@ ENDPROC(__switch_to)
        .endr
        .endm
 
+#ifdef CONFIG_KUSER_HELPERS
        .align  5
        .globl  __kuser_helper_start
 __kuser_helper_start:
@@ -938,6 +962,8 @@ __kuser_helper_version:                             @ 0xffff0ffc
        .globl  __kuser_helper_end
 __kuser_helper_end:
 
+#endif
+
  THUMB(        .thumb  )
 
 /*
@@ -992,7 +1018,7 @@ ENDPROC(vector_\name)
 1:
        .endm
 
-       .globl  __stubs_start
+       .section .stubs, "ax", %progbits
 __stubs_start:
        @ This must be the first word
        .word   vector_swi
@@ -1119,24 +1145,19 @@ vector_addrexcptn:
 vector_fiq:
        subs    pc, lr, #4
 
-       .globl  __stubs_end
-__stubs_end:
-
-       .equ    stubs_offset, __vectors_start + 0x1000 - __stubs_start
+       .globl  vector_fiq_offset
+       .equ    vector_fiq_offset, vector_fiq
 
-       .globl  __vectors_start
+       .section .vectors, "ax", %progbits
 __vectors_start:
-       W(b)    vector_rst + stubs_offset
-       W(b)    vector_und + stubs_offset
-       W(ldr)  pc, .LCvswi + stubs_offset
-       W(b)    vector_pabt + stubs_offset
-       W(b)    vector_dabt + stubs_offset
-       W(b)    vector_addrexcptn + stubs_offset
-       W(b)    vector_irq + stubs_offset
-       W(b)    vector_fiq + stubs_offset
-
-       .globl  __vectors_end
-__vectors_end:
+       W(b)    vector_rst
+       W(b)    vector_und
+       W(ldr)  pc, __vectors_start + 0x1000
+       W(b)    vector_pabt
+       W(b)    vector_dabt
+       W(b)    vector_addrexcptn
+       W(b)    vector_irq
+       W(b)    vector_fiq
 
        .data