Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris...
[linux/fpc-iii.git] / arch / arm / vfp / entry.S
blob46e17492fd1f3ecccda92c660474c805707b788b
1 /*
2  *  linux/arch/arm/vfp/entry.S
3  *
4  *  Copyright (C) 2004 ARM Limited.
5  *  Written by Deep Blue Solutions Limited.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License version 2 as
9  * published by the Free Software Foundation.
10  */
11 #include <asm/thread_info.h>
12 #include <asm/vfpmacros.h>
13 #include "../kernel/entry-header.S"
15 @ VFP entry point.
17 @  r0  = instruction opcode (32-bit ARM or two 16-bit Thumb)
18 @  r2  = PC value to resume execution after successful emulation
19 @  r9  = normal "successful" return address
20 @  r10 = this threads thread_info structure
21 @  lr  = unrecognised instruction return address
22 @  IRQs disabled.
24 ENTRY(do_vfp)
25 #ifdef CONFIG_PREEMPT_COUNT
26         ldr     r4, [r10, #TI_PREEMPT]  @ get preempt count
27         add     r11, r4, #1             @ increment it
28         str     r11, [r10, #TI_PREEMPT]
29 #endif
30         enable_irq
31         ldr     r4, .LCvfp
32         ldr     r11, [r10, #TI_CPU]     @ CPU number
33         add     r10, r10, #TI_VFPSTATE  @ r10 = workspace
34         ldr     pc, [r4]                @ call VFP entry point
35 ENDPROC(do_vfp)
37 ENTRY(vfp_null_entry)
38 #ifdef CONFIG_PREEMPT_COUNT
39         get_thread_info r10
40         ldr     r4, [r10, #TI_PREEMPT]  @ get preempt count
41         sub     r11, r4, #1             @ decrement it
42         str     r11, [r10, #TI_PREEMPT]
43 #endif
44         mov     pc, lr
45 ENDPROC(vfp_null_entry)
47         .align  2
48 .LCvfp:
49         .word   vfp_vector
51 @ This code is called if the VFP does not exist. It needs to flag the
52 @ failure to the VFP initialisation code.
54         __INIT
55 ENTRY(vfp_testing_entry)
56 #ifdef CONFIG_PREEMPT_COUNT
57         get_thread_info r10
58         ldr     r4, [r10, #TI_PREEMPT]  @ get preempt count
59         sub     r11, r4, #1             @ decrement it
60         str     r11, [r10, #TI_PREEMPT]
61 #endif
62         ldr     r0, VFP_arch_address
63         str     r0, [r0]                @ set to non-zero value
64         mov     pc, r9                  @ we have handled the fault
65 ENDPROC(vfp_testing_entry)
67         .align  2
68 VFP_arch_address:
69         .word   VFP_arch
71         __FINIT