/branches/arm/kernel/arch/arm32/src/start.S |
---|
32,49 → 32,55 |
.global kernel_image_start |
.global exc_stack |
.global exc_stack |
.global supervisor_sp |
kernel_image_start: |
#switch to system mode |
mrs r3, cpsr |
orr r3, r3, #0x1f |
msr cpsr_c, r3 |
ldr sp, =end_stack |
# initialize Stack pointer for exception modes |
mrs r4, cpsr |
bic r4, r4, #0x1f |
cmp r2, #0 |
beq bootinfo_end |
#FIQ Mode |
orr r3, r4, #0x11 |
msr cpsr_c, r3 |
ldr sp, =exc_stack |
ldr r3, =bootinfo |
#IRQ Mode |
orr r3, r4, #0x12 |
msr cpsr_c, r3 |
ldr sp, =exc_stack |
bootinfo_loop: |
ldr r4, [r1] |
str r4, [r3] |
#ABORT Mode |
orr r3, r4, #0x17 |
msr cpsr_c, r3 |
ldr sp, =exc_stack |
add r1, r1, #4 |
add r3, r3, #4 |
add r2, r2, #-4 |
#UNDEFINED Mode |
orr r3, r4, #0x1b |
msr cpsr_c, r3 |
ldr sp, =exc_stack |
cmp r2, #0 |
bne bootinfo_loop |
bootinfo_end: |
# switch to supervisor mode |
orr r3, r4, #0x13 |
msr cpsr_c, r3 |
ldr sp, =temp_stack |
bl arch_pre_main |
bl main_bsp |
b halt |
.space TEMP_STACK_SIZE |
temp_stack: |
end_stack: |
.space 1024 |
exc_stack: |
.space 4 |
supervisor_sp: |
.space 4 |
.space 4 |
halt: |
ldr r0,=0x10000010 |
ldr r1, [r0] |
b halt |