MRS R0 ,SPSR ; Get SPSR
TST R0,#0x20 ; Check Thumb Bit
LDRNEH R0, [LR,#-2] ; Thumb: Load Halfword
BICNE R0, R0, #0xFF00 ; Extract SWI Number
LDREQ R0, [LR,#-4] ; ARM: Load Word
BICEQ R0, R0, #0xFF000000 ;
PRESERVE8
SWI_IRQ_DIS EQU 0
SWI_IRQ_EN EQU 1
SWI_FIQ_DIS EQU 2
SWI_FIQ_EN EQU 3
I_Bit EQU 0x80
F_Bit EQU 0x40
;The exported labels and functions
EXPORT SoftwareInterrupt
EXPORT SWI_Handler
EXPORT IntEnable
EXPORT IntDisable
CODE32
AREA SWI_by_net_hawk,CODE,READONLY
ENTRY
;********************************************************************
;* SWI interrupt handler *
;* Function : SoftwareInterrupt(SWI_Number_ *
;* The SWI_Number is 0 through 3 *
;* See below "SwiFunction" table below *
;* Parameters: None *
;* input : SWI_Number *
;* output : None *
;
; WI_Addr DCD SWI_Handler at 0x000000x
; IMPORT SWI_Handler
;********************************************************************
SoftwareInterrupt
stmfd sp!,{lr}
swi 0
ldmfd sp!,{pc}
SWI_Handler
CMP R0, #4
LDRLO PC, [PC, R0, LSL #2]
MOVS PC, LR
SwiFunction
DCD IRQDisable ;0
DCD IRQEnable ;1
DCD FIQDisable ;2
DCD FIQEnable ;3
IRQDisable
MRS R0, SPSR
ORR R0, R0, #I_Bit
MSR SPSR_c, R0
MOVS PC, LR
IRQEnable
MRS R0, SPSR
BIC R0, R0, #I_Bit
MSR SPSR_c, R0
MOVS PC, LR
FIQDisable
MRS R0, SPSR
ORR R0, R0, #F_Bit
MSR SPSR_c, R0
MOVS PC, LR
FIQEnable
MRS R0, SPSR
BIC R0, R0, #F_Bit
MSR SPSR_c, R0
MOVS PC, LR
;**********************************************************************
;* Call SWI to enable IRQ *
;* Function : void IntEnable(void) *
;* Parameters: None *
;* input : None *
;* output : None *
;**********************************************************************
IntEnable
SWI SWI_IRQ_EN
BX lr
; end of IntEnable
;**********************************************************************
;* Call SWI to disable IRQ *
;* Function : void IntDisable(void) *
;* Parameters : None *
;* input : None *
;* output : None *
;**********************************************************************
IntDisable
SWI SWI_IRQ_DIS
BX lr
; end of IntDisable
END