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
 |