xref: /nrf52832-nimble/rt-thread/libcpu/arm/cortex-r4/start_gcc.S (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero/*
2*10465441SEvalZero * Copyright (c) 2006-2018, RT-Thread Development Team
3*10465441SEvalZero *
4*10465441SEvalZero * SPDX-License-Identifier: Apache-2.0
5*10465441SEvalZero *
6*10465441SEvalZero * Change Logs:
7*10465441SEvalZero * Date           Author       Notes
8*10465441SEvalZero */
9*10465441SEvalZero@-------------------------------------------------------------------------------
10*10465441SEvalZero@ sys_core.asm
11*10465441SEvalZero@
12*10465441SEvalZero@ (c) Texas Instruments 2009-2013, All rights reserved.
13*10465441SEvalZero@
14*10465441SEvalZero
15*10465441SEvalZero#include <rtconfig.h>
16*10465441SEvalZero
17*10465441SEvalZero.equ Mode_USR,        0x10
18*10465441SEvalZero.equ Mode_FIQ,        0x11
19*10465441SEvalZero.equ Mode_IRQ,        0x12
20*10465441SEvalZero.equ Mode_SVC,        0x13
21*10465441SEvalZero.equ Mode_ABT,        0x17
22*10465441SEvalZero.equ Mode_UND,        0x1B
23*10465441SEvalZero.equ Mode_SYS,        0x1F
24*10465441SEvalZero
25*10465441SEvalZero.equ I_Bit,           0x80            @ when I bit is set, IRQ is disabled
26*10465441SEvalZero.equ F_Bit,           0x40            @ when F bit is set, FIQ is disabled
27*10465441SEvalZero
28*10465441SEvalZero.equ UND_Stack_Size,  0x00000000
29*10465441SEvalZero.equ SVC_Stack_Size,  0x00000000
30*10465441SEvalZero.equ ABT_Stack_Size,  0x00000000
31*10465441SEvalZero.equ FIQ_Stack_Size,  0x00001000
32*10465441SEvalZero.equ IRQ_Stack_Size,  0x00001000
33*10465441SEvalZero
34*10465441SEvalZero.section .bss.noinit
35*10465441SEvalZero/* stack */
36*10465441SEvalZero.globl stack_start
37*10465441SEvalZero.globl stack_top
38*10465441SEvalZero
39*10465441SEvalZerostack_start:
40*10465441SEvalZero.rept (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size)
41*10465441SEvalZero.byte 0
42*10465441SEvalZero.endr
43*10465441SEvalZerostack_top:
44*10465441SEvalZero
45*10465441SEvalZero.section .text, "ax"
46*10465441SEvalZero    .text
47*10465441SEvalZero    .arm
48*10465441SEvalZero
49*10465441SEvalZero    .globl _c_int00
50*10465441SEvalZero
51*10465441SEvalZero.globl _reset
52*10465441SEvalZero_reset:
53*10465441SEvalZero@-------------------------------------------------------------------------------
54*10465441SEvalZero@ Initialize CPU Registers
55*10465441SEvalZero@ After reset, the CPU is in the Supervisor mode (M = 10011)
56*10465441SEvalZero        cpsid  if, #19
57*10465441SEvalZero
58*10465441SEvalZero#if defined (__VFP_FP__) && !defined(__SOFTFP__) && defined(RT_VFP_LAZY_STACKING)
59*10465441SEvalZero        @ Turn on FPV coprocessor
60*10465441SEvalZero        mrc   p15,     #0x00,      r2,       c1, c0, #0x02
61*10465441SEvalZero        orr   r2,      r2,         #0xF00000
62*10465441SEvalZero        mcr   p15,     #0x00,      r2,       c1, c0, #0x02
63*10465441SEvalZero
64*10465441SEvalZero        fmrx  r2,      fpexc
65*10465441SEvalZero        orr   r2,      r2,   #0x40000000
66*10465441SEvalZero        fmxr  fpexc,   r2
67*10465441SEvalZero#endif
68*10465441SEvalZero
69*10465441SEvalZero@-------------------------------------------------------------------------------
70*10465441SEvalZero@ Initialize Stack Pointers
71*10465441SEvalZero    ldr     r0, =stack_top
72*10465441SEvalZero
73*10465441SEvalZero    @  Set the startup stack for svc
74*10465441SEvalZero    mov     sp, r0
75*10465441SEvalZero
76*10465441SEvalZero    @  Enter Undefined Instruction Mode and set its Stack Pointer
77*10465441SEvalZero    msr     cpsr_c, #Mode_UND|I_Bit|F_Bit
78*10465441SEvalZero    mov     sp, r0
79*10465441SEvalZero    sub     r0, r0, #UND_Stack_Size
80*10465441SEvalZero
81*10465441SEvalZero    @  Enter Abort Mode and set its Stack Pointer
82*10465441SEvalZero    msr     cpsr_c, #Mode_ABT|I_Bit|F_Bit
83*10465441SEvalZero    mov     sp, r0
84*10465441SEvalZero    sub     r0, r0, #ABT_Stack_Size
85*10465441SEvalZero
86*10465441SEvalZero    @  Enter FIQ Mode and set its Stack Pointer
87*10465441SEvalZero    msr     cpsr_c, #Mode_FIQ|I_Bit|F_Bit
88*10465441SEvalZero    mov     sp, r0
89*10465441SEvalZero    sub     r0, r0, #FIQ_Stack_Size
90*10465441SEvalZero
91*10465441SEvalZero    @  Enter IRQ Mode and set its Stack Pointer
92*10465441SEvalZero    msr     cpsr_c, #Mode_IRQ|I_Bit|F_Bit
93*10465441SEvalZero    mov     sp, r0
94*10465441SEvalZero    sub     r0, r0, #IRQ_Stack_Size
95*10465441SEvalZero
96*10465441SEvalZero    @  Switch back to SVC
97*10465441SEvalZero    msr     cpsr_c, #Mode_SVC|I_Bit|F_Bit
98*10465441SEvalZero
99*10465441SEvalZero        bl    next1
100*10465441SEvalZeronext1:
101*10465441SEvalZero        bl    next2
102*10465441SEvalZeronext2:
103*10465441SEvalZero        bl    next3
104*10465441SEvalZeronext3:
105*10465441SEvalZero        bl    next4
106*10465441SEvalZeronext4:
107*10465441SEvalZero        ldr  lr, =_c_int00
108*10465441SEvalZero        bx   lr
109*10465441SEvalZero
110*10465441SEvalZero.globl data_init
111*10465441SEvalZerodata_init:
112*10465441SEvalZero        /* copy .data to SRAM */
113*10465441SEvalZero        ldr     r1, =_sidata            /* .data start in image */
114*10465441SEvalZero        ldr     r2, =_edata             /* .data end in image   */
115*10465441SEvalZero        ldr     r3, =_sdata             /* sram data start      */
116*10465441SEvalZerodata_loop:
117*10465441SEvalZero        ldr     r0, [r1, #0]
118*10465441SEvalZero        str     r0, [r3]
119*10465441SEvalZero
120*10465441SEvalZero        add     r1, r1, #4
121*10465441SEvalZero        add     r3, r3, #4
122*10465441SEvalZero
123*10465441SEvalZero        cmp     r3, r2                   /* check if data to clear */
124*10465441SEvalZero        blo     data_loop                /* loop until done        */
125*10465441SEvalZero
126*10465441SEvalZero        /* clear .bss */
127*10465441SEvalZero        mov     r0,#0                   /* get a zero */
128*10465441SEvalZero        ldr     r1,=__bss_start         /* bss start  */
129*10465441SEvalZero        ldr     r2,=__bss_end           /* bss end    */
130*10465441SEvalZero
131*10465441SEvalZerobss_loop:
132*10465441SEvalZero        cmp     r1,r2                   /* check if data to clear */
133*10465441SEvalZero        strlo   r0,[r1],#4              /* clear 4 bytes          */
134*10465441SEvalZero        blo     bss_loop                /* loop until done        */
135*10465441SEvalZero
136*10465441SEvalZero    /* call C++ constructors of global objects                          */
137*10465441SEvalZero    ldr     r0, =__ctors_start__
138*10465441SEvalZero    ldr     r1, =__ctors_end__
139*10465441SEvalZero
140*10465441SEvalZeroctor_loop:
141*10465441SEvalZero    cmp     r0, r1
142*10465441SEvalZero    beq     ctor_end
143*10465441SEvalZero    ldr     r2, [r0], #4
144*10465441SEvalZero    stmfd   sp!, {r0-r3, ip, lr}
145*10465441SEvalZero    mov     lr, pc
146*10465441SEvalZero    bx      r2
147*10465441SEvalZero    ldmfd   sp!, {r0-r3, ip, lr}
148*10465441SEvalZero    b       ctor_loop
149*10465441SEvalZeroctor_end:
150*10465441SEvalZero    bx lr
151*10465441SEvalZero
152*10465441SEvalZero@-------------------------------------------------------------------------------
153*10465441SEvalZero@ Enable RAM ECC Support
154*10465441SEvalZero
155*10465441SEvalZero    .globl     _coreEnableRamEcc_
156*10465441SEvalZero_coreEnableRamEcc_:
157*10465441SEvalZero
158*10465441SEvalZero        stmfd sp!, {r0}
159*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
160*10465441SEvalZero        orr   r0,  r0,    #0x0C000000
161*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
162*10465441SEvalZero        ldmfd sp!, {r0}
163*10465441SEvalZero        bx    lr
164*10465441SEvalZero
165*10465441SEvalZero@-------------------------------------------------------------------------------
166*10465441SEvalZero@ Disable RAM ECC Support
167*10465441SEvalZero
168*10465441SEvalZero    .globl     _coreDisableRamEcc_
169*10465441SEvalZero_coreDisableRamEcc_:
170*10465441SEvalZero
171*10465441SEvalZero        stmfd sp!, {r0}
172*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
173*10465441SEvalZero        bic   r0,  r0,    #0x0C000000
174*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
175*10465441SEvalZero        ldmfd sp!, {r0}
176*10465441SEvalZero        bx    lr
177*10465441SEvalZero
178*10465441SEvalZero
179*10465441SEvalZero@-------------------------------------------------------------------------------
180*10465441SEvalZero@ Enable Flash ECC Support
181*10465441SEvalZero
182*10465441SEvalZero    .globl     _coreEnableFlashEcc_
183*10465441SEvalZero_coreEnableFlashEcc_:
184*10465441SEvalZero
185*10465441SEvalZero        stmfd sp!, {r0}
186*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
187*10465441SEvalZero        orr   r0,  r0,    #0x02000000
188*10465441SEvalZero        dmb
189*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
190*10465441SEvalZero        ldmfd sp!, {r0}
191*10465441SEvalZero        bx    lr
192*10465441SEvalZero
193*10465441SEvalZero@-------------------------------------------------------------------------------
194*10465441SEvalZero@ Disable Flash ECC Support
195*10465441SEvalZero
196*10465441SEvalZero    .globl     _coreDisableFlashEcc_
197*10465441SEvalZero_coreDisableFlashEcc_:
198*10465441SEvalZero
199*10465441SEvalZero        stmfd sp!, {r0}
200*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
201*10465441SEvalZero        bic   r0,  r0,    #0x02000000
202*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
203*10465441SEvalZero        ldmfd sp!, {r0}
204*10465441SEvalZero        bx    lr
205*10465441SEvalZero
206*10465441SEvalZero
207*10465441SEvalZero@-------------------------------------------------------------------------------
208*10465441SEvalZero@ Get data fault status register
209*10465441SEvalZero
210*10465441SEvalZero    .globl     _coreGetDataFault_
211*10465441SEvalZero_coreGetDataFault_:
212*10465441SEvalZero
213*10465441SEvalZero        mrc   p15, #0, r0, c5, c0,  #0
214*10465441SEvalZero        bx    lr
215*10465441SEvalZero
216*10465441SEvalZero
217*10465441SEvalZero
218*10465441SEvalZero@-------------------------------------------------------------------------------
219*10465441SEvalZero@ Clear data fault status register
220*10465441SEvalZero
221*10465441SEvalZero    .globl     _coreClearDataFault_
222*10465441SEvalZero_coreClearDataFault_:
223*10465441SEvalZero
224*10465441SEvalZero        stmfd sp!, {r0}
225*10465441SEvalZero        mov   r0,  #0
226*10465441SEvalZero        mcr   p15, #0, r0, c5, c0,  #0
227*10465441SEvalZero        ldmfd sp!, {r0}
228*10465441SEvalZero        bx    lr
229*10465441SEvalZero
230*10465441SEvalZero
231*10465441SEvalZero
232*10465441SEvalZero@-------------------------------------------------------------------------------
233*10465441SEvalZero@ Get instruction fault status register
234*10465441SEvalZero
235*10465441SEvalZero    .globl     _coreGetInstructionFault_
236*10465441SEvalZero_coreGetInstructionFault_:
237*10465441SEvalZero
238*10465441SEvalZero        mrc   p15, #0, r0, c5, c0, #1
239*10465441SEvalZero        bx    lr
240*10465441SEvalZero
241*10465441SEvalZero
242*10465441SEvalZero
243*10465441SEvalZero@-------------------------------------------------------------------------------
244*10465441SEvalZero@ Clear instruction fault status register
245*10465441SEvalZero
246*10465441SEvalZero    .globl     _coreClearInstructionFault_
247*10465441SEvalZero_coreClearInstructionFault_:
248*10465441SEvalZero
249*10465441SEvalZero        stmfd sp!, {r0}
250*10465441SEvalZero        mov   r0,  #0
251*10465441SEvalZero        mcr   p15, #0, r0, c5, c0, #1
252*10465441SEvalZero        ldmfd sp!, {r0}
253*10465441SEvalZero        bx    lr
254*10465441SEvalZero
255*10465441SEvalZero
256*10465441SEvalZero
257*10465441SEvalZero@-------------------------------------------------------------------------------
258*10465441SEvalZero@ Get data fault address register
259*10465441SEvalZero
260*10465441SEvalZero    .globl     _coreGetDataFaultAddress_
261*10465441SEvalZero_coreGetDataFaultAddress_:
262*10465441SEvalZero
263*10465441SEvalZero        mrc   p15, #0, r0, c6, c0,  #0
264*10465441SEvalZero        bx    lr
265*10465441SEvalZero
266*10465441SEvalZero
267*10465441SEvalZero
268*10465441SEvalZero@-------------------------------------------------------------------------------
269*10465441SEvalZero@ Clear data fault address register
270*10465441SEvalZero
271*10465441SEvalZero    .globl     _coreClearDataFaultAddress_
272*10465441SEvalZero_coreClearDataFaultAddress_:
273*10465441SEvalZero
274*10465441SEvalZero        stmfd sp!, {r0}
275*10465441SEvalZero        mov   r0,  #0
276*10465441SEvalZero        mcr   p15, #0, r0, c6, c0,  #0
277*10465441SEvalZero        ldmfd sp!, {r0}
278*10465441SEvalZero        bx    lr
279*10465441SEvalZero
280*10465441SEvalZero
281*10465441SEvalZero
282*10465441SEvalZero@-------------------------------------------------------------------------------
283*10465441SEvalZero@ Get instruction fault address register
284*10465441SEvalZero
285*10465441SEvalZero    .globl     _coreGetInstructionFaultAddress_
286*10465441SEvalZero_coreGetInstructionFaultAddress_:
287*10465441SEvalZero
288*10465441SEvalZero        mrc   p15, #0, r0, c6, c0, #2
289*10465441SEvalZero        bx    lr
290*10465441SEvalZero
291*10465441SEvalZero
292*10465441SEvalZero
293*10465441SEvalZero@-------------------------------------------------------------------------------
294*10465441SEvalZero@ Clear instruction fault address register
295*10465441SEvalZero
296*10465441SEvalZero    .globl     _coreClearInstructionFaultAddress_
297*10465441SEvalZero_coreClearInstructionFaultAddress_:
298*10465441SEvalZero
299*10465441SEvalZero        stmfd sp!, {r0}
300*10465441SEvalZero        mov   r0,  #0
301*10465441SEvalZero        mcr   p15, #0, r0, c6, c0, #2
302*10465441SEvalZero        ldmfd sp!, {r0}
303*10465441SEvalZero        bx    lr
304*10465441SEvalZero
305*10465441SEvalZero
306*10465441SEvalZero
307*10465441SEvalZero@-------------------------------------------------------------------------------
308*10465441SEvalZero@ Get auxiliary data fault status register
309*10465441SEvalZero
310*10465441SEvalZero    .globl     _coreGetAuxiliaryDataFault_
311*10465441SEvalZero_coreGetAuxiliaryDataFault_:
312*10465441SEvalZero
313*10465441SEvalZero        mrc   p15, #0, r0, c5, c1, #0
314*10465441SEvalZero        bx    lr
315*10465441SEvalZero
316*10465441SEvalZero
317*10465441SEvalZero
318*10465441SEvalZero@-------------------------------------------------------------------------------
319*10465441SEvalZero@ Clear auxiliary data fault status register
320*10465441SEvalZero
321*10465441SEvalZero    .globl     _coreClearAuxiliaryDataFault_
322*10465441SEvalZero_coreClearAuxiliaryDataFault_:
323*10465441SEvalZero
324*10465441SEvalZero        stmfd sp!, {r0}
325*10465441SEvalZero        mov   r0,  #0
326*10465441SEvalZero        mcr   p15, #0, r0, c5, c1, #0
327*10465441SEvalZero        ldmfd sp!, {r0}
328*10465441SEvalZero        bx    lr
329*10465441SEvalZero
330*10465441SEvalZero
331*10465441SEvalZero
332*10465441SEvalZero@-------------------------------------------------------------------------------
333*10465441SEvalZero@ Get auxiliary instruction fault status register
334*10465441SEvalZero
335*10465441SEvalZero    .globl     _coreGetAuxiliaryInstructionFault_
336*10465441SEvalZero_coreGetAuxiliaryInstructionFault_:
337*10465441SEvalZero
338*10465441SEvalZero        mrc   p15, #0, r0, c5, c1, #1
339*10465441SEvalZero        bx    lr
340*10465441SEvalZero
341*10465441SEvalZero
342*10465441SEvalZero@-------------------------------------------------------------------------------
343*10465441SEvalZero@ Clear auxiliary instruction fault status register
344*10465441SEvalZero
345*10465441SEvalZero    .globl     _coreClearAuxiliaryInstructionFault_
346*10465441SEvalZero_coreClearAuxiliaryInstructionFault_:
347*10465441SEvalZero
348*10465441SEvalZero        stmfd sp!, {r0}
349*10465441SEvalZero        mov   r0,  #0
350*10465441SEvalZero        mrc   p15, #0, r0, c5, c1, #1
351*10465441SEvalZero        ldmfd sp!, {r0}
352*10465441SEvalZero        bx    lr
353*10465441SEvalZero
354*10465441SEvalZero
355*10465441SEvalZero@-------------------------------------------------------------------------------
356*10465441SEvalZero@ Clear ESM CCM errorss
357*10465441SEvalZero
358*10465441SEvalZero       .globl _esmCcmErrorsClear_
359*10465441SEvalZero_esmCcmErrorsClear_:
360*10465441SEvalZero
361*10465441SEvalZero        stmfd sp!, {r0-r2}
362*10465441SEvalZero        ldr   r0, ESMSR1_REG    @ load the ESMSR1 status register address
363*10465441SEvalZero        ldr   r2, ESMSR1_ERR_CLR
364*10465441SEvalZero        str   r2, [r0]         @ clear the ESMSR1 register
365*10465441SEvalZero
366*10465441SEvalZero        ldr   r0, ESMSR2_REG    @ load the ESMSR2 status register address
367*10465441SEvalZero        ldr   r2, ESMSR2_ERR_CLR
368*10465441SEvalZero        str   r2, [r0]         @ clear the ESMSR2 register
369*10465441SEvalZero
370*10465441SEvalZero        ldr   r0, ESMSSR2_REG    @ load the ESMSSR2 status register address
371*10465441SEvalZero        ldr   r2, ESMSSR2_ERR_CLR
372*10465441SEvalZero        str   r2, [r0]             @ clear the ESMSSR2 register
373*10465441SEvalZero
374*10465441SEvalZero        ldr   r0, ESMKEY_REG    @ load the ESMKEY register address
375*10465441SEvalZero        mov   r2, #0x5             @ load R2 with 0x5
376*10465441SEvalZero        str   r2, [r0]             @ clear the ESMKEY register
377*10465441SEvalZero
378*10465441SEvalZero        ldr   r0, VIM_INTREQ    @ load the INTREQ register address
379*10465441SEvalZero        ldr   r2, VIM_INT_CLR
380*10465441SEvalZero        str   r2, [r0]         @ clear the INTREQ register
381*10465441SEvalZero        ldr   r0, CCMR4_STAT_REG    @ load the CCMR4 status register address
382*10465441SEvalZero        ldr   r2, CCMR4_ERR_CLR
383*10465441SEvalZero        str   r2, [r0]         @ clear the CCMR4 status register
384*10465441SEvalZero        ldmfd sp!, {r0-r2}
385*10465441SEvalZero        bx    lr
386*10465441SEvalZero
387*10465441SEvalZeroESMSR1_REG:        .word 0xFFFFF518
388*10465441SEvalZeroESMSR2_REG:       .word 0xFFFFF51C
389*10465441SEvalZeroESMSR3_REG:       .word 0xFFFFF520
390*10465441SEvalZeroESMKEY_REG:       .word 0xFFFFF538
391*10465441SEvalZeroESMSSR2_REG:       .word 0xFFFFF53C
392*10465441SEvalZeroCCMR4_STAT_REG:    .word 0xFFFFF600
393*10465441SEvalZeroERR_CLR_WRD:       .word 0xFFFFFFFF
394*10465441SEvalZeroCCMR4_ERR_CLR:     .word 0x00010000
395*10465441SEvalZeroESMSR1_ERR_CLR:    .word 0x80000000
396*10465441SEvalZeroESMSR2_ERR_CLR:    .word 0x00000004
397*10465441SEvalZeroESMSSR2_ERR_CLR:   .word 0x00000004
398*10465441SEvalZeroVIM_INT_CLR:       .word 0x00000001
399*10465441SEvalZeroVIM_INTREQ:        .word 0xFFFFFE20
400*10465441SEvalZero
401*10465441SEvalZero
402*10465441SEvalZero@-------------------------------------------------------------------------------
403*10465441SEvalZero@ Work Around for Errata CORTEX-R4#57:
404*10465441SEvalZero@
405*10465441SEvalZero@ Errata Description:
406*10465441SEvalZero@            Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags
407*10465441SEvalZero@ Workaround:
408*10465441SEvalZero@            Disable out-of-order single-precision floating point
409*10465441SEvalZero@            multiply-accumulate instruction completion
410*10465441SEvalZero
411*10465441SEvalZero        .globl     _errata_CORTEXR4_57_
412*10465441SEvalZero_errata_CORTEXR4_57_:
413*10465441SEvalZero
414*10465441SEvalZero        push {r0}
415*10465441SEvalZero        mrc p15, #0, r0, c15, c0, #0 @ Read Secondary Auxiliary Control Register
416*10465441SEvalZero        orr r0, r0, #0x10000         @ Set BIT 16 (Set DOOFMACS)
417*10465441SEvalZero        mcr p15, #0, r0, c15, c0, #0 @ Write Secondary Auxiliary Control Register
418*10465441SEvalZero        pop {r0}
419*10465441SEvalZero        bx lr
420*10465441SEvalZero
421*10465441SEvalZero@-------------------------------------------------------------------------------
422*10465441SEvalZero@ Work Around for Errata CORTEX-R4#66:
423*10465441SEvalZero@
424*10465441SEvalZero@ Errata Description:
425*10465441SEvalZero@            Register Corruption During A Load-Multiple Instruction At
426*10465441SEvalZero@            an Exception Vector
427*10465441SEvalZero@ Workaround:
428*10465441SEvalZero@            Disable out-of-order completion for divide instructions in
429*10465441SEvalZero@            Auxiliary Control register
430*10465441SEvalZero
431*10465441SEvalZero        .globl     _errata_CORTEXR4_66_
432*10465441SEvalZero_errata_CORTEXR4_66_:
433*10465441SEvalZero
434*10465441SEvalZero        push {r0}
435*10465441SEvalZero        mrc p15, #0, r0, c1, c0, #1 @ Read Auxiliary Control register
436*10465441SEvalZero          orr r0, r0, #0x80           @ Set BIT 7 (Disable out-of-order completion
437*10465441SEvalZero                                    @ for divide instructions.)
438*10465441SEvalZero           mcr p15, #0, r0, c1, c0, #1 @ Write Auxiliary Control register
439*10465441SEvalZero        pop {r0}
440*10465441SEvalZero        bx lr
441*10465441SEvalZero
442*10465441SEvalZero    .globl     turnon_VFP
443*10465441SEvalZeroturnon_VFP:
444*10465441SEvalZero        @ Enable FPV
445*10465441SEvalZero        STMDB sp!,     {r0}
446*10465441SEvalZero        fmrx  r0,      fpexc
447*10465441SEvalZero        orr   r0,      r0,   #0x40000000
448*10465441SEvalZero        fmxr  fpexc,   r0
449*10465441SEvalZero        LDMIA sp!,     {r0}
450*10465441SEvalZero        subs  pc,      lr,   #4
451*10465441SEvalZero
452*10465441SEvalZero    .macro push_svc_reg
453*10465441SEvalZero        sub     sp, sp, #17 * 4         @/* Sizeof(struct rt_hw_exp_stack)  */
454*10465441SEvalZero        stmia   sp, {r0 - r12}          @/* Calling r0-r12                  */
455*10465441SEvalZero        mov     r0, sp
456*10465441SEvalZero        mrs     r6, spsr                @/* Save CPSR                       */
457*10465441SEvalZero        str     lr, [r0, #15*4]         @/* Push PC                         */
458*10465441SEvalZero        str     r6, [r0, #16*4]         @/* Push CPSR                       */
459*10465441SEvalZero        cps     #Mode_SVC
460*10465441SEvalZero        str     sp, [r0, #13*4]         @/* Save calling SP                 */
461*10465441SEvalZero        str     lr, [r0, #14*4]         @/* Save calling PC                 */
462*10465441SEvalZero    .endm
463*10465441SEvalZero
464*10465441SEvalZero    .globl	vector_svc
465*10465441SEvalZerovector_svc:
466*10465441SEvalZero        push_svc_reg
467*10465441SEvalZero        bl      rt_hw_trap_svc
468*10465441SEvalZero		b       .
469*10465441SEvalZero
470*10465441SEvalZero    .globl	vector_pabort
471*10465441SEvalZerovector_pabort:
472*10465441SEvalZero        push_svc_reg
473*10465441SEvalZero        bl      rt_hw_trap_pabt
474*10465441SEvalZero		b       .
475*10465441SEvalZero
476*10465441SEvalZero    .globl	vector_dabort
477*10465441SEvalZerovector_dabort:
478*10465441SEvalZero        push_svc_reg
479*10465441SEvalZero        bl      rt_hw_trap_dabt
480*10465441SEvalZero		b       .
481*10465441SEvalZero
482*10465441SEvalZero    .globl	vector_resv
483*10465441SEvalZerovector_resv:
484*10465441SEvalZero        push_svc_reg
485*10465441SEvalZero        bl      rt_hw_trap_resv
486*10465441SEvalZero		b       .
487