|
发表于 2010-11-4 09:43:35
|
显示全部楼层
贴一段没认真调试过的代码,可以参考一下。
支持SWI重入;SWI是普通函数,可以带参数/返回值的。
其实R12和SPSR可以不存。。。节约点堆栈,开关中断等行为也更好完成。
Code_SWI
; SWI Exception Handler With Reentrant
STMFD SP!, {R12, LR} ; Store Registers.
MRS R12, SPSR ; Get SPSR
TST R12, #0x20 ; Check Processor State [T Bit]
STR R12, [SP, #-8]! ; Save SPSR for Reentrant
STMIB SP, {LR}^ ; Save USR/SYS Mode LR
LDRNEH LR, [LR, #-2] ; Thumb State, Get SWI Instruction
LDREQ LR, [LR, #-4] ; ARM State, Get SWI Instruction
LDR R12, = Vect_SWI_Idx ; Get SWI Handler Function Address
BICNE LR, LR, #0xFF00 ; Thumb State, Get SWI Number
BICEQ LR, LR, #0xFF000000 ; ARM State, Get SWI Number
LDR R12, [R12, LR, LSL #2] ; Look UP Jump Table
MSR CPSR_c, #ARM_MODE_SYS
BLX R12 ; Call SWI Handler Function
MSR CPSR_c, #ARM_MODE_SVC | I_BIT
LDR R12, [SP], #8 ; Restore SPSR
LDMDB SP, {LR}^ ; Restore USR/SYS Mode LR
NOP
MSR SPSR_cxsf, R12
LDMFD SP!, {R12, PC}^ ; Restore Registers and Return |
|