.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
相关阅读:
