335 lines
9.3 KiB
ArmAsm
335 lines
9.3 KiB
ArmAsm
|
;/*
|
||
|
; * Copyright (c) 2006-2022, RT-Thread Development Team
|
||
|
; *
|
||
|
; * SPDX-License-Identifier: Apache-2.0
|
||
|
; *
|
||
|
; * Change Logs:
|
||
|
; * Date Author Notes
|
||
|
; * 2024-03-11 Wangyuqiang first version
|
||
|
; */
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ sys_core.asm
|
||
|
;@
|
||
|
;@ (c) Texas Instruments 2009-2013, All rights reserved.
|
||
|
;@
|
||
|
|
||
|
; Constants
|
||
|
Mode_USR EQU 0x10
|
||
|
Mode_FIQ EQU 0x11
|
||
|
Mode_IRQ EQU 0x12
|
||
|
Mode_SVC EQU 0x13
|
||
|
Mode_ABT EQU 0x17
|
||
|
Mode_UND EQU 0x1B
|
||
|
Mode_SYS EQU 0x1F
|
||
|
|
||
|
I_Bit EQU 0x80
|
||
|
F_Bit EQU 0x40
|
||
|
|
||
|
UND_Stack_Size EQU 0x00000000
|
||
|
SVC_Stack_Size EQU 0x00000000
|
||
|
ABT_Stack_Size EQU 0x00000000
|
||
|
FIQ_Stack_Size EQU 0x00001000
|
||
|
IRQ_Stack_Size EQU 0x00001000
|
||
|
|
||
|
IMPORT _c_int00
|
||
|
IMPORT rt_hw_trap_svc
|
||
|
IMPORT rt_hw_trap_pabt
|
||
|
IMPORT rt_hw_trap_dabt
|
||
|
IMPORT rt_hw_trap_resv
|
||
|
IMPORT system_init
|
||
|
IMPORT __iar_program_start
|
||
|
|
||
|
; Define sections
|
||
|
SECTION .text:CODE:REORDER:NOROOT(2)
|
||
|
|
||
|
; Define stack start and top
|
||
|
EXPORT stack_start
|
||
|
EXPORT stack_top
|
||
|
|
||
|
; Align stack start to a 4-byte boundary (32-bit word)
|
||
|
ALIGNRAM 5
|
||
|
stack_start:
|
||
|
; Reserve stack memory
|
||
|
REPT (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + FIQ_Stack_Size + IRQ_Stack_Size)
|
||
|
DCB 0 ; Define a byte of data and clear it to zero
|
||
|
ENDR
|
||
|
|
||
|
; Define stack top label
|
||
|
stack_top:
|
||
|
|
||
|
; Define code section
|
||
|
SECTION .text:CODE:REORDER:NOROOT(2)
|
||
|
|
||
|
; Specify ARM mode
|
||
|
THUMB
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Enable RAM ECC Support
|
||
|
|
||
|
EXPORT _coreEnableRamEcc_
|
||
|
_coreEnableRamEcc_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mrc p15, #0x00, r0, c1, c0, #0x01
|
||
|
orr r0, r0, #0x0C000000
|
||
|
mcr p15, #0x00, r0, c1, c0, #0x01
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Disable RAM ECC Support
|
||
|
|
||
|
EXPORT _coreDisableRamEcc_
|
||
|
_coreDisableRamEcc_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mrc p15, #0x00, r0, c1, c0, #0x01
|
||
|
bic r0, r0, #0x0C000000
|
||
|
mcr p15, #0x00, r0, c1, c0, #0x01
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Enable Flash ECC Support
|
||
|
|
||
|
EXPORT _coreEnableFlashEcc_
|
||
|
_coreEnableFlashEcc_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mrc p15, #0x00, r0, c1, c0, #0x01
|
||
|
orr r0, r0, #0x02000000
|
||
|
dmb
|
||
|
mcr p15, #0x00, r0, c1, c0, #0x01
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Disable Flash ECC Support
|
||
|
|
||
|
EXPORT _coreDisableFlashEcc_
|
||
|
_coreDisableFlashEcc_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mrc p15, #0x00, r0, c1, c0, #0x01
|
||
|
bic r0, r0, #0x02000000
|
||
|
mcr p15, #0x00, r0, c1, c0, #0x01
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Get data fault status register
|
||
|
|
||
|
EXPORT _coreGetDataFault_
|
||
|
_coreGetDataFault_:
|
||
|
|
||
|
mrc p15, #0, r0, c5, c0, #0
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Clear data fault status register
|
||
|
|
||
|
EXPORT _coreClearDataFault_
|
||
|
_coreClearDataFault_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mov r0, #0
|
||
|
mcr p15, #0, r0, c5, c0, #0
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Get instruction fault status register
|
||
|
|
||
|
EXPORT _coreGetInstructionFault_
|
||
|
_coreGetInstructionFault_:
|
||
|
|
||
|
mrc p15, #0, r0, c5, c0, #1
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Clear instruction fault status register
|
||
|
|
||
|
EXPORT _coreClearInstructionFault_
|
||
|
_coreClearInstructionFault_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mov r0, #0
|
||
|
mcr p15, #0, r0, c5, c0, #1
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Get data fault address register
|
||
|
|
||
|
EXPORT _coreGetDataFaultAddress_
|
||
|
_coreGetDataFaultAddress_:
|
||
|
|
||
|
mrc p15, #0, r0, c6, c0, #0
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Clear data fault address register
|
||
|
|
||
|
EXPORT _coreClearDataFaultAddress_
|
||
|
_coreClearDataFaultAddress_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mov r0, #0
|
||
|
mcr p15, #0, r0, c6, c0, #0
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Get instruction fault address register
|
||
|
|
||
|
EXPORT _coreGetInstructionFaultAddress_
|
||
|
_coreGetInstructionFaultAddress_:
|
||
|
|
||
|
mrc p15, #0, r0, c6, c0, #2
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Clear instruction fault address register
|
||
|
|
||
|
EXPORT _coreClearInstructionFaultAddress_
|
||
|
_coreClearInstructionFaultAddress_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mov r0, #0
|
||
|
mcr p15, #0, r0, c6, c0, #2
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Get auxiliary data fault status register
|
||
|
|
||
|
EXPORT _coreGetAuxiliaryDataFault_
|
||
|
_coreGetAuxiliaryDataFault_:
|
||
|
|
||
|
mrc p15, #0, r0, c5, c1, #0
|
||
|
bx lr
|
||
|
|
||
|
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Clear auxiliary data fault status register
|
||
|
|
||
|
EXPORT _coreClearAuxiliaryDataFault_
|
||
|
_coreClearAuxiliaryDataFault_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mov r0, #0
|
||
|
mcr p15, #0, r0, c5, c1, #0
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Get auxiliary instruction fault status register
|
||
|
|
||
|
EXPORT _coreGetAuxiliaryInstructionFault_
|
||
|
_coreGetAuxiliaryInstructionFault_:
|
||
|
|
||
|
mrc p15, #0, r0, c5, c1, #1
|
||
|
bx lr
|
||
|
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Clear auxiliary instruction fault status register
|
||
|
|
||
|
EXPORT _coreClearAuxiliaryInstructionFault_
|
||
|
_coreClearAuxiliaryInstructionFault_:
|
||
|
|
||
|
stmfd sp!, {r0}
|
||
|
mov r0, #0
|
||
|
mrc p15, #0, r0, c5, c1, #1
|
||
|
ldmfd sp!, {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Work Around for Errata CORTEX-R4#57:
|
||
|
;@
|
||
|
;@ Errata Description:
|
||
|
;@ Conditional VMRS APSR_Nzcv, FPSCR May Evaluate With Incorrect Flags
|
||
|
;@ Workaround:
|
||
|
;@ Disable out-of-order single-precision floating point
|
||
|
;@ multiply-accumulate instruction completion
|
||
|
|
||
|
EXPORT _errata_CORTEXR4_57_
|
||
|
_errata_CORTEXR4_57_:
|
||
|
|
||
|
push {r0}
|
||
|
mrc p15, #0, r0, c15, c0, #0 ;@ Read Secondary Auxiliary Control Register
|
||
|
orr r0, r0, #0x10000 ;@ Set BIT 16 (Set DOOFMACS)
|
||
|
mcr p15, #0, r0, c15, c0, #0 ;@ Write Secondary Auxiliary Control Register
|
||
|
pop {r0}
|
||
|
bx lr
|
||
|
|
||
|
;@-------------------------------------------------------------------------------
|
||
|
;@ Work Around for Errata CORTEX-R4#66:
|
||
|
;@
|
||
|
;@ Errata Description:
|
||
|
;@ Register Corruption During A Load-Multiple Instruction At
|
||
|
;@ an Exception Vector
|
||
|
;@ Workaround:
|
||
|
;@ Disable out-of-order completion for divide instructions in
|
||
|
;@ Auxiliary Control register
|
||
|
|
||
|
EXPORT _errata_CORTEXR4_66_
|
||
|
_errata_CORTEXR4_66_:
|
||
|
|
||
|
push {r0}
|
||
|
mrc p15, #0, r0, c1, c0, #1 ;@ Read Auxiliary Control register
|
||
|
orr r0, r0, #0x80 ;@ Set BIT 7 (Disable out-of-order completion
|
||
|
;@ for divide instructions.)
|
||
|
mcr p15, #0, r0, c1, c0, #1 ;@ Write Auxiliary Control register
|
||
|
pop {r0}
|
||
|
bx lr
|
||
|
EXPORT turnon_VFP
|
||
|
turnon_VFP:
|
||
|
;@ Enable FPV
|
||
|
stmdb sp!, {r0}
|
||
|
fmrx r0, fpexc
|
||
|
orr r0, r0, #0x40000000
|
||
|
fmxr fpexc, r0
|
||
|
ldmia sp!, {r0}
|
||
|
subs pc, lr, #4
|
||
|
|
||
|
macro push_svc_reg
|
||
|
sub sp, sp, #17 * 4 ;@/* Sizeof(struct rt_hw_exp_stack) */
|
||
|
stmia sp, {r0 - r12} ;@/* Calling r0-r12 */
|
||
|
mov r0, sp
|
||
|
mrs r6, spsr ;@/* Save CPSR */
|
||
|
str lr, [r0, #15*4] ;@/* Push PC */
|
||
|
str r6, [r0, #16*4] ;@/* Push CPSR */
|
||
|
cps #Mode_SVC
|
||
|
str sp, [r0, #13*4] ;@/* Save calling SP */
|
||
|
str lr, [r0, #14*4] ;@/* Save calling PC */
|
||
|
endm
|
||
|
|
||
|
EXPORT SVC_Handler
|
||
|
SVC_Handler:
|
||
|
push_svc_reg
|
||
|
bl rt_hw_trap_svc
|
||
|
b .
|
||
|
|
||
|
EXPORT Prefetch_Handler
|
||
|
Prefetch_Handler:
|
||
|
push_svc_reg
|
||
|
bl rt_hw_trap_pabt
|
||
|
b .
|
||
|
|
||
|
EXPORT Abort_Handler
|
||
|
Abort_Handler:
|
||
|
push_svc_reg
|
||
|
bl rt_hw_trap_dabt
|
||
|
b .
|
||
|
|
||
|
EXPORT Reserved_Handler
|
||
|
Reserved_Handler:
|
||
|
push_svc_reg
|
||
|
bl rt_hw_trap_resv
|
||
|
b .
|
||
|
END
|