]> git.sur5r.net Git - freertos/blob
60e34dd9508ddb9d90ca0d9f5d3f2ff9205f0083
[freertos] /
1 /******************************************************************************
2 *
3 * (c) Copyright 2009-14 Xilinx, Inc. All rights reserved.
4 *
5 * This file contains confidential and proprietary information of Xilinx, Inc.
6 * and is protected under U.S. and international copyright and other
7 * intellectual property laws.
8 *
9 * DISCLAIMER
10 * This disclaimer is not a license and does not grant any rights to the
11 * materials distributed herewith. Except as otherwise provided in a valid
12 * license issued to you by Xilinx, and to the maximum extent permitted by
13 * applicable law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND WITH ALL
14 * FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES AND CONDITIONS, EXPRESS,
15 * IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO WARRANTIES OF
16 * MERCHANTABILITY, NON-INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE;
17 * and (2) Xilinx shall not be liable (whether in contract or tort, including
18 * negligence, or under any other theory of liability) for any loss or damage
19 * of any kind or nature related to, arising under or in connection with these
20 * materials, including for any direct, or any indirect, special, incidental,
21 * or consequential loss or damage (including loss of data, profits, goodwill,
22 * or any type of loss or damage suffered as a result of any action brought by
23 * a third party) even if such damage or loss was reasonably foreseeable or
24 * Xilinx had been advised of the possibility of the same.
25 *
26 * CRITICAL APPLICATIONS
27 * Xilinx products are not designed or intended to be fail-safe, or for use in
28 * any application requiring fail-safe performance, such as life-support or
29 * safety devices or systems, Class III medical devices, nuclear facilities,
30 * applications related to the deployment of airbags, or any other applications
31 * that could lead to death, personal injury, or severe property or
32 * environmental damage (individually and collectively, "Critical
33 * Applications"). Customer assumes the sole risk and liability of any use of
34 * Xilinx products in Critical Applications, subject only to applicable laws
35 * and regulations governing limitations on product liability.
36 *
37 * THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS PART OF THIS FILE
38 * AT ALL TIMES.
39 *
40 ******************************************************************************/
41 /*****************************************************************************/
42 /**
43 * @file asm_vectors.s
44 *
45 * This file contains the initial vector table for the Cortex A9 processor
46 *
47 * <pre>
48 * MODIFICATION HISTORY:
49 *
50 * Ver   Who     Date     Changes
51 * ----- ------- -------- ---------------------------------------------------
52 * 1.00a ecm/sdm 10/20/09 Initial version
53 * 3.05a sdm     02/02/12 Save lr when profiling is enabled
54 * 3.10a srt     04/18/13 Implemented ARM Erratas. Please refer to file
55 *                        'xil_errata.h' for errata description
56 * 4.00a pkp     22/01/14 Modified return addresses for interrupt 
57 *                        handlers (DataAbortHandler and SVCHandler)
58 *                        to fix CR#767251
59 * </pre>
60 *
61 * @note
62 *
63 * None.
64 *
65 ******************************************************************************/
66 #include "xil_errata.h"
67
68 #define __ARM_NEON__ 1
69
70 .org 0
71 .text
72
73 .globl _boot
74 .globl _vector_table
75
76 .globl FIQInterrupt
77 .globl IRQInterrupt
78 .globl SWInterrupt
79 .globl DataAbortInterrupt
80 .globl PrefetchAbortInterrupt
81
82 .globl IRQHandler
83 .globl prof_pc
84
85 .section .vectors
86 _vector_table:
87         B       _boot
88         B       Undefined
89         B       SVCHandler
90         B       PrefetchAbortHandler
91         B       DataAbortHandler
92         NOP     /* Placeholder for address exception vector*/
93         B       IRQHandler
94         B       FIQHandler
95
96
97 IRQHandler:                                     /* IRQ vector handler */
98         
99         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code*/
100 #ifdef __ARM_NEON__
101         vpush {d0-d7}
102         vpush {d16-d31}
103         vmrs r1, FPSCR
104         push {r1}
105         vmrs r1, FPEXC
106         push {r1}
107 #endif
108
109 #ifdef PROFILING
110         ldr     r2, =prof_pc
111         subs    r3, lr, #0
112         str     r3, [r2]
113 #endif
114
115         bl      IRQInterrupt                    /* IRQ vector */
116         
117 #ifdef __ARM_NEON__
118         pop     {r1}
119         vmsr    FPEXC, r1
120         pop     {r1}
121         vmsr    FPSCR, r1
122         vpop    {d16-d31}
123         vpop    {d0-d7}
124 #endif
125         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
126         
127
128         subs    pc, lr, #4                      /* adjust return */
129
130
131 FIQHandler:                                     /* FIQ vector handler */
132         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
133 #ifdef __ARM_NEON__
134         vpush {d0-d7}
135         vpush {d16-d31}
136         vmrs r1, FPSCR
137         push {r1}
138         vmrs r1, FPEXC
139         push {r1}
140 #endif
141
142 FIQLoop:
143         bl      FIQInterrupt                    /* FIQ vector */
144
145 #ifdef __ARM_NEON__
146         pop     {r1}
147         vmsr    FPEXC, r1
148         pop     {r1}
149         vmsr    FPSCR, r1
150         vpop    {d16-d31}
151         vpop    {d0-d7}
152 #endif
153         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
154         subs    pc, lr, #4                      /* adjust return */
155
156
157 Undefined:                                      /* Undefined handler */
158         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
159
160         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
161
162         b       _prestart                       
163
164         movs    pc, lr
165
166
167 SVCHandler:                                     /* SWI handler */
168         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
169
170         tst     r0, #0x20                       /* check the T bit */
171         ldrneh  r0, [lr,#-2]                    /* Thumb mode */
172         bicne   r0, r0, #0xff00                 /* Thumb mode */
173         ldreq   r0, [lr,#-4]                    /* ARM mode */
174         biceq   r0, r0, #0xff000000             /* ARM mode */
175
176         bl      SWInterrupt                     /* SWInterrupt: call C function here */
177
178         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
179
180         movs    pc, lr          /*return to the next instruction after the SWI instruction */
181
182
183 DataAbortHandler:                               /* Data Abort handler */
184 #ifdef CONFIG_ARM_ERRATA_775420
185         dsb
186 #endif
187         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
188
189         bl      DataAbortInterrupt              /*DataAbortInterrupt :call C function here */
190
191         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
192
193         subs    pc, lr, #8                      /* points to the instruction that caused the Data Abort exception */
194
195 PrefetchAbortHandler:                           /* Prefetch Abort handler */
196 #ifdef CONFIG_ARM_ERRATA_775420
197         dsb
198 #endif
199         stmdb   sp!,{r0-r3,r12,lr}              /* state save from compiled code */
200
201         bl      PrefetchAbortInterrupt          /* PrefetchAbortInterrupt: call C function here */
202
203         ldmia   sp!,{r0-r3,r12,lr}              /* state restore from compiled code */
204
205         subs    pc, lr, #4                      /* points to the instruction that caused the Prefetch Abort exception */
206
207
208 .end