181 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
/*
 | 
						|
 * 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
 |