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)
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
.endr
.endm
+#ifdef CONFIG_KUSER_HELPERS
.align 5
.globl __kuser_helper_start
__kuser_helper_start:
.globl __kuser_helper_end
__kuser_helper_end:
+#endif
+
THUMB( .thumb )
/*
1:
.endm
- .globl __stubs_start
+ .section .stubs, "ax", %progbits
__stubs_start:
@ This must be the first word
.word vector_swi
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