blob: a72543a712129dab62f26d8b10efb4bc1f953d31 [file] [log] [blame]
/*
* 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: