Boot来DIY自己的arm11(6410)的bootloader(6)

.macro get_bad_stack
 ldr r13, _armboot_start  @ setup our mode stack (enter in banked mode)
 sub r13, r13, #(CFG_MALLOC_LEN) @ move past malloc pool
 sub r13, r13, #(CFG_GBL_DATA_SIZE+8) @ move to reserved a couple spots for abort stack

str lr, [r13]  @ save caller lr in position 0 of saved stack
 mrs lr, spsr  @ get the spsr
 str lr, [r13, #4]  @ save spsr in position 1 of saved stack

mov r13, #MODE_SVC  @ prepare SVC-Mode
 @ msr spsr_c, r13
 msr spsr, r13  @ switch modes, make sure moves will execute
 mov lr, pc    @ capture return pc
 movs pc, lr    @ jump to next instruction & switch modes.
 .endm

.macro get_bad_stack_swi
 sub r13, r13, #4  @ space on current stack for scratch reg.
 str r0, [r13]  @ save R0's value.
 ldr r0, _armboot_start  @ get data regions start
 sub r0, r0, #(CFG_MALLOC_LEN) @ move past malloc pool
 sub r0, r0, #(CFG_GBL_DATA_SIZE+8) @ move past gbl and a couple spots for abort stack
 str lr, [r0]  @ save caller lr in position 0 of saved stack
 mrs r0, spsr  @ get the spsr
 str lr, [r0, #4]  @ save spsr in position 1 of saved stack
 ldr r0, [r13]  @ restore r0
 add r13, r13, #4  @ pop stack entry
 .endm

.macro get_irq_stack  @ setup IRQ stack
 ldr sp, IRQ_STACK_START
 .endm

.macro get_fiq_stack  @ setup FIQ stack
 ldr sp, FIQ_STACK_START
 .endm

/*
 * exception handlers
 */
 //几种工作模式
 .align 5
undefined_instruction:
 get_bad_stack
 bad_save_user_regs
 bl do_undefined_instruction

.align 5
software_interrupt:
 get_bad_stack_swi
 bad_save_user_regs
 bl do_software_interrupt

.align 5
prefetch_abort:
 get_bad_stack
 bad_save_user_regs
 bl do_prefetch_abort

.align 5
data_abort:
 get_bad_stack
 bad_save_user_regs
 bl do_data_abort

.align 5
not_used:
 get_bad_stack
 bad_save_user_regs
 bl do_not_used

#ifdef CONFIG_USE_IRQ

.align 5
irq:
 get_irq_stack
 irq_save_user_regs
 bl do_irq
 irq_restore_user_regs

.align 5
fiq:
 get_fiq_stack
 /* someone ought to write a more effiction fiq_save_user_regs */
 irq_save_user_regs
 bl do_fiq
 irq_restore_user_regs

#else

.align 5
irq:
 get_bad_stack
 bad_save_user_regs
 bl do_irq

.align 5
fiq:
 get_bad_stack
 bad_save_user_regs
 bl do_fiq

#endif
 .align 5
.global arm1136_cache_flush
arm1136_cache_flush:
  mcr p15, 0, r1, c7, c5, 0 @ invalidate I cache
  mov pc, lr  @ back to caller

#if defined(CONFIG_INTEGRATOR) && defined(CONFIG_ARCH_CINTEGRATOR)
/* Use the IntegratorCP function from board/integratorcp/platform.S */
#elif defined(CONFIG_S3C64XX)
/* For future usage of S3C64XX*/
#else
 .align 5
.globl reset_cpu
reset_cpu:
 ldr r1, rstctl /* get addr for global reset reg */
 mov r3, #0x2 /* full reset pll+mpu */
 str r3, [r1] /* force reset */
 mov r0, r0
_loop_forever:
 b _loop_forever
rstctl:
 .word PM_RSTCTRL_WKUP

#endif

更多详情见请继续阅读下一页的精彩内容

相关阅读

u-boot Makefile完全解读

U-Boot中的date命令

U-Boot源代码下载地址

U-Boot下的两个重要数据:bd_t和gd_t

U-Boot中的version命令

U-Boot中的usb命令

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/2c4b5a376011f5a91a566a097dc0a659.html