[BACK]Return to loader.S CVS log [TXT][DIR] Up to [local] / funnyos / arch / testarm / boot

Annotation of funnyos/arch/testarm/boot/loader.S, Revision 1.5

1.1       init        1: /*
1.5     ! nbrk        2:  * $Id: loader.S,v 1.4 2007/11/05 18:54:35 init Exp $
1.1       init        3:  */
                      4: /*
                      5:  *     FunnyOS loader
                      6:  *     for gxemul test arm machines.
                      7:  */
                      8: .text
                      9: .global _start
                     10: .global main
                     11:
                     12: _start:
1.3       init       13: b      _vector_reset           /* reset */
1.1       init       14: bl     _vector_undef           /* undefined insn */
                     15: bl     _vector_swi                     /* software intr handler */
                     16: bl     _vector_dataabrt        /* data abort */
                     17: bl     _vector_prefabrt        /* prefetch abort */
                     18: .word 0x00000000               /* [reserved] */
1.3       init       19: b      _vector_irq                     /* IRQ */
1.1       init       20: bl     _vector_fiq                     /* Fast Interrupt Request */
                     21:
                     22: _vector_reset:
                     23:        /*
1.3       init       24:         *      Will enter here just right after RESET.
                     25:         *      Set up stack and call main.
                     26:         */
1.1       init       27:
1.3       init       28:        /*
                     29:         * Setup an IRQ stack
                     30:         */
                     31:        /* switch into irq mode with interrupts disabled */
                     32:        msr cpsr_c, #(0x12 | 0x80)
                     33:
                     34:        /* set sp (sp is banked) */
                     35:        ldr sp, Airqstack
                     36:
                     37:        /*
                     38:         * Setup system stack
                     39:         */
                     40:        /* switch into system mode (interrupts turned off) */
                     41:        msr cpsr_c, #(0x1f | 0x80)
                     42:
                     43:        /* set system stack pointer */
                     44:        ldr sp, Asysstack
1.1       init       45:
                     46:        b main
                     47:        /* NOTREACHED */
                     48:
                     49: _vector_undef:
                     50:        /* Undefined insn handler */
                     51:        mov pc, r14
                     52:
                     53: _vector_swi:
                     54:        mov pc, r14
                     55:
                     56: _vector_dataabrt:
                     57:        /* XXX fatal */
                     58:        nop
                     59:
                     60: _vector_prefabrt:
                     61:        nop
                     62:
                     63: _vector_irq:
1.4       init       64:        /* decrement pc by one insn */
                     65:        sub lr, lr, #4
                     66:
                     67:        /* store all system mode registers */
                     68:        stmdb sp!, {r0-r12, lr}
1.3       init       69:
1.5     ! nbrk       70:        /* store sys_mode's cpsr */
        !            71: //     mrs r1, spsr
        !            72: //     stmdb sp!, {r1}
        !            73:
        !            74:        /* pass sp (which now contains struct pcb of interrupted task) to irq_trampoline */
        !            75:        mov r0, sp
        !            76:
1.2       init       77:        bl irq_trampoline
1.1       init       78:
1.4       init       79:        /* load r0-r12 and pc from the stack */
                     80:        /* note ^ that copies SPSR into CPSR */
1.5     ! nbrk       81:        /** here we may return to different task (if pcb was changed in the stack memory) **/
1.4       init       82:        ldmia sp!, {r0-r12, pc}^
1.3       init       83:
1.1       init       84: _vector_fiq:
                     85:        nop
                     86:
                     87: /* last word of the physical memory */
1.3       init       88: Asysstack:
1.1       init       89: .word  0x01fffffc
1.3       init       90: Airqstack:
                     91: .word  0x01fff000
1.1       init       92:

CVSweb