]> git.sur5r.net Git - freertos/blob
ae2b2b54f56eb1aeee7fcc41035f9fbcbcb934b5
[freertos] /
1 /******************************************************************************
2 *
3 * Copyright (C) 2009 - 2014 Xilinx, Inc.  All rights reserved.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a copy
6 * of this software and associated documentation files (the "Software"), to deal
7 * in the Software without restriction, including without limitation the rights
8 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 * copies of the Software, and to permit persons to whom the Software is
10 * furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * Use of the Software is limited solely to applications:
16 * (a) running on a Xilinx device, or
17 * (b) that interact with a Xilinx device through a bus or interconnect.
18 *
19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
22 * XILINX  BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
24 * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
25 * SOFTWARE.
26 *
27 * Except as contained in this notice, the name of the Xilinx shall not be used
28 * in advertising or otherwise to promote the sale, use or other dealings in
29 * this Software without prior written authorization from Xilinx.
30 *
31 ******************************************************************************/
32 /*****************************************************************************/
33 /**
34 * @file asm_vectors.s
35 *
36 * This file contains the initial vector table for the Cortex A9 processor
37 *
38 * <pre>
39 * MODIFICATION HISTORY:
40 *
41 * Ver   Who     Date     Changes
42 * ----- ------- -------- ---------------------------------------------------
43 * 1.00a ecm/sdm 10/20/09 Initial version
44 * 3.05a sdm     02/02/12 Save lr when profiling is enabled
45 * 3.10a srt     04/18/13 Implemented ARM Erratas. Please refer to file
46 *                        'xil_errata.h' for errata description
47 * 4.00a pkp     22/01/14 Modified return addresses for interrupt 
48 *                        handlers (DataAbortHandler and SVCHandler)
49 *                        to fix CR#767251
50 * </pre>
51 *
52 * @note
53 *
54 * None.
55 *
56 ******************************************************************************/
57 #include "xil_errata.h"
58
59 #define __ARM_NEON__ 1
60
61 .org 0
62 .text
63
64 .globl _boot
65 .globl _vector_table
66
67 .globl FIQInterrupt
68 .globl IRQInterrupt
69 .globl SWInterrupt
70 .globl DataAbortInterrupt
71 .globl PrefetchAbortInterrupt
72
73 .globl IRQHandler
74 .globl prof_pc
75
76 .section .vectors
77 _vector_table:
78         B       _boot
79         B       Undefined
80         B       SVCHandler
81         B       PrefetchAbortHandler
82         B       DataAbortHandler
83         NOP     /* Placeholder for address exception vector*/
84         B       IRQHandler
85         B       FIQHandler
86
87
88 IRQHandler:                                     /* IRQ vector handler */
89         
90         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code*/
91 #ifdef __ARM_NEON__
92         vpush {d0-d7}
93         vpush {d16-d31}
94         vmrs r1, FPSCR
95         push {r1}
96         vmrs r1, FPEXC
97         push {r1}
98 #endif
99
100 #ifdef PROFILING
101         ldr     r2, =prof_pc
102         subs    r3, lr, #0
103         str     r3, [r2]
104 #endif
105
106         bl      IRQInterrupt                    /* IRQ vector */
107         
108 #ifdef __ARM_NEON__
109         pop     {r1}
110         vmsr    FPEXC, r1
111         pop     {r1}
112         vmsr    FPSCR, r1
113         vpop    {d16-d31}
114         vpop    {d0-d7}
115 #endif
116         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
117         
118
119         subs    pc, lr, #4                      /* adjust return */
120
121
122 FIQHandler:                                     /* FIQ vector handler */
123         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
124 #ifdef __ARM_NEON__
125         vpush {d0-d7}
126         vpush {d16-d31}
127         vmrs r1, FPSCR
128         push {r1}
129         vmrs r1, FPEXC
130         push {r1}
131 #endif
132
133 FIQLoop:
134         bl      FIQInterrupt                    /* FIQ vector */
135
136 #ifdef __ARM_NEON__
137         pop     {r1}
138         vmsr    FPEXC, r1
139         pop     {r1}
140         vmsr    FPSCR, r1
141         vpop    {d16-d31}
142         vpop    {d0-d7}
143 #endif
144         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
145         subs    pc, lr, #4                      /* adjust return */
146
147
148 Undefined:                                      /* Undefined handler */
149         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
150
151         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
152
153         b       _prestart                       
154
155         movs    pc, lr
156
157
158 SVCHandler:                                     /* SWI handler */
159         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
160
161         tst     r0, #0x20                       /* check the T bit */
162         ldrneh  r0, [lr,#-2]                    /* Thumb mode */
163         bicne   r0, r0, #0xff00                 /* Thumb mode */
164         ldreq   r0, [lr,#-4]                    /* ARM mode */
165         biceq   r0, r0, #0xff000000             /* ARM mode */
166
167         bl      SWInterrupt                     /* SWInterrupt: call C function here */
168
169         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
170
171         movs    pc, lr          /*return to the next instruction after the SWI instruction */
172
173
174 DataAbortHandler:                               /* Data Abort handler */
175 #ifdef CONFIG_ARM_ERRATA_775420
176         dsb
177 #endif
178         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
179
180         bl      DataAbortInterrupt              /*DataAbortInterrupt :call C function here */
181
182         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
183
184         subs    pc, lr, #8                      /* points to the instruction that caused the Data Abort exception */
185
186 PrefetchAbortHandler:                           /* Prefetch Abort handler */
187 #ifdef CONFIG_ARM_ERRATA_775420
188         dsb
189 #endif
190         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
191
192         bl      PrefetchAbortInterrupt          /* PrefetchAbortInterrupt: call C function here */
193
194         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
195
196         subs    pc, lr, #4                      /* points to the instruction that caused the Prefetch Abort exception */
197
198
199 .end