/* * $Id: loader.S,v 1.3 2007/11/04 22:39:27 init Exp $ */ /* * FunnyOS loader * for gxemul test arm machines. */ .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. * Set up stack and call main. */ /* * 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 b 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: bl irq_trampoline mrs r0, spsr msr cpsr, r0 subs pc, r14, #4 _vector_fiq: nop /* last word of the physical memory */ Asysstack: .word 0x01fffffc Airqstack: .word 0x01fff000