📄 start.s
字号:
/* * ApOS (Another Project software for s3c2410) * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Copyright caiyuqing * */ .include "init.inc".global _start.macro get_irq_stack ldr sp, =IRQ_STACK_BASE.endm/* * save_user_registers 把UserMode的各个寄存器的值保存到irq stack * 中,我定义了每一个值 IRQ_STACK_FRAME_SIZE ,它的大小为68,等于 * 我们要保存的寄存器所占字节的总数 * * 我们要保存的寄存器有 r0-r12,sp^,lr^,pc^(lr),cpsr^ 总共17个寄存器 * 其中"^"表示UserMode下的寄存器 */.macro irq_save_user_registers sub sp, sp,#IRQ_STACK_FRAME_SIZE stmia sp, {r0-r12} add r8, sp, #52 stmia r8!, {sp,lr}^ str lr, [r8] mrs r6, spsr str r6, [r8,#4] mov r0, sp @此时sp指向r0的存储地址.endm/* * 重新载入UserMode的各个寄存器的值 * "subs pc, lr,#4" 把系统从IRQMode返到回UserMode * 事实上这条指令做了两个操作,分别是: * 1.把 lr减4拷贝到pc中 * 2.把当前模式下的spsr拷贝到cpsr中 * 注意subs (不是sub),"s" 引起了spsr到cpsr的拷贝操作 */.macro irq_load_user_registers ldmia sp, {r0-lr}^ @此时sp必须指向r0的存储地址 ldr lr, [sp,#60] add sp, sp,#IRQ_STACK_FRAME_SIZE subs pc, lr,#4.endm.macro get_abt_stack ldr sp, =ABORT_STACK_BASE.endm.macro abt_save_user_registers sub sp, sp,#ABORT_STACK_FRAME_SIZE stmia sp, {r0-r12} add r8, sp, #52 stmia r8!, {sp,lr}^ str lr, [r8] mrs r6, spsr str r6, [r8,#4] mov r0, sp.endm.macro dabt_load_user_registers ldmia sp, {r0-lr}^ ldr lr, [sp,#60] add sp, sp,#ABORT_STACK_FRAME_SIZE subs pc, lr,#8.endm.macro pabt_load_user_registers ldmia sp, {r0-lr}^ ldr lr, [sp,#60] add sp, sp,#ABORT_STACK_FRAME_SIZE subs pc, lr,#4.endm/* * 每个任务必须有自己独立的svc堆栈,因为任务有可能在 * svc模式下睡眠,所以能把svc模式下的数据进行保存 */.macro get_swi_stack ldr sp, =SVC_STACK_BASE.endm.macro swi_save_user_registers sub sp, sp,#SVC_STACK_FRAME_SIZE stmia sp, {r0-r12} add r8, sp, #52 stmia r8!, {sp,lr}^ str lr, [r8] mrs r6, spsr str r6, [r8,#4] mov r0, sp.endm.macro swi_load_user_registers ldmia sp, {r0-lr}^ @此时sp必须指向r0的存储地址 ldr lr, [sp,#60] add sp, sp,#SVC_STACK_FRAME_SIZE movs pc, lr.endm@ the Qboot image start here!_start:@ Exception vector table@ 0x00 Reset Supervisor ldr pc,=reset@ 0x04 Undefined instruction ldr pc,=undefined_instruction@ 0x08 Software Interrupt ldr pc,=software_interrupt@ 0x0C Abort (prefetch) ldr pc,=prefetch_abort@ 0x10 Abort (data) ldr pc,=data_abort@ 0x14 Reserved ldr pc,=reserved@ 0x18 IRQ ldr pc,=irq@ 0x1C FIQ ldr pc,=fiqreset: ldr r0,=AbortMode msr cpsr,r0 @ 进入 AbortMode ldr sp,=ABORT_STACK_BASE @ 初始化 IRQ_Stack ldr r0,=IRQMode msr cpsr,r0 @ enter IRQ Mode ldr sp,=IRQ_STACK_BASE @ init IRQ Stack ldr r0,=SupervisorMode msr cpsr,r0 @ enter System Mode ldr sp,=SYS_STACK_BASE @ init System Stack ldr r0,=SystemMode msr cpsr,r0 @ enter System Mode ldr sp,=SYS_STACK_BASE @ init System Stack ldr lr,=halt_loop ldr pc,=mainhalt_loop: b halt_loopundefined_instruction: b undefined_instruction software_interrupt: get_swi_stack swi_save_user_registers ldr lr,=ret1 ldr pc,=do_system_callret1: swi_load_user_registersprefetch_abort: get_abt_stack abt_save_user_registers ldr lr,=ret2 ldr pc,=do_prefetch_abortret2: pabt_load_user_registersdata_abort: get_abt_stack abt_save_user_registers ldr lr,=ret3 ldr pc,=do_data_abortret3: dabt_load_user_registers reserved: b . irq: get_irq_stack irq_save_user_registers ldr lr,=ret4 ldr pc,=do_irqret4: irq_load_user_registersfiq: b .
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -