/* | |
* crt0.S | |
* 1 define and initial the stack pointer | |
* 2 exception handler table | |
* 3 call SystemInit | |
* 4 go to __main in entry.o | |
* | |
* Copyright (C) 2016~2017 Hangzhou C-SKY Microsystems Co., Ltd | |
* Modify by Jiang Long on 2016-09-14 | |
*/ | |
// <<< Use Configuration Wizard in Context Menu >>> | |
/* | |
* For importing variable or functions from other c or assemble files. | |
*/ | |
.import main | |
/* | |
* default service routine | |
*/ | |
.global Reset_Handler | |
.global Misaligned_Access_Handler | |
.global Access_Error_Handler | |
.global Divided_By_Zero_Handler | |
.global Illegal_Handler | |
.global Privlege_Violation_Handler | |
.global Trace_Exection_Handler | |
.global Breakpoint_Exception_Handler | |
.global Unrecoverable_Error_Handler | |
.global Idly4_Error_Handler | |
.global Auto_INT_Handler | |
.global Auto_FINT_Handler | |
.global Reserved_HAI_Handler | |
.global Reserved_FP_Handler | |
.global TLB_Ins_Empty_Handler | |
.global TLB_Data_Empty_Handler | |
.global Default_handler | |
.weak Reset_Handler | |
.weak Misaligned_Access_Handler | |
.weak Access_Error_Handler | |
.weak Divided_By_Zero_Handler | |
.weak Illegal_Handler | |
.weak Privlege_Violation_Handler | |
.weak Trace_Exection_Handler | |
.weak Breakpoint_Exception_Handler | |
.weak Unrecoverable_Error_Handler | |
.weak Idly4_Error_Handler | |
.weak Auto_INT_Handler | |
.weak Auto_FINT_Handler | |
.weak Reserved_HAI_Handler | |
.weak Reserved_FP_Handler | |
.weak TLB_Ins_Empty_Handler | |
.weak TLB_Data_Empty_Handler | |
.weak Default_handler | |
.export ckcpu_vsr_table /* Vector table base address. */ | |
.section .exp_table,"ax",@progbits | |
/* Vector table space. */ | |
$d: | |
.align 10 | |
ckcpu_vsr_table: | |
.long Reset_Handler | |
.long Misaligned_Access_Handler | |
.long Access_Error_Handler | |
.long Divided_By_Zero_Handler | |
.long Illegal_Handler | |
.long Privlege_Violation_Handler | |
.long Trace_Exection_Handler | |
.long Breakpoint_Exception_Handler | |
.long Unrecoverable_Error_Handler | |
.long Idly4_Error_Handler | |
.long Auto_INT_Handler | |
.long Auto_FINT_Handler | |
.long Reserved_HAI_Handler | |
.long Reserved_FP_Handler | |
.long TLB_Ins_Empty_Handler | |
.long TLB_Data_Empty_Handler | |
.rept 32 | |
.long NOVIC_IRQ_Default_Handler | |
.endr | |
$t: | |
/* The ckcpu startup codes. */ | |
.text | |
.align 2 | |
/* | |
* This is the codes first entry point. This is where it all begins... | |
*/ | |
Reset_Handler: | |
/* | |
* Init psr value, enable exception, disable interrupt and fast interrupt. | |
* psr = 0x80000100 | |
*/ | |
bgeni r7, 31 | |
bseti r7, 30 | |
bseti r7, 29 | |
bseti r7, 8 | |
mtcr r7, psr | |
/* | |
* Setup initial vector base table for interrupts and exceptions | |
*/ | |
lrw a3, ckcpu_vsr_table | |
mtcr a3, vbr | |
/* Initialize the normal stack pointer from the linker definition. */ | |
lrw r0, g_top_irqstack | |
mov sp, r0 | |
/* | |
* The ranges of copy from/to are specified by following symbols | |
* __etext: LMA of start of the section to copy from. Usually end of text | |
* __data_start__: VMA of start of the section to copy to | |
* __data_end__: VMA of end of the section to copy to | |
* | |
* All addresses must be aligned to 4 bytes boundary. | |
*/ | |
lrw r1, __erodata | |
lrw r2, __data_start__ | |
lrw r3, __data_end__ | |
subu r3, r2 | |
cmpnei r3, 0 | |
bf .L_loop0_done | |
.L_loop0: | |
ldw r0, (r1, 0) | |
stw r0, (r2, 0) | |
addi r1, 4 | |
addi r2, 4 | |
subi r3, 4 | |
cmpnei r3, 0 | |
bt .L_loop0 | |
.L_loop0_done: | |
/* | |
* The BSS section is specified by following symbols | |
* __bss_start__: start of the BSS section. | |
* __bss_end__: end of the BSS section. | |
* | |
* Both addresses must be aligned to 4 bytes boundary. | |
*/ | |
lrw r1, __bss_start__ | |
lrw r2, __bss_end__ | |
movi r0, 0 | |
subu r2, r1 | |
cmpnei r2, 0 | |
bf .L_loop1_done | |
.L_loop1: | |
stw r0, (r1, 0) | |
addi r1, 4 | |
subi r2, 4 | |
cmpnei r2, 0 | |
bt .L_loop1 | |
.L_loop1_done: | |
jbsr main | |
/* Should never get here. */ | |
1: | |
br 1b | |
Misaligned_Access_Handler: | |
Access_Error_Handler: | |
Divided_By_Zero_Handler: | |
Illegal_Handler: | |
Privlege_Violation_Handler: | |
Trace_Exection_Handler: | |
Breakpoint_Exception_Handler: | |
Unrecoverable_Error_Handler: | |
Idly4_Error_Handler: | |
Auto_INT_Handler: | |
Auto_FINT_Handler: | |
Reserved_HAI_Handler: | |
Reserved_FP_Handler: | |
TLB_Ins_Empty_Handler: | |
TLB_Data_Empty_Handler: | |
Default_handler: | |
br Default_handler | |
rte | |
.section .bss | |
.align 2 | |
.global g_intstackalloc | |
.global g_intstackbase | |
.global g_top_irqstack | |
g_intstackalloc: | |
g_intstackbase: | |
.space 4096 | |
g_top_irqstack: |