- arm异常模式。
#define FUNCTION(x) .global x; x:
FUNCTION(arm_undefined) // 未定义指令异常
stmfd sp!, { r0-r12, r14 } // 批量数据存储指令,用于将r0-r12及r14压入堆栈,stmfd指令的寻址方式为事前递减方式(DB),后缀“!”表示更新sp的值,即sp = sp - 14*4
sub sp, sp, #12 // sp = sp - 12
mov r0, sp
mrs r1, spsr // spsr保存的用户模式的cpsr
stmia r0, { r1, r13-r14 }^ // 将spsr,sp,lr入栈,后缀“^”表示sp,lr是用户模式的寄存器
b arm_undefined_handler
b .
FUNCTION(arm_syscall) // 系统调用模式
stmfd sp!, { r0-r12, r14 }
sub sp, sp, #12
mov r0, sp
mrs r1, spsr
stmia r0, { r1, r13-r14 }^
b arm_syscall_handler
b .
FUNCTION(arm_prefetch_abort) // 预取指令异常模式
stmfd sp!, { r0-r12, r14 }
sub sp, sp, #12
mov r0, sp
mrs r1, spsr
stmia r0, { r1, r13-r14 }^
b arm_prefetch_abort_handler
b .
FUNCTION(arm_data_abort) // 数据访问终止模式
stmfd sp!, { r0-r12, r14 }
sub sp, sp, #12
mov r0, sp
mrs r1, spsr
stmia r0, { r1, r13-r14 }^
b arm_data_abort_handler
b .
FUNCTION(arm_reserved)
b .
FUNCTION(arm_irq) // 普通中断模式
/* XXX only deals with interrupting supervisor mode */
/* save r4-r6 and use as a temporary place to save while we switch into supervisor mode */
stmia r13, { r4-r6 } //
r4-r6入栈,使用用户模式的堆栈