newlib-cygwin/libgloss/csky/crt0.S

181 lines
4.3 KiB
ArmAsm
Raw Normal View History

/*
* crt0.S -- startup codes for CK-CPU.
*
* Define a exception vector table
*
* Initial PSR register.
* Initial VBR register, relocate exception vector table.
* Initial sp(stack pointer) register.
* Initial MGU (for ckcpu having MGU)
* Initial Cache.
* Initial SPM (for ckcpu having SPM).
* Initial BSS section to "0"
* Then goto "main".
*
* Copyright (c) 2020 C-SKY Microsystems All rights reserved.
*/
.file "crt0.S"
/*
* MGU & CACHE macro from "ck5a6.h"
*
* CONFIG_CKCPU_MGU_BLOCKS ---- MGU block priority setting value
* CONFIG_CKCPU_MGU_REGION(1-4)
* ---- MGU (1-4) block base address and size.
* CONFIG_CKCPU_ICACHE ---- Instruction cache enable
* CONFIG_CKCPU_DCACHE ---- Data cache enable
*
* SPM macro from "ck5a6.h"
*
* CONFIG_CKCPU_SPM ---- CKCPU having SPM ?
* CONFIG_CKCPU_SPM_ENABLE ---- SPM Enable
* CONFIG_CKCPU_ISPM_MODE ---- Instruction SPM Mode(cache/local memory)
* CONFIG_CKCPU_DSPM_MODE ---- Data SPM Mode (cache/local memory)
* CONFIG_CKCPU_ISPM_ADDRESS
* ---- Instruction SPM external memory base address,
* Just for Local Memory Mode
* CONFIG_CKCPU_DSPM_ADDRESS
* ---- Data SPM external memory base address, Just
* for Local Memory Mode
* CONFIG_CKCPU_ISPM_TRANSFER
* ---- The content in Instruction SPM must be
* initialed, Just for Local Memory Mode
* CONFIG_CKCPU_DSPM_TRANSFER
* ---- The content in Data SPM must be initialed,
* Just for Local Memory Mode
*/
/*
* For importing variable or functions from script file "ckcpu.ld".
*/
.import __stack /* The stack pointer from linking script file */
.import __fstack /* The fast interrupt stack from linking script file */
.import __sbss /* The end of bss from linking script file */
.import __ebss /* The end of bss from linking script file */
.import __csky_exit /* For QEMU exit. */
/*
* For importing variable or functions from other c or assemble files.
*/
.import main /* The c codes entry */
.import spm_init /* Initial ckcpu SPM */
.import exit
.import __libc_init_array
/*
* For importing variable or functions from entry.S.
*/
/* default exception service routine */
/*
.import default_exception_handler
*/
/* For exporting varialbe or functions */
.export ckcpu_vsr_table /* Vector table base address. */
.export __start /* The system entry. */
.text
/* Vector table space. */
.align 10
ckcpu_vsr_table:
.rept 128
.long __default_exception_handler
.endr
/* The ckcpu startup codes. */
.text
/*
*
* This is the codes first entry point. This is where it all
* begins...
*/
.long __start
__start:
/*
* Init psr value, enable exception, disable interrupt and fast interrupt.
* psr = 0x80000100
*/
lrw r7, 0
bseti r7, 31
bseti r7, 8
mtcr r7, psr
/*
* Setup initial vector base table for interrupts and exceptions
*/
lrw r6, ckcpu_vsr_table
mtcr r6, vbr
/* Initialize the normal stack pointer from the linker definition. */
lrw r7, __stack
mov sp, r7
#ifdef FAST_INTERRUPT_ENABLE
/* Initialize the fast interrupt stack pointer . */
psrset af
lrw r6, __fstack
mov sp, r6
psrclr af
#endif
/*
* Initial CKCPU MGU & Cache
* Step 1: Disable MGU & Cache.
*/
movi r7, 0
mtcr r7, cr18
#if 0
/*
* Zero out the bss region.
* NOTE: __sbss must align 4
*/
lrw r7, __sbss /* Get start of bss from linking script file */
lrw r6, __ebss /* Get end of bss from linking script file */
subu r6, r7 /* Calculate size of bss */
lsri r6, r6, 2 /* Size of whole words */
cmpnei r6, 0
bf __goto_c
movi r5, 0 /* Set zero value to write */
2:
stw r5, (r7) /* Zero next word */
addi r7, 4 /* Increase bss pointer */
subi r6, 1 /* Decrease counter */
cmpnei r6, 0
bt 2b /* Repeat for all bss */
#endif
/*
* Assember start up done, C codes start here.
*/
__goto_c:
/*jsri main*/
lrw r5, __libc_init_array
jsr r5
/*Set the argc and argv to NULL. */
movi r0, 0
movi r1, 0
lrw r5, main
jsr r5
/* Should never get here. */
jbsr exit
__csky_exit:
br __csky_exit
__default_exception_handler:
lrw r4, __csky_exit
movi r5, 0x2
stw r5, (r4, 0)
br __default_exception_handler
rte
.data
.align 4
__stack_bottom:
.rept 128
.long 0x0
.endr