File: [local] / funnyos / arch / sam7s64 / boot / loader.S (download)
Revision 1.9, Sun Dec 16 23:17:52 2007 UTC (16 years, 6 months ago) by nbrk
Branch: MAIN
CVS Tags: HEAD Changes since 1.8: +5 -2 lines
spin off forever if we are in FIQ mode (as it is a work to-do).
|
/*
* $Id: loader.S,v 1.9 2007/12/16 23:17:52 nbrk Exp $
*/
/*
* FunnyOS loader
* for Atmel SAM7S64 SoC.
*/
.text
.global _start
.global main
_start:
b _vector_reset /* reset */
bl _vector_undef /* undefined insn */
bl _vector_swi /* software intr handler */
bl _vector_dataabrt /* data abort */
bl _vector_prefabrt /* prefetch abort */
.word 0x00000000 /* [reserved] */
b _vector_irq /* IRQ */
bl _vector_fiq /* Fast Interrupt Request */
_vector_reset:
/*
* Will enter here just right after RESET.
* Relocate .data & .bss into SRAM, set up stack and call main.
*/
/* load .data addr */
ldr r1, Aflash_sdata
/* load end of FLASH */
ldr r2, Aflash_edata
/* will copy data in sram starting from that addr */
ldr r3, Asram_sdata
/*
* Copy data in sram
*/
loop:
ldr r4, [r1], #4 /* fetch from flash, increment flash_sdata */
str r4, [r3], #4 /* store to sram, increment sram_sdata */
cmp r1, r2 /* compare with flash_edata */
blo loop
/*
* Setup an IRQ stack
*/
/* switch into irq mode with interrupts disabled */
msr cpsr_c, #(0x12 | 0x80)
/* set sp (sp is banked) */
ldr sp, Airqstack
/*
* Setup system stack
*/
/* switch into system mode (interrupts turned off) */
msr cpsr_c, #(0x1f | 0x80)
/* set system stack pointer */
ldr sp, Asysstack
bl main
/* NOTREACHED */
_vector_undef:
/* Undefined insn handler */
mov pc, r14
_vector_swi:
mov pc, r14
_vector_dataabrt:
/* XXX fatal */
nop
_vector_prefabrt:
nop
_vector_irq:
/* decrement pc by one insn */
sub lr, lr, #4
/* store all system mode registers */
stmdb sp!, {r0-r12, lr}
bl irq_trampoline
/* load r0-r12 and pc from the stack */
/* note ^ that copies SPSR into CPSR */
ldmia sp!, {r0-r12, pc}^
_vector_fiq:
/* TODO */
fiqloop:
mov r0, r0
b fiqloop
Aflash_sdata:
.word 0x0000f000
Aflash_edata:
.word 0x0000fffc
Asram_sdata:
.word 0x00200000
/* last word of the physical memory */
Asysstack:
.word 0x00203ffc
Airqstack:
.word 0x00203c00