=================================================================== RCS file: /cvs/funnyos/arch/testarm/boot/loader.S,v retrieving revision 1.2 retrieving revision 1.5 diff -u -r1.2 -r1.5 --- funnyos/arch/testarm/boot/loader.S 2007/10/29 20:34:23 1.2 +++ funnyos/arch/testarm/boot/loader.S 2007/11/23 13:37:42 1.5 @@ -1,5 +1,5 @@ /* - * $Id: loader.S,v 1.2 2007/10/29 20:34:23 init Exp $ + * $Id: loader.S,v 1.5 2007/11/23 13:37:42 nbrk Exp $ */ /* * FunnyOS loader @@ -10,23 +10,39 @@ .global main _start: -bl _vector_reset /* reset */ +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] */ -bl _vector_irq /* IRQ */ +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. - */ + * Will enter here just right after RESET. + * Set up stack and call main. + */ - ldr r13, Astack /* XXX stack at the end of phys mem */ + /* + * 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 */ @@ -45,12 +61,32 @@ nop _vector_irq: + /* decrement pc by one insn */ + sub lr, lr, #4 + + /* store all system mode registers */ + stmdb sp!, {r0-r12, lr} + + /* store sys_mode's cpsr */ +// mrs r1, spsr +// stmdb sp!, {r1} + + /* pass sp (which now contains struct pcb of interrupted task) to irq_trampoline */ + mov r0, sp + bl irq_trampoline + /* load r0-r12 and pc from the stack */ + /* note ^ that copies SPSR into CPSR */ + /** here we may return to different task (if pcb was changed in the stack memory) **/ + ldmia sp!, {r0-r12, pc}^ + _vector_fiq: nop /* last word of the physical memory */ -Astack: +Asysstack: .word 0x01fffffc +Airqstack: +.word 0x01fff000