xref: /nrf52832-nimble/rt-thread/libcpu/arm/cortex-r4/start_ccs.asm (revision 104654410c56c573564690304ae786df310c91fc)
1*10465441SEvalZero;-------------------------------------------------------------------------------
2*10465441SEvalZero; sys_core.asm
3*10465441SEvalZero;
4*10465441SEvalZero; (c) Texas Instruments 2009-2013, All rights reserved.
5*10465441SEvalZero;
6*10465441SEvalZero
7*10465441SEvalZero    .text
8*10465441SEvalZero    .arm
9*10465441SEvalZero
10*10465441SEvalZero    .ref _c_int00
11*10465441SEvalZero
12*10465441SEvalZero    .def     _reset
13*10465441SEvalZero    .asmfunc
14*10465441SEvalZero_reset
15*10465441SEvalZero;-------------------------------------------------------------------------------
16*10465441SEvalZero; Initialize CPU Registers
17*10465441SEvalZero; After reset, the CPU is in the Supervisor mode (M = 10011)
18*10465441SEvalZero        mov r0, lr
19*10465441SEvalZero        mov r1, #0x0000
20*10465441SEvalZero        mov r2, #0x0000
21*10465441SEvalZero        mov r3, #0x0000
22*10465441SEvalZero        mov r4, #0x0000
23*10465441SEvalZero        mov r5, #0x0000
24*10465441SEvalZero        mov r6, #0x0000
25*10465441SEvalZero        mov r7, #0x0000
26*10465441SEvalZero        mov r8, #0x0000
27*10465441SEvalZero        mov r9, #0x0000
28*10465441SEvalZero        mov r10, #0x0000
29*10465441SEvalZero        mov r11, #0x0000
30*10465441SEvalZero        mov r12, #0x0000
31*10465441SEvalZero        mov r13, #0x0000
32*10465441SEvalZero        mrs r1, cpsr
33*10465441SEvalZero        msr spsr_cxsf, r1
34*10465441SEvalZero        ; Switch to FIQ mode (M = 10001)
35*10465441SEvalZero        cps #17
36*10465441SEvalZero        mov lr, r0
37*10465441SEvalZero        mov r8, #0x0000
38*10465441SEvalZero        mov r9, #0x0000
39*10465441SEvalZero        mov r10, #0x0000
40*10465441SEvalZero        mov r11, #0x0000
41*10465441SEvalZero        mov r12, #0x0000
42*10465441SEvalZero        mrs r1, cpsr
43*10465441SEvalZero        msr spsr_cxsf, r1
44*10465441SEvalZero        ; Switch to IRQ mode (M = 10010)
45*10465441SEvalZero        cps #18
46*10465441SEvalZero        mov lr, r0
47*10465441SEvalZero        mrs r1,cpsr
48*10465441SEvalZero        msr spsr_cxsf, r1
49*10465441SEvalZero        ; Switch to Abort mode (M = 10111)
50*10465441SEvalZero        cps #23
51*10465441SEvalZero        mov lr, r0
52*10465441SEvalZero        mrs r1,cpsr
53*10465441SEvalZero        msr spsr_cxsf, r1
54*10465441SEvalZero        ; Switch to Undefined Instruction Mode (M = 11011)
55*10465441SEvalZero        cps #27
56*10465441SEvalZero        mov lr, r0
57*10465441SEvalZero        mrs r1,cpsr
58*10465441SEvalZero        msr spsr_cxsf, r1
59*10465441SEvalZero        ; Switch to System Mode ( Shares User Mode registers ) (M = 11111)
60*10465441SEvalZero        cps #31
61*10465441SEvalZero        mov lr, r0
62*10465441SEvalZero        mrs r1,cpsr
63*10465441SEvalZero        msr spsr_cxsf, r1
64*10465441SEvalZero        ; Switch back to Supervisor Mode (M = 10011)
65*10465441SEvalZero        cps #19
66*10465441SEvalZero
67*10465441SEvalZero        ; Turn on FPV coprocessor
68*10465441SEvalZero        mrc   p15,     #0x00,      r2,       c1, c0, #0x02
69*10465441SEvalZero        orr   r2,      r2,         #0xF00000
70*10465441SEvalZero        mcr   p15,     #0x00,      r2,       c1, c0, #0x02
71*10465441SEvalZero
72*10465441SEvalZero        .if (RT_VFP_LAZY_STACKING) = 0
73*10465441SEvalZero        fmrx  r2,      fpexc
74*10465441SEvalZero        orr   r2,      r2,   #0x40000000
75*10465441SEvalZero        fmxr  fpexc,   r2
76*10465441SEvalZero
77*10465441SEvalZero        fmdrr d0,         r1,     r1
78*10465441SEvalZero        fmdrr d1,         r1,     r1
79*10465441SEvalZero        fmdrr d2,         r1,     r1
80*10465441SEvalZero        fmdrr d3,         r1,     r1
81*10465441SEvalZero        fmdrr d4,         r1,     r1
82*10465441SEvalZero        fmdrr d5,         r1,     r1
83*10465441SEvalZero        fmdrr d6,         r1,     r1
84*10465441SEvalZero        fmdrr d7,         r1,     r1
85*10465441SEvalZero        fmdrr d8,         r1,     r1
86*10465441SEvalZero        fmdrr d9,         r1,     r1
87*10465441SEvalZero        fmdrr d10,        r1,     r1
88*10465441SEvalZero        fmdrr d11,        r1,     r1
89*10465441SEvalZero        fmdrr d12,        r1,     r1
90*10465441SEvalZero        fmdrr d13,        r1,     r1
91*10465441SEvalZero        fmdrr d14,        r1,     r1
92*10465441SEvalZero        fmdrr d15,        r1,     r1
93*10465441SEvalZero        .endif
94*10465441SEvalZero
95*10465441SEvalZero;-------------------------------------------------------------------------------
96*10465441SEvalZero; Initialize Stack Pointers
97*10465441SEvalZero        cps   #17
98*10465441SEvalZero        ldr   sp,       fiqSp
99*10465441SEvalZero        cps   #18
100*10465441SEvalZero        ldr   sp,       irqSp
101*10465441SEvalZero        cps   #23
102*10465441SEvalZero        ldr   sp,       abortSp
103*10465441SEvalZero        cps   #27
104*10465441SEvalZero        ldr   sp,       undefSp
105*10465441SEvalZero        cps   #31
106*10465441SEvalZero        ldr   sp,       userSp
107*10465441SEvalZero        cps   #19
108*10465441SEvalZero        ldr   sp,       svcSp
109*10465441SEvalZero
110*10465441SEvalZero        bl    next1
111*10465441SEvalZeronext1
112*10465441SEvalZero        bl    next2
113*10465441SEvalZeronext2
114*10465441SEvalZero        bl    next3
115*10465441SEvalZeronext3
116*10465441SEvalZero        bl    next4
117*10465441SEvalZeronext4
118*10465441SEvalZero        ldr  lr, int00ad
119*10465441SEvalZero        bx   lr
120*10465441SEvalZero
121*10465441SEvalZeroint00ad .word _c_int00
122*10465441SEvalZerouserSp  .word 0x08000000+0x00001000
123*10465441SEvalZerosvcSp   .word 0x08000000+0x00001000+0x00000100
124*10465441SEvalZerofiqSp   .word 0x08000000+0x00001000+0x00000100+0x00000100
125*10465441SEvalZeroirqSp   .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100
126*10465441SEvalZeroabortSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100
127*10465441SEvalZeroundefSp .word 0x08000000+0x00001000+0x00000100+0x00000100+0x00000100+0x00000100+0x00000100
128*10465441SEvalZero
129*10465441SEvalZero    .endasmfunc
130*10465441SEvalZero
131*10465441SEvalZero;-------------------------------------------------------------------------------
132*10465441SEvalZero; Enable RAM ECC Support
133*10465441SEvalZero
134*10465441SEvalZero    .def     _coreEnableRamEcc_
135*10465441SEvalZero    .asmfunc
136*10465441SEvalZero
137*10465441SEvalZero_coreEnableRamEcc_
138*10465441SEvalZero
139*10465441SEvalZero        stmfd sp!, {r0}
140*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
141*10465441SEvalZero        orr   r0,  r0,    #0x0C000000
142*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
143*10465441SEvalZero        ldmfd sp!, {r0}
144*10465441SEvalZero        bx    lr
145*10465441SEvalZero
146*10465441SEvalZero    .endasmfunc
147*10465441SEvalZero
148*10465441SEvalZero
149*10465441SEvalZero;-------------------------------------------------------------------------------
150*10465441SEvalZero; Disable RAM ECC Support
151*10465441SEvalZero
152*10465441SEvalZero    .def     _coreDisableRamEcc_
153*10465441SEvalZero    .asmfunc
154*10465441SEvalZero
155*10465441SEvalZero_coreDisableRamEcc_
156*10465441SEvalZero
157*10465441SEvalZero        stmfd sp!, {r0}
158*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
159*10465441SEvalZero        bic   r0,  r0,    #0x0C000000
160*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
161*10465441SEvalZero        ldmfd sp!, {r0}
162*10465441SEvalZero        bx    lr
163*10465441SEvalZero
164*10465441SEvalZero    .endasmfunc
165*10465441SEvalZero
166*10465441SEvalZero
167*10465441SEvalZero;-------------------------------------------------------------------------------
168*10465441SEvalZero; Enable Flash ECC Support
169*10465441SEvalZero
170*10465441SEvalZero    .def     _coreEnableFlashEcc_
171*10465441SEvalZero    .asmfunc
172*10465441SEvalZero
173*10465441SEvalZero_coreEnableFlashEcc_
174*10465441SEvalZero
175*10465441SEvalZero        stmfd sp!, {r0}
176*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
177*10465441SEvalZero        orr   r0,  r0,    #0x02000000
178*10465441SEvalZero        dmb
179*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
180*10465441SEvalZero        ldmfd sp!, {r0}
181*10465441SEvalZero        bx    lr
182*10465441SEvalZero
183*10465441SEvalZero    .endasmfunc
184*10465441SEvalZero
185*10465441SEvalZero
186*10465441SEvalZero;-------------------------------------------------------------------------------
187*10465441SEvalZero; Disable Flash ECC Support
188*10465441SEvalZero
189*10465441SEvalZero    .def     _coreDisableFlashEcc_
190*10465441SEvalZero    .asmfunc
191*10465441SEvalZero
192*10465441SEvalZero_coreDisableFlashEcc_
193*10465441SEvalZero
194*10465441SEvalZero        stmfd sp!, {r0}
195*10465441SEvalZero        mrc   p15, #0x00, r0,         c1, c0,  #0x01
196*10465441SEvalZero        bic   r0,  r0,    #0x02000000
197*10465441SEvalZero        mcr   p15, #0x00, r0,         c1, c0,  #0x01
198*10465441SEvalZero        ldmfd sp!, {r0}
199*10465441SEvalZero        bx    lr
200*10465441SEvalZero
201*10465441SEvalZero    .endasmfunc
202*10465441SEvalZero
203*10465441SEvalZero;-------------------------------------------------------------------------------
204*10465441SEvalZero; Get data fault status register
205*10465441SEvalZero
206*10465441SEvalZero    .def     _coreGetDataFault_
207*10465441SEvalZero    .asmfunc
208*10465441SEvalZero
209*10465441SEvalZero_coreGetDataFault_
210*10465441SEvalZero
211*10465441SEvalZero        mrc   p15, #0, r0, c5, c0,  #0
212*10465441SEvalZero        bx    lr
213*10465441SEvalZero
214*10465441SEvalZero    .endasmfunc
215*10465441SEvalZero
216*10465441SEvalZero
217*10465441SEvalZero;-------------------------------------------------------------------------------
218*10465441SEvalZero; Clear data fault status register
219*10465441SEvalZero
220*10465441SEvalZero    .def     _coreClearDataFault_
221*10465441SEvalZero    .asmfunc
222*10465441SEvalZero
223*10465441SEvalZero_coreClearDataFault_
224*10465441SEvalZero
225*10465441SEvalZero        stmfd sp!, {r0}
226*10465441SEvalZero        mov   r0,  #0
227*10465441SEvalZero        mcr   p15, #0, r0, c5, c0,  #0
228*10465441SEvalZero        ldmfd sp!, {r0}
229*10465441SEvalZero        bx    lr
230*10465441SEvalZero
231*10465441SEvalZero    .endasmfunc
232*10465441SEvalZero
233*10465441SEvalZero
234*10465441SEvalZero;-------------------------------------------------------------------------------
235*10465441SEvalZero; Get instruction fault status register
236*10465441SEvalZero
237*10465441SEvalZero    .def     _coreGetInstructionFault_
238*10465441SEvalZero    .asmfunc
239*10465441SEvalZero
240*10465441SEvalZero_coreGetInstructionFault_
241*10465441SEvalZero
242*10465441SEvalZero        mrc   p15, #0, r0, c5, c0, #1
243*10465441SEvalZero        bx    lr
244*10465441SEvalZero
245*10465441SEvalZero    .endasmfunc
246*10465441SEvalZero
247*10465441SEvalZero
248*10465441SEvalZero;-------------------------------------------------------------------------------
249*10465441SEvalZero; Clear instruction fault status register
250*10465441SEvalZero
251*10465441SEvalZero    .def     _coreClearInstructionFault_
252*10465441SEvalZero    .asmfunc
253*10465441SEvalZero
254*10465441SEvalZero_coreClearInstructionFault_
255*10465441SEvalZero
256*10465441SEvalZero        stmfd sp!, {r0}
257*10465441SEvalZero        mov   r0,  #0
258*10465441SEvalZero        mcr   p15, #0, r0, c5, c0, #1
259*10465441SEvalZero        ldmfd sp!, {r0}
260*10465441SEvalZero        bx    lr
261*10465441SEvalZero
262*10465441SEvalZero    .endasmfunc
263*10465441SEvalZero
264*10465441SEvalZero
265*10465441SEvalZero;-------------------------------------------------------------------------------
266*10465441SEvalZero; Get data fault address register
267*10465441SEvalZero
268*10465441SEvalZero    .def     _coreGetDataFaultAddress_
269*10465441SEvalZero    .asmfunc
270*10465441SEvalZero
271*10465441SEvalZero_coreGetDataFaultAddress_
272*10465441SEvalZero
273*10465441SEvalZero        mrc   p15, #0, r0, c6, c0,  #0
274*10465441SEvalZero        bx    lr
275*10465441SEvalZero
276*10465441SEvalZero    .endasmfunc
277*10465441SEvalZero
278*10465441SEvalZero
279*10465441SEvalZero;-------------------------------------------------------------------------------
280*10465441SEvalZero; Clear data fault address register
281*10465441SEvalZero
282*10465441SEvalZero    .def     _coreClearDataFaultAddress_
283*10465441SEvalZero    .asmfunc
284*10465441SEvalZero
285*10465441SEvalZero_coreClearDataFaultAddress_
286*10465441SEvalZero
287*10465441SEvalZero        stmfd sp!, {r0}
288*10465441SEvalZero        mov   r0,  #0
289*10465441SEvalZero        mcr   p15, #0, r0, c6, c0,  #0
290*10465441SEvalZero        ldmfd sp!, {r0}
291*10465441SEvalZero        bx    lr
292*10465441SEvalZero
293*10465441SEvalZero    .endasmfunc
294*10465441SEvalZero
295*10465441SEvalZero
296*10465441SEvalZero;-------------------------------------------------------------------------------
297*10465441SEvalZero; Get instruction fault address register
298*10465441SEvalZero
299*10465441SEvalZero    .def     _coreGetInstructionFaultAddress_
300*10465441SEvalZero    .asmfunc
301*10465441SEvalZero
302*10465441SEvalZero_coreGetInstructionFaultAddress_
303*10465441SEvalZero
304*10465441SEvalZero        mrc   p15, #0, r0, c6, c0, #2
305*10465441SEvalZero        bx    lr
306*10465441SEvalZero
307*10465441SEvalZero    .endasmfunc
308*10465441SEvalZero
309*10465441SEvalZero
310*10465441SEvalZero;-------------------------------------------------------------------------------
311*10465441SEvalZero; Clear instruction fault address register
312*10465441SEvalZero
313*10465441SEvalZero    .def     _coreClearInstructionFaultAddress_
314*10465441SEvalZero    .asmfunc
315*10465441SEvalZero
316*10465441SEvalZero_coreClearInstructionFaultAddress_
317*10465441SEvalZero
318*10465441SEvalZero        stmfd sp!, {r0}
319*10465441SEvalZero        mov   r0,  #0
320*10465441SEvalZero        mcr   p15, #0, r0, c6, c0, #2
321*10465441SEvalZero        ldmfd sp!, {r0}
322*10465441SEvalZero        bx    lr
323*10465441SEvalZero
324*10465441SEvalZero    .endasmfunc
325*10465441SEvalZero
326*10465441SEvalZero
327*10465441SEvalZero;-------------------------------------------------------------------------------
328*10465441SEvalZero; Get auxiliary data fault status register
329*10465441SEvalZero
330*10465441SEvalZero    .def     _coreGetAuxiliaryDataFault_
331*10465441SEvalZero    .asmfunc
332*10465441SEvalZero
333*10465441SEvalZero_coreGetAuxiliaryDataFault_
334*10465441SEvalZero
335*10465441SEvalZero        mrc   p15, #0, r0, c5, c1, #0
336*10465441SEvalZero        bx    lr
337*10465441SEvalZero
338*10465441SEvalZero    .endasmfunc
339*10465441SEvalZero
340*10465441SEvalZero
341*10465441SEvalZero;-------------------------------------------------------------------------------
342*10465441SEvalZero; Clear auxiliary data fault status register
343*10465441SEvalZero
344*10465441SEvalZero    .def     _coreClearAuxiliaryDataFault_
345*10465441SEvalZero    .asmfunc
346*10465441SEvalZero
347*10465441SEvalZero_coreClearAuxiliaryDataFault_
348*10465441SEvalZero
349*10465441SEvalZero        stmfd sp!, {r0}
350*10465441SEvalZero        mov   r0,  #0
351*10465441SEvalZero        mcr   p15, #0, r0, c5, c1, #0
352*10465441SEvalZero        ldmfd sp!, {r0}
353*10465441SEvalZero        bx    lr
354*10465441SEvalZero
355*10465441SEvalZero    .endasmfunc
356*10465441SEvalZero
357*10465441SEvalZero
358*10465441SEvalZero;-------------------------------------------------------------------------------
359*10465441SEvalZero; Get auxiliary instruction fault status register
360*10465441SEvalZero
361*10465441SEvalZero    .def     _coreGetAuxiliaryInstructionFault_
362*10465441SEvalZero    .asmfunc
363*10465441SEvalZero
364*10465441SEvalZero_coreGetAuxiliaryInstructionFault_
365*10465441SEvalZero
366*10465441SEvalZero        mrc   p15, #0, r0, c5, c1, #1
367*10465441SEvalZero        bx    lr
368*10465441SEvalZero
369*10465441SEvalZero    .endasmfunc
370*10465441SEvalZero
371*10465441SEvalZero;-------------------------------------------------------------------------------
372*10465441SEvalZero; Clear auxiliary instruction fault status register
373*10465441SEvalZero
374*10465441SEvalZero    .def     _coreClearAuxiliaryInstructionFault_
375*10465441SEvalZero    .asmfunc
376*10465441SEvalZero
377*10465441SEvalZero_coreClearAuxiliaryInstructionFault_
378*10465441SEvalZero
379*10465441SEvalZero        stmfd sp!, {r0}
380*10465441SEvalZero        mov   r0,  #0
381*10465441SEvalZero        mrc   p15, #0, r0, c5, c1, #1
382*10465441SEvalZero        ldmfd sp!, {r0}
383*10465441SEvalZero        bx    lr
384*10465441SEvalZero
385*10465441SEvalZero    .endasmfunc
386*10465441SEvalZero
387*10465441SEvalZero;-------------------------------------------------------------------------------
388*10465441SEvalZero; Clear ESM CCM errorss
389*10465441SEvalZero
390*10465441SEvalZero       .def _esmCcmErrorsClear_
391*10465441SEvalZero       .asmfunc
392*10465441SEvalZero
393*10465441SEvalZero_esmCcmErrorsClear_
394*10465441SEvalZero
395*10465441SEvalZero        stmfd sp!, {r0-r2}
396*10465441SEvalZero        ldr   r0, ESMSR1_REG    ; load the ESMSR1 status register address
397*10465441SEvalZero        ldr   r2, ESMSR1_ERR_CLR
398*10465441SEvalZero        str   r2, [r0]         ; clear the ESMSR1 register
399*10465441SEvalZero
400*10465441SEvalZero        ldr   r0, ESMSR2_REG    ; load the ESMSR2 status register address
401*10465441SEvalZero        ldr   r2, ESMSR2_ERR_CLR
402*10465441SEvalZero        str   r2, [r0]         ; clear the ESMSR2 register
403*10465441SEvalZero
404*10465441SEvalZero        ldr   r0, ESMSSR2_REG    ; load the ESMSSR2 status register address
405*10465441SEvalZero        ldr   r2, ESMSSR2_ERR_CLR
406*10465441SEvalZero        str   r2, [r0]             ; clear the ESMSSR2 register
407*10465441SEvalZero
408*10465441SEvalZero        ldr   r0, ESMKEY_REG    ; load the ESMKEY register address
409*10465441SEvalZero        mov   r2, #0x5             ; load R2 with 0x5
410*10465441SEvalZero        str   r2, [r0]             ; clear the ESMKEY register
411*10465441SEvalZero
412*10465441SEvalZero        ldr   r0, VIM_INTREQ    ; load the INTREQ register address
413*10465441SEvalZero        ldr   r2, VIM_INT_CLR
414*10465441SEvalZero        str   r2, [r0]         ; clear the INTREQ register
415*10465441SEvalZero        ldr   r0, CCMR4_STAT_REG    ; load the CCMR4 status register address
416*10465441SEvalZero        ldr   r2, CCMR4_ERR_CLR
417*10465441SEvalZero        str   r2, [r0]         ; clear the CCMR4 status register
418*10465441SEvalZero        ldmfd sp!, {r0-r2}
419*10465441SEvalZero        bx    lr
420*10465441SEvalZero
421*10465441SEvalZeroESMSR1_REG        .word 0xFFFFF518
422*10465441SEvalZeroESMSR2_REG        .word 0xFFFFF51C
423*10465441SEvalZeroESMSR3_REG        .word 0xFFFFF520
424*10465441SEvalZeroESMKEY_REG        .word 0xFFFFF538
425*10465441SEvalZeroESMSSR2_REG       .word 0xFFFFF53C
426*10465441SEvalZeroCCMR4_STAT_REG    .word 0xFFFFF600
427*10465441SEvalZeroERR_CLR_WRD       .word 0xFFFFFFFF
428*10465441SEvalZeroCCMR4_ERR_CLR     .word 0x00010000
429*10465441SEvalZeroESMSR1_ERR_CLR    .word 0x80000000
430*10465441SEvalZeroESMSR2_ERR_CLR    .word 0x00000004
431*10465441SEvalZeroESMSSR2_ERR_CLR   .word 0x00000004
432*10465441SEvalZeroVIM_INT_CLR       .word 0x00000001
433*10465441SEvalZeroVIM_INTREQ        .word 0xFFFFFE20
434*10465441SEvalZero
435*10465441SEvalZero        .endasmfunc
436*10465441SEvalZero
437*10465441SEvalZero;-------------------------------------------------------------------------------
438*10465441SEvalZero; Work Around for Errata CORTEX-R4#57:
439*10465441SEvalZero;
440*10465441SEvalZero; Errata Description:
441*10465441SEvalZero;            Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags
442*10465441SEvalZero; Workaround:
443*10465441SEvalZero;            Disable out-of-order single-precision floating point
444*10465441SEvalZero;            multiply-accumulate instruction completion
445*10465441SEvalZero
446*10465441SEvalZero        .def     _errata_CORTEXR4_57_
447*10465441SEvalZero        .asmfunc
448*10465441SEvalZero
449*10465441SEvalZero_errata_CORTEXR4_57_
450*10465441SEvalZero
451*10465441SEvalZero        push {r0}
452*10465441SEvalZero        mrc p15, #0, r0, c15, c0, #0 ; Read Secondary Auxiliary Control Register
453*10465441SEvalZero        orr r0, r0, #0x10000         ; Set BIT 16 (Set DOOFMACS)
454*10465441SEvalZero        mcr p15, #0, r0, c15, c0, #0 ; Write Secondary Auxiliary Control Register
455*10465441SEvalZero        pop {r0}
456*10465441SEvalZero        bx lr
457*10465441SEvalZero    .endasmfunc
458*10465441SEvalZero
459*10465441SEvalZero;-------------------------------------------------------------------------------
460*10465441SEvalZero; Work Around for Errata CORTEX-R4#66:
461*10465441SEvalZero;
462*10465441SEvalZero; Errata Description:
463*10465441SEvalZero;            Register Corruption During A Load-Multiple Instruction At
464*10465441SEvalZero;            an Exception Vector
465*10465441SEvalZero; Workaround:
466*10465441SEvalZero;            Disable out-of-order completion for divide instructions in
467*10465441SEvalZero;            Auxiliary Control register
468*10465441SEvalZero
469*10465441SEvalZero        .def     _errata_CORTEXR4_66_
470*10465441SEvalZero        .asmfunc
471*10465441SEvalZero
472*10465441SEvalZero_errata_CORTEXR4_66_
473*10465441SEvalZero
474*10465441SEvalZero        push {r0}
475*10465441SEvalZero        mrc p15, #0, r0, c1, c0, #1 ; Read Auxiliary Control register
476*10465441SEvalZero          orr r0, r0, #0x80           ; Set BIT 7 (Disable out-of-order completion
477*10465441SEvalZero                                    ; for divide instructions.)
478*10465441SEvalZero           mcr p15, #0, r0, c1, c0, #1 ; Write Auxiliary Control register
479*10465441SEvalZero        pop {r0}
480*10465441SEvalZero        bx lr
481*10465441SEvalZero    .endasmfunc
482*10465441SEvalZero
483*10465441SEvalZero    .def     turnon_VFP
484*10465441SEvalZero    .asmfunc
485*10465441SEvalZeroturnon_VFP
486*10465441SEvalZero        ; Enable FPV
487*10465441SEvalZero        STMDB sp!,     {r0}
488*10465441SEvalZero        fmrx  r0,      fpexc
489*10465441SEvalZero        orr   r0,      r0,   #0x40000000
490*10465441SEvalZero        fmxr  fpexc,   r0
491*10465441SEvalZero        LDMIA sp!,     {r0}
492*10465441SEvalZero        subs  pc,      lr,   #4
493*10465441SEvalZero    .endasmfunc
494*10465441SEvalZero
495*10465441SEvalZero_push_svc_reg    .macro
496*10465441SEvalZero        sub     sp, sp, #17 * 4         ;/* Sizeof(struct rt_hw_exp_stack)  */
497*10465441SEvalZero        stmia   sp, {r0 - r12}          ;/* Calling r0-r12                  */
498*10465441SEvalZero        mov     r0, sp
499*10465441SEvalZero        mrs     r6, spsr                ;/* Save CPSR                       */
500*10465441SEvalZero        str     lr, [r0, #15*4]         ;/* Push PC                         */
501*10465441SEvalZero        str     r6, [r0, #16*4]         ;/* Push CPSR                       */
502*10465441SEvalZero        cps     #0x13
503*10465441SEvalZero        str     sp, [r0, #13*4]         ;/* Save calling SP                 */
504*10465441SEvalZero        str     lr, [r0, #14*4]         ;/* Save calling PC                 */
505*10465441SEvalZero	.endm
506*10465441SEvalZero
507*10465441SEvalZero	.ref    rt_hw_trap_svc
508*10465441SEvalZero    .def	vector_svc
509*10465441SEvalZero    .asmfunc
510*10465441SEvalZerovector_svc:
511*10465441SEvalZero        _push_svc_reg
512*10465441SEvalZero        bl      rt_hw_trap_svc
513*10465441SEvalZero		sub     pc, pc, #-4
514*10465441SEvalZero    .endasmfunc
515*10465441SEvalZero
516*10465441SEvalZero	.ref    rt_hw_trap_pabt
517*10465441SEvalZero    .def	vector_pabort
518*10465441SEvalZero    .asmfunc
519*10465441SEvalZerovector_pabort:
520*10465441SEvalZero        _push_svc_reg
521*10465441SEvalZero        bl      rt_hw_trap_pabt
522*10465441SEvalZero		sub     pc, pc, #-4
523*10465441SEvalZero    .endasmfunc
524*10465441SEvalZero
525*10465441SEvalZero	.ref    rt_hw_trap_dabt
526*10465441SEvalZero    .def	vector_dabort
527*10465441SEvalZero    .asmfunc
528*10465441SEvalZerovector_dabort:
529*10465441SEvalZero        _push_svc_reg
530*10465441SEvalZero        bl      rt_hw_trap_dabt
531*10465441SEvalZero		sub     pc, pc, #-4
532*10465441SEvalZero    .endasmfunc
533*10465441SEvalZero
534*10465441SEvalZero	.ref    rt_hw_trap_resv
535*10465441SEvalZero    .def	vector_resv
536*10465441SEvalZero    .asmfunc
537*10465441SEvalZerovector_resv:
538*10465441SEvalZero        _push_svc_reg
539*10465441SEvalZero        bl      rt_hw_trap_resv
540*10465441SEvalZero		sub     pc, pc, #-4
541*10465441SEvalZero    .endasmfunc
542*10465441SEvalZero
543*10465441SEvalZero;-------------------------------------------------------------------------------
544*10465441SEvalZero; C++ construct table pointers
545*10465441SEvalZero
546*10465441SEvalZero    .def    __TI_PINIT_Base, __TI_PINIT_Limit
547*10465441SEvalZero    .weak   SHT$$INIT_ARRAY$$Base, SHT$$INIT_ARRAY$$Limit
548*10465441SEvalZero
549*10465441SEvalZero__TI_PINIT_Base  .long SHT$$INIT_ARRAY$$Base
550*10465441SEvalZero__TI_PINIT_Limit .long SHT$$INIT_ARRAY$$Limit
551*10465441SEvalZero
552*10465441SEvalZero;-------------------------------------------------------------------------------
553