📄 intr.s
字号:
msr cpsr_c, #ABORT_MODE | 0x80 @ switch back to abort mode w/IRQs disabled
ldmfd sp!, {r4} @ 恢复r4
mov r0, lr
mrs r1, spsr
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
stmfd sp!, {r0-r1} @ save lr and spsr
msr cpsr_c, #SYS_MODE @ w/IRQs enable
bl INTR_PrefetchAbort @ 调用C异常处理函数
msr cpsr_c, #SYS_MODE | 0x80 @ switch to sys mode w/IRQs disabed
ldmfd sp!, {r0-r1} @ restore lr and spsr
msr cpsr_c, #ABORT_MODE | 0x80 @ switch back to abort mode w/IRQs disabled
mov lr, r0
msr spsr, r1
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
ldmfd sp!, {r0-r3, r12, lr} @ restore r0-r3,r12, and lr
msr cpsr_c, #ABORT_MODE | 0x80 @ switch back to abort mode w/IRQs disabled
movs pc, lr @ 返回
@ 正常调用返回退出
_HandleCallReturn:
msr cpsr_c, #SYS_MODE @ switch to system mode w/IRQs enable
b APICallRet @
@=======================================================
@=======================================================
ENTRY ES_DataAbortHandler
sub lr, lr, #8
stmfd sp!, {r0-r3, r12, lr} @ save some register
mfc15 r0, c6 @ (r0) = fault address
mfc15 r1, c5 @ (r1) = fault status
and r1, r1, #0x0D @ type of data abort
cmp r1, #0x05 @ translation error?
movne r0, #0x0
bleq LoadFailurePage
cmp r0, #0x0 @ not handle the page failure
ldmnefd sp!, {r0-r3,r12,pc}^
@ now to handle exception
ldmfd sp!, {r0-r3,r12,lr} @ 恢复r0-r3,r12,lr
@ 装入页错误, 以下处理错误
stmfd sp!, {r4} @ save r4
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
@ 切换到 sys sp
ldr r4, =lpCurThread
ldr r4, [r4]
add sp, r4, #0x400 @=0x400-4
sub sp, sp, #4
stmfd sp!, {r0-r3, r12, lr} @ save r0-r3,r12, and lr
msr cpsr_c, #ABORT_MODE | 0x80 @ switch back to abort mode w/IRQs disabled
ldmfd sp!, {r4} @ 恢复r4
mov r0, lr
mrs r1, spsr
mfc15 r3, c6 @ (r3) = abort address
mfc15 r12, c5 @ (r12) = abort status
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
stmfd sp!, {r0-r1} @ save lr and spsr
mov r1, r3 @为INTR_DataAbort准备参数
mov r2, r12 @为INTR_DataAbort准备参数
msr cpsr_c, #SYS_MODE @ w/IRQs enable
bl INTR_DataAbort @ 调用C异常处理函数 (r0)=abort pc address (r1) = abort data address,(r2) = abort status,
msr cpsr_c, #SYS_MODE | 0x80 @ switch to sys mode w/IRQs disabed
ldmfd sp!, {r0-r1} @ restore lr and spsr
msr cpsr_c, #ABORT_MODE | 0x80 @ switch back to abort mode w/IRQs disabled
mov lr, r0
msr spsr, r1
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
ldmfd sp!, {r0-r3, r12, lr} @ restore r0-r3,r12, and lr
msr cpsr_c, #ABORT_MODE | 0x80 @ switch back to abort mode w/IRQs disabled
movs pc, lr @ 返回
@=======================================================
@=======================================================
ENTRY ES_UnusedHandler
stmfd sp!, {r0-r3, r12, lr} @ save some register
mrs r1, spsr @ r1 = spsr
stmfd sp!, {r1} @ save SPSR onto the IRQ stack
mov r0, #0x01
bl INTR_HandleErrorTrap
ldmfd sp!, {r1} @ restore IRQ SPSR from the IRQ stack
msr spsr, r1 @ spsr = r1
ldmfd sp!, {r0-r3, r12, lr} @ restore some register
@subs pc, lr, #4 @ return
movs pc, lr
@=======================================================
@=============================================================
ENTRY ES_IRQHandler
sub lr, lr, #4
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
stmfd sp!, {r0-r3, r12, lr} @ save r0-r3,r12, and lr
msr cpsr_c, #IRQ_MODE | 0x80 @ switch back to IRQ mode w/IRQs disabled
mov r0, lr
mrs r1, spsr
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
stmfd sp!, {r0-r1} @ save lr and spsr
bl INTR_Interrupt @ 调用C中断处理函数(参数r0=pc)
msr cpsr_c, #SYS_MODE @ switch to supervisor mode w/IRQs enable
bl DefaultHandler @ 调用C默认处理函数
msr cpsr_c, #SYS_MODE | 0x80 @ switch to sys mode w/IRQs disabel
ldmfd sp!, {r0-r1} @ restore lr and spsr
msr cpsr_c, #IRQ_MODE | 0x80 @ switch back to IRQ mode w/IRQs disabled
mov lr, r0
msr spsr, r1
msr cpsr_c, #SYS_MODE | 0x80 @ switch to system mode w/IRQs disabled
ldmfd sp!, {r0-r3, r12, lr} @ restore r0-r3,r12, and lr
msr cpsr_c, #IRQ_MODE | 0x80 @ switch back to IRQ mode w/IRQs disabled
movs pc, lr
@=======================================================
@=======================================================
ENTRY ES_FIQHandler
stmfd sp!, {r0-r3, r12, lr} @ save some register
mrs r1, spsr @ r1 = spsr
stmfd sp!, {r1} @ save SPSR onto the IRQ stack
mov r0, #0x02 @ r0 = trap message
bl INTR_HandleErrorTrap @ call c code
ldmfd sp!, {r1} @ restore IRQ SPSR from the IRQ stack
msr spsr, r1 @ spsr = r1
ldmfd sp!, {r0-r3, r12, lr} @ restore some register
subs pc, lr, #4 @ return
@=======================================================
@INTR_ON - enable interrupts
@=======================================================
ENTRY INTR_ON
mrs r0, cpsr @ (r0) = current status
bic r1, r0, #0x80 @ clear interrupt disable bit
msr cpsr, r1 @ update status register
mov pc, lr @ return to caller
@=======================================================
@ INTR_OFF - disable interrupts
@=======================================================
ENTRY INTR_OFF
mrs r0, cpsr @ (r0) = current status
orr r1, r0, #0x80 @ set interrupt disable bit
msr cpsr, r1 @ update status register
mov pc, lr @ return to caller
@=======================================================
@=======================================================
ENTRY SetDataBreakpoint
@r0 = Access data breakpoint address register (DBAR).
@r1 = Access data breakpoint value register (DBVR).
@r2 = Access data breakpoint mask register (DBMR).
@r3 = Load data breakpoint control register (DBCR).
mcr p15,0,r0,c14,c0,0
mcr p15,0,r1,c14,c1,0
mcr p15,0,r2,c14,c2,0
mcr p15,0,r3,c14,c3,0
mov pc, lr @ return
@=======================================================
@=======================================================
ENTRY SetInstructionBreakpoint
@r0 = Write instruction breakpoint address and control register (IBCR).
cmp r0, #0x0
orrne r0, r0, #0x1 @ enable InstructionBreakpoint
mcrne p15,0,r0,c14,c8,0
mov pc, lr @ return
@=======================================================
@=======================================================
ENTRY GetInstructionBreakpoint
mrc p15,0,r0,c14,c8,0
mov pc, lr @ return
@=======================================================
@=======================================================
ENTRY SetCPUId
mtc15 r0, c13 @ set process base address register
nop
nop
mov pc, lr @ return
@=======================================================
@=======================================================
ENTRY GetCPUId
mfc15 r0, c13 @ set process base address register
mov pc, lr @ return
@=======================================================
@=======================================================
ENTRY KL_GetCPSR
mrs r0, cpsr @ (r0) = current status
mov pc, lr @ return to caller
@LEAF_ENTRY KL_SetCPSR
@stmfd sp!, {r0, r1, lr} @ save some register
@msr spsr, r0 @ (r0) = new status
@ldmfd sp!, {r0, r1, pc}^
@movs pc, lr
@ENTRY_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -