📄 cstartup.lst
字号:
246 .EQU ARM_MODE_IRQ, 0x12
247 .EQU ARM_MODE_SVC, 0x13
248
249 .EQU I_BIT, 0x80
250 .EQU F_BIT, 0x40
251
252 /*------------------------------------------------------------------------------
253 //*- Setup the stack for each mode
254 //*-------------------------------*/
255 0070 0D00A0E1 mov r0,r13 /* see (**) */
256
257 /*- Set up Fast Interrupt Mode and set FIQ Mode Stack*/
258 0074 D1F021E3 msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
259 /*- Init the FIQ register*/
260 0078 88809FE5 ldr r8, =AT91C_BASE_AIC
261
262 /*- Set up Interrupt Mode and set IRQ Mode Stack*/
263 007c D2F021E3 msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
264 0080 00D0A0E1 mov r13, r0 /* Init stack IRQ */
265 0084 600040E2 sub r0, r0, #IRQ_STACK_SIZE
266
267 /*- Set up Supervisor Mode and set Supervisor Mode Stack*/
268 /* start with INT and FIQ enabled */
269 0088 13F021E3 msr CPSR_c, #ARM_MODE_SVC
270
271 // /* start with INT and FIQ disabled */
272 // msr CPSR_c, #ARM_MODE_SVC | I_BIT | F_BIT
273
274 008c 00D0A0E1 mov r13, r0 /* Init stack Sup */
275
276
277 /*- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack*/
278
279 /* Relocate .data section (Copy from ROM to RAM) */
280 0090 74109FE5 LDR R1, =_etext
281 0094 74209FE5 LDR R2, =_data
282 0098 74309FE5 LDR R3, =_edata
283 009c 030052E1 LoopRel: CMP R2, R3
284 00a0 04009134 LDRLO R0, [R1], #4
285 00a4 04008234 STRLO R0, [R2], #4
286 00a8 FBFFFF3A BLO LoopRel
287
288 /* Clear .bss section (Zero init) */
289 00ac 0000A0E3 MOV R0, #0
290 00b0 60109FE5 LDR R1, =__bss_start__
291 00b4 60209FE5 LDR R2, =__bss_end__
292 00b8 020051E1 LoopZI: CMP R1, R2
293 00bc 04008134 STRLO R0, [R1], #4
294 00c0 FCFFFF3A BLO LoopZI
295
296
297 /* call C++ constructors of global objects */
298 00c4 54009FE5 LDR r0, =__ctors_start__
299 00c8 54109FE5 LDR r1, =__ctors_end__
300 ctor_loop:
301 00cc 010050E1 CMP r0, r1
302 00d0 0500000A BEQ ctor_end
303 00d4 042090E4 LDR r2, [r0], #4
304 00d8 03002DE9 STMFD sp!, {r0-r1}
305 00dc 0FE0A0E1 MOV lr, pc
306 /* MOV pc, r2 */
307 00e0 12FF2FE1 BX r2 /* mthomas 8/2006 */
308 00e4 0300BDE8 LDMFD sp!, {r0-r1}
309 00e8 F7FFFFEA B ctor_loop
310 ctor_end:
311
312
313 /* call main() */
314 00ec 34E09FE5 ldr lr,=exit
315 00f0 34009FE5 ldr r0,=main
316 00f4 10FF2FE1 bx r0
317
319 .endfunc
320
321 /* "exit" dummy added by mthomas to avoid sbrk write read etc. needed
322 by the newlib default "exit" */
323 .global exit
324 .func exit
325 exit:
326 00f8 FEFFFFEA b .
328 .endfunc
329
330
331
332
333 /*------------------------------------------------------------------------------
334 //*- Manage exception
335 //*---------------
336 //*- This module The exception must be ensure in ARM mode
337 //*------------------------------------------------------------------------------
338 //*------------------------------------------------------------------------------
339 //*- Function : IRQ_Handler_Entry
340 //*- Treatments : IRQ Controller Interrupt Handler.
341 //*- Called Functions : AIC_IVR[interrupt]
342 //*------------------------------------------------------------------------------*/
343
344 .if (VECTREMAPPED)
345 .print "IRQ_Handler_Entry in section .fastrun -> .data"
346 .section .fastrun, "ax"
347 .else
348 .print "IRQ_Handler_Entry in section .init -> .text"
349 .section .init, "ax"
350 .endif
351 .global IRQ_Handler_Entry
352 .func IRQ_Handler_Entry
353
354 IRQ_Handler_Entry:
355
356 /*- Manage Exception Entry */
357 /*- Adjust and save LR_irq in IRQ stack */
358 0000 04E04EE2 sub lr, lr, #4
359 0004 00402DE9 stmfd sp!, {lr}
360
361 /*- Save SPSR need to be saved for nested interrupt */
362 0008 00E04FE1 mrs r14, SPSR
363 000c 00402DE9 stmfd sp!, {r14}
364
365 /*- Save and r0 in IRQ stack */
366 0010 01002DE9 stmfd sp!, {r0}
367
368 /*- Write in the IVR to support Protect Mode */
369 /*- No effect in Normal Mode */
370 /*- De-assert the NIRQ and clear the source in Protect Mode */
371 0014 40E09FE5 ldr r14, =AT91C_BASE_AIC
372 0018 00019EE5 ldr r0 , [r14, #AIC_IVR]
373 001c 00E18EE5 str r14, [r14, #AIC_IVR]
374
375 /*- Enable Interrupt and Switch in Supervisor Mode */
376 0020 13F021E3 msr CPSR_c, #ARM_MODE_SVC
377
378 /*- Save scratch/used registers and LR in User Stack */
379 0024 0E502DE9 stmfd sp!, { r1-r3, r12, r14}
380
381 /*- Branch to the routine pointed by the AIC_IVR */
382 0028 0FE0A0E1 mov r14, pc
383 002c 10FF2FE1 bx r0
384 /*- Restore scratch/used registers and LR from User Stack*/
385 0030 0E50BDE8 ldmia sp!, { r1-r3, r12, r14}
386
387 /*- Disable Interrupt and switch back in IRQ mode */
388 0034 92F021E3 msr CPSR_c, #I_BIT | ARM_MODE_IRQ
389
390 /*- Mark the End of Interrupt on the AIC */
391 0038 1CE09FE5 ldr r14, =AT91C_BASE_AIC
392 003c 30E18EE5 str r14, [r14, #AIC_EOICR]
393
394 /*- Restore SPSR_irq and r0 from IRQ stack */
395 0040 0100BDE8 ldmia sp!, {r0}
396
397 /*- Restore SPSR_irq and r0 from IRQ stack */
398 0044 0040BDE8 ldmia sp!, {r14}
399 0048 0EF06FE1 msr SPSR_cxsf, r14
400
401 /*- Restore adjusted LR_irq from IRQ stack directly in the PC */
402 004c 0080FDE8 ldmia sp!, {pc}^
403
405 .endfunc
406
407
408 /*---------------------------------------------------------------
409 //* ?EXEPTION_VECTOR
410 //* This module is only linked if needed for closing files.
411 //*---------------------------------------------------------------*/
412 .global AT91F_Default_FIQ_handler
413 .func AT91F_Default_FIQ_handler
414 AT91F_Default_FIQ_handler:
415 0050 FEFFFFEA b AT91F_Default_FIQ_handler
417 .endfunc
418
419 .global AT91F_Default_IRQ_handler
420 .func AT91F_Default_IRQ_handler
421 AT91F_Default_IRQ_handler:
422 0054 FEFFFFEA b AT91F_Default_IRQ_handler
424 .endfunc
425
426 .global AT91F_Spurious_handler
427 .func AT91F_Spurious_handler
428 AT91F_Spurious_handler:
429 0058 FEFFFFEA b AT91F_Spurious_handler
431 .endfunc
432
433 005c 00F0FFFF .end
DEFINED SYMBOLS
*ABS*:00000000 Compil/srcWinARM/Cstartup.S
Compil/srcWinARM/Cstartup.S:30 *ABS*:00000000 RAM_MODE
Compil/srcWinARM/Cstartup.S:32 *ABS*:00000001 REMAP
Compil/srcWinARM/Cstartup.S:33 *ABS*:00000001 VECTREMAPPED
Compil/srcWinARM/Cstartup.S:63 *ABS*:00000100 AIC_IVR
Compil/srcWinARM/Cstartup.S:64 *ABS*:00000104 AIC_FVR
Compil/srcWinARM/Cstartup.S:65 *ABS*:00000130 AIC_EOICR
Compil/srcWinARM/Cstartup.S:66 *ABS*:fffff000 AT91C_BASE_AIC
Compil/srcWinARM/Cstartup.S:86 .vectmapped:00000000 $a
Compil/srcWinARM/Cstartup.S:131 .vectmapped:00000044 Reset_Addr
Compil/srcWinARM/Cstartup.S:132 .vectmapped:00000048 Undef_Addr
Compil/srcWinARM/Cstartup.S:134 .vectmapped:0000004c SWI_Addr
Compil/srcWinARM/Cstartup.S:135 .vectmapped:00000050 PAbt_Addr
Compil/srcWinARM/Cstartup.S:136 .vectmapped:00000054 DAbt_Addr
Compil/srcWinARM/Cstartup.S:137 .vectmapped:00000058 IRQ_Addr
Compil/srcWinARM/Cstartup.S:93 .vectmapped:0000001c fiqvec
Compil/srcWinARM/Cstartup.S:100 .vectmapped:0000001c FIQ_Handler_Entry
*ABS*:00000080 I_BIT
*ABS*:00000040 F_BIT
*ABS*:00000013 ARM_MODE_SVC
*ABS*:00000011 ARM_MODE_FIQ
Compil/srcWinARM/Cstartup.S:131 .vectmapped:00000044 $d
Compil/srcWinARM/Cstartup.S:168 .init:00000028 InitReset
Compil/srcWinARM/Cstartup.S:139 .vectmapped:0000005c Undef_Handler
Compil/srcWinARM/Cstartup.S:141 .vectmapped:00000060 PAbt_Handler
Compil/srcWinARM/Cstartup.S:142 .vectmapped:00000064 DAbt_Handler
Compil/srcWinARM/Cstartup.S:354 .fastrun:00000000 IRQ_Handler_Entry
Compil/srcWinARM/Cstartup.S:139 .vectmapped:0000005c $a
Compil/srcWinARM/Cstartup.S:149 .init:00000000 _startup
Compil/srcWinARM/Cstartup.S:150 .init:00000000 reset
Compil/srcWinARM/Cstartup.S:154 .init:00000000 $a
Compil/srcWinARM/Cstartup.S:162 .init:00000020 Reset_Addr_F
Compil/srcWinARM/Cstartup.S:162 .init:00000020 $d
Compil/srcWinARM/Cstartup.S:165 .init:00000024 .RAM_TOP
Compil/srcWinARM/Cstartup.S:175 *ABS*:ffffff00 MC_BASE
Compil/srcWinARM/Cstartup.S:176 *ABS*:00000000 MC_RCR
Compil/srcWinARM/Cstartup.S:180 .init:00000028 $a
Compil/srcWinARM/Cstartup.S:208 .init:00000060 already_remapped
Compil/srcWinARM/Cstartup.S:244 *ABS*:00000060 IRQ_STACK_SIZE
Compil/srcWinARM/Cstartup.S:246 *ABS*:00000012 ARM_MODE_IRQ
Compil/srcWinARM/Cstartup.S:283 .init:0000009c LoopRel
Compil/srcWinARM/Cstartup.S:292 .init:000000b8 LoopZI
Compil/srcWinARM/Cstartup.S:300 .init:000000cc ctor_loop
Compil/srcWinARM/Cstartup.S:310 .init:000000ec ctor_end
Compil/srcWinARM/Cstartup.S:325 .init:000000f8 exit
Compil/srcWinARM/Cstartup.S:358 .fastrun:00000000 $a
Compil/srcWinARM/Cstartup.S:414 .fastrun:00000050 AT91F_Default_FIQ_handler
Compil/srcWinARM/Cstartup.S:421 .fastrun:00000054 AT91F_Default_IRQ_handler
Compil/srcWinARM/Cstartup.S:428 .fastrun:00000058 AT91F_Spurious_handler
Compil/srcWinARM/Cstartup.S:433 .fastrun:0000005c $d
Compil/srcWinARM/Cstartup.S:346 .init:000000fc $d
UNDEFINED SYMBOLS
SoftwareInterruptASM
__TOP_STACK
__FIRST_IN_RAM
AT91F_LowLevelInit
_etext
_data
_edata
__bss_start__
__bss_end__
__ctors_start__
__ctors_end__
main
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -