📄 bootarm.s
字号:
MSR CPSR_cxsf,a3 ; Switch to supervisor mode (SVC)
LDR a4, SYSTEM_FATAL_ERROR
BX a4
ENDIF ;/* single bank support */
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* INT_ExceptionSwitchSP */
;/* */
;/* DESCRIPTION */
;/* Saving current stack pointer (SP) at the entry of system error, */
;/* including fatal error, assert and CPU exception */
;/* (INT_Exception_SP); and switch SP to exception used stack. */
;/* */
;/* CALLS */
;/* */
;/* INPUTS */
;/* None */
;/* */
;/* OUTPUTS */
;/* None */
;/*************************************************************************/
; VOID INT_ExceptionSwitchSP(VOID)
; {
INT_ExceptionSwitchSP
LDR r10, Exception_SP_PTR
STR SP, [r10]
LDR r10, BOOT_EX_Stack_End
MOV SP, r10 ; Setup initial stack pointer
[ THUMB
BX lr ; Return to caller
|
MOV pc,lr ; Return to caller
]
;}
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* INT_ExceptionResetSystemSP */
;/* */
;/* DESCRIPTION */
;/* To reserve complete EX use stack for TST dump mechanism during */
;/* system error, EX use stack has to be reset before trapping to */
;/* tst_system_assertion_handler(). */
;/* */
;/* CALLS */
;/* */
;/* INPUTS */
;/* None */
;/* */
;/* OUTPUTS */
;/* None */
;/*************************************************************************/
; VOID INT_ExceptionResetSystemSP( VOID)
; {
INT_ExceptionResetSystemSP
LDR r10, BOOT_EX_Stack_End
MOV SP, r10 ; Setup initial exception stack pointer
[ THUMB
BX lr ; Return to caller
|
MOV pc,lr ; Return to caller
]
;}
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* INT_GetCurrentSP */
;/* */
;/* DESCRIPTION */
;/* Get the value of the current sp register. */
;/* CALLS */
;/* */
;/* INPUTS */
;/* None */
;/* */
;/* OUTPUTS */
;/* current sp */
;/*************************************************************************/
; int INT_GetCurrentSP(VOID)
; {
INT_GetCurrentSP
MOV r0, sp ; get the current stack pointer
[ THUMB
BX lr ; Return to caller
|
MOV pc,lr ; Return to caller
]
;}
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* INT_SwitchStackAndBranch */
;/* */
;/* DESCRIPTION */
;/* Switch current stack pointer to new_stack and then run */
;/* func(argv). */
;/* */
;/* CALLED BY */
;/* INT_SwitchStackToRun */
;/* */
;/* CALLS */
;/* None */
;/* */
;/* INPUTS */
;/* new_stack the new stack pointer which want to switch to */
;/* func the pointer of function which want to run */
;/* argc the number of arguments of func */
;/* argv the list of arguments */
;/* */
;/* OUTPUTS */
;/* The reture value of func */
;/*************************************************************************/
; kal_uint32 INT_SwitchStackAndBranch(kal_uint32 new_stack, kal_func_ptr func, kal_uint32 argc, va_list argv)
; {
INT_SwitchStackAndBranch
EXPORT INT_SwitchStackAndBranch
STMDB SP!, {R4-R7, LR}
MOV R7, SP ; Backup original SP in R7
LDR R6, [R3] ; Load the poitner of argv
MOV R5, R0 ; Backup new SP in R5
SUBS R2, R2, #4 ; Check if need to copy stack?
BLS skip_copy_stack
ADD R6, R6, #16
SUB R5, R0, R2, LSL #2 ; Reserve new stack to store arg4~n
copy_stack
LDRHI R4, [R6], #4 ; Copy arg4~n from argv to new stack
STRHI R4, [R5], #4
CMP R0, R5
BHI copy_stack
SUB R5, R0, R2, LSL #2 ; Change new stack pointer
skip_copy_stack
MOV R6, R1 ; Backup function pointer
LDR R4, [R3] ; Backup the pointer of argv;
LDR R0, [R4] ; Setup arguments of procedure call
LDR R1, [R4, #4]
LDR R2, [R4, #8]
LDR R3, [R4, #12]
MOV SP, R5 ; Switch to new stack
ADR lr, func_return
BX R6 ; Procedure call
func_return
MOV SP, R7 ; Switch back to old stack
LDMIA SP!, {R4-R7, PC}
;}
IF SINGLE_BANK_SUPPORT
CODE32
AREA |SNORCODE|, CODE, READONLY
IMPORT Flash_ReturnReady
FIQ_RETURN_PTR
DCD processing_fiqlr
INT_FIQ_Parse
STMDB sp!, {a2}
MRS a2, SPSR
TST a2, #F_BIT
LDMIA sp!, {a2}
SUBNES PC,lr,#4
STMDB sp!,{a1-a4} ; Save a1-a4 on temporary FIQ stack
SUB a4,lr,#4 ; Save IRQ's lr (return address)
LDR a1, FIQ_RETURN_PTR
STR a4, [a1] ; Save IRQ's return address to global variable.
IF SINGLE_BANK_SUPPORT
STMDB sp!,{a1-a4,r12,r14}
BL Flash_ReturnReady ; make flash enter ready state
LDMIA sp!,{a1-a4,r12,r14} ; r12 is for veneer use
ENDIF
BL TCT_Interrupt_Context_Save ; Call context save routine
BL INT_FIQ_Lisr
B TCT_Interrupt_Context_Restore
SYSTEM_FATAL_ERROR
DCD stack_system_error
Default_ISR
SUBS pc,lr,#4
;
;/*************************************************************************/
;/* The following section contains the remaining interrupt handlers. */
;/* Place you Interrupt Service routine at the appropriate label. */
;/* For IRQ, you can use Nucleus PLUS call to NU_Register_LISR */
;/* setup up an interrupt service routine. */
;/*************************************************************************/
Undef_Instr_ISR
MOV a1,#UNDEF_EXCEPTION_TYPE ; Set type UND_ISR (1)
MOV a2,lr
B saveException
SWI_ISR
MOV a1,#SWI_EXCEPTION_TYPE ; Set type SWI_ISR (2)
MOV a2,lr
B saveException
Prefetch_Abort_ISR
MOV a1,#PREFETCH_EXCEPTION_TYPE ; Set type ABORT_ISR (3)
MOV a2,lr
B saveException
Data_Abort_ISR
MOV a1,#DATA_EXCEPTION_TYPE ; Set type DATA_ABORT (4)
MOV a2,lr
saveException
MRS a3,CPSR ; Pickup current CPSR
BIC a3,a3,#MODE_MASK ; Clear the mode bits
ORR a3,a3,#SUP_MODE ; Prepare to switch to supervisor mode (SVC)
MSR CPSR_cxsf,a3 ; Switch to supervisor mode (SVC)
IF SINGLE_BANK_SUPPORT
STMDB sp!,{a1-a4,r12,r14}
BL Flash_ReturnReady ; make flash enter ready state
LDMIA sp!,{a1-a4,r12,r14} ; r12 is for veneer use
ENDIF
LDR a4, SYSTEM_FATAL_ERROR
BX a4
ENDIF ;/* single bank support */
CODE32
AREA |INTERNCODE|, CODE, READONLY
;
;}
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* */
;/* INT_IRQ_Parse */
;/* */
;/* DESCRIPTION */
;/* */
;/* This routine is the board-specific section for */
;/* interrupt handling */
;/* */
;/*************************************************************************/
INT_IRQ_Parse
IF KAL_ON_NUCLEUS
STMDB sp!, {a2}
MRS a2, SPSR
TST a2, #I_BIT
LDMIA sp!, {a2}
SUBNES pc,lr,#4
STMDB sp!,{a1-a4} ; Save a1-a4 on temporary IRQ stack
SUB a4,lr,#4 ; Save IRQ's lr (return address)
LDR a1,=processing_irqlr
STR a4, [a1] ; Save IRQ's return address to global variable.
IF DCM_ENABLE
STMDB sp!,{a1-a4}
STMDB sp!,{r12}
STMDB sp!,{r14}
BL DCM_Recovery
LDMIA sp!,{r14}
LDMIA sp!,{r12}
LDMIA sp!,{a1-a4}
ENDIF
IF SINGLE_BANK_SUPPORT
STMDB sp!,{a1-a4,r12,r14}
BL Flash_ReturnReady ; make flash enter ready state
LDMIA sp!,{a1-a4,r12,r14} ; r12 is for veneer use
ENDIF
BL TCT_Interrupt_Context_Save ; Call context save routine
BL isrC_Main
B TCT_Interrupt_Context_Restore
ELSE
STMDB sp!, {a2}
MRS a2, SPSR
TST a2, #I_BIT
LDMIA sp!, {a2}
SUBNES pc,lr,#4
STMDB sp!,{a1,a4} ; Save a1 and a4 on temporary IRQ stack
SUB a4,lr,#4 ; Save IRQ's lr (return address)
LDR a1,=processing_irqlr
STR a4, [a1] ; Save IRQ's return address to global variable.
LDMIA sp!,{a1,a4} ; Restore a1 and a4
IF DCM_ENABLE
STMDB sp!,{a1-a4}
STMDB sp!,{r12}
STMDB sp!,{r14}
BL DCM_Recovery
LDMIA sp!,{r14}
LDMIA sp!,{r12}
LDMIA sp!,{a1-a4}
ENDIF
B _tx_thread_context_save
__tx_irq_processing_return
BL _tx_thread_irq_nesting_start
BL isrC_Main
BL _tx_thread_irq_nesting_end
B _tx_thread_context_restore
ENDIF
;
;/*************************************************************************/
;/* */
;/* FUNCTION */
;/* DisableIRQ */
;/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -