start.s

来自「最新版的u-boot,2008-10-18发布」· S 代码 · 共 662 行 · 第 1/2 页

S
662
字号
/* This is where the SPARC/LEON3 starts * Copyright (C) 2007, * Daniel Hellstrom, daniel@gaisler.com * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA */#include <config.h>#include <asm/asmmacro.h>#include <asm/winmacro.h>#include <asm/psr.h>#include <asm/stack.h>#include <asm/leon.h>#include <version.h>/* Entry for traps which jump to a programmer-specified trap handler.  */#define TRAPR(H)  \	wr	%g0, 0xfe0, %psr; \	mov	%g0, %tbr; \	ba	(H); \	mov	%g0, %wim;#define TRAP(H) \	mov	%psr, %l0; \	ba	(H); \	nop; nop;#define TRAPI(ilevel) \	mov	ilevel, %l7; \	mov	%psr, %l0; \	b	_irq_entry; \	mov	%wim, %l3/* Unexcpected trap will halt the processor by forcing it to error state */#undef BAD_TRAP#define BAD_TRAP ta 0; nop; nop; nop;/* Software trap. Treat as BAD_TRAP for the time being... */#define SOFT_TRAP TRAP(_hwerr)#define PSR_INIT   0x1FC0	/* Disable traps, set s and ps */#define WIM_INIT   2/* All traps low-level code here must end with this macro. */#define RESTORE_ALL b ret_trap_entry; clr %l6;#define WRITE_PAUSE nop;nop;nopWINDOWSIZE = (16 * 4)ARGPUSHSIZE = (6 * 4)ARGPUSH = (WINDOWSIZE + 4)MINFRAME = (WINDOWSIZE + ARGPUSHSIZE + 4)/* Number of register windows */#ifndef CFG_SPARC_NWINDOWS#error Must define number of SPARC register windows, default is 8#endif#define STACK_ALIGN	8#define SA(X)	(((X)+(STACK_ALIGN-1)) & ~(STACK_ALIGN-1))	.section ".start", "ax"	.globl	_start, start, _trap_table	.globl  _irq_entry, nmi_trap	.globl  _reset_reloc/* at address 0 * Hardware traps */start:_start:_trap_table:	TRAPR(_hardreset);		! 00 reset trap	BAD_TRAP;			! 01 instruction_access_exception	BAD_TRAP;			! 02 illegal_instruction	BAD_TRAP;			! 03 priveleged_instruction	BAD_TRAP;			! 04 fp_disabled	TRAP(_window_overflow);		! 05 window_overflow	TRAP(_window_underflow);	! 06 window_underflow	BAD_TRAP;			! 07 Memory Address Not Aligned	BAD_TRAP;			! 08 Floating Point Exception	BAD_TRAP;			! 09 Data Miss Exception	BAD_TRAP;			! 0a Tagged Instruction Ovrflw	BAD_TRAP;			! 0b Watchpoint Detected	BAD_TRAP;			! 0c	BAD_TRAP;			! 0d	BAD_TRAP;			! 0e	BAD_TRAP;			! 0f	BAD_TRAP;			! 10	TRAPI(1);			! 11 IRQ level 1	TRAPI(2);			! 12 IRQ level 2	TRAPI(3);			! 13 IRQ level 3	TRAPI(4);			! 14 IRQ level 4	TRAPI(5);			! 15 IRQ level 5	TRAPI(6);			! 16 IRQ level 6	TRAPI(7);			! 17 IRQ level 7	TRAPI(8);			! 18 IRQ level 8	TRAPI(9);			! 19 IRQ level 9	TRAPI(10);			! 1a IRQ level 10	TRAPI(11);			! 1b IRQ level 11	TRAPI(12);			! 1c IRQ level 12	TRAPI(13);			! 1d IRQ level 13	TRAPI(14);			! 1e IRQ level 14	TRAP(_nmi_trap);		! 1f IRQ level 15 /					! NMI (non maskable interrupt)	BAD_TRAP;			! 20 r_register_access_error	BAD_TRAP;			! 21 instruction access error	BAD_TRAP;			! 22	BAD_TRAP;			! 23	BAD_TRAP;			! 24 co-processor disabled	BAD_TRAP;			! 25 uniplemented FLUSH	BAD_TRAP;			! 26	BAD_TRAP;			! 27	BAD_TRAP;			! 28 co-processor exception	BAD_TRAP;			! 29 data access error	BAD_TRAP;			! 2a division by zero	BAD_TRAP;			! 2b data store error	BAD_TRAP;			! 2c data access MMU miss	BAD_TRAP;			! 2d	BAD_TRAP;			! 2e	BAD_TRAP;			! 2f	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 30-33	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 34-37	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 38-3b	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 3c-3f	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 40-43	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 44-47	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 48-4b	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 4c-4f	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 50-53	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 54-57	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 58-5b	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 5c-5f	/* implementaion dependent */	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 60-63	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 64-67	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 68-6b	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 6c-6f	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 70-73	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 74-77	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 78-7b	BAD_TRAP; BAD_TRAP; BAD_TRAP; BAD_TRAP; ! 7c-7f	/* Software traps, not handled */	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 80-83	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 84-87	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 88-8b	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 8c-8f	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 90-93	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 94-97	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 98-9b	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! 9c-9f	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! a0-a3	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! a4-a7	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! a8-ab	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! ac-af	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! b0-b3	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! b4-b7	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! b8-bb	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! bc-bf	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! c0-c3	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! c4-c7	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! c8-cb	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! cc-cf	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! d0-d3	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! d4-d7	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! d8-db	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! dc-df	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! e0-e3	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! e4-e7	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! e8-eb	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! ec-ef	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! f0-f3	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! f4-f7	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! f8-fb	SOFT_TRAP; SOFT_TRAP; SOFT_TRAP; SOFT_TRAP;	! fc-ff/* * Version string */	.data	.globl	version_stringversion_string:	.ascii U_BOOT_VERSION	.ascii " (", __DATE__, " - ", __TIME__, ")"	.ascii CONFIG_IDENT_STRING, "\0"	.section	".text"	.align 4_hardreset:1000:	flush	nop	nop	nop	/* Init Cache */	set     (LEON2_PREGS+LEON_REG_CACHECTRL_OFFSET), %g1	set     0x0081000f, %g2	st      %g2, [%g1]	mov	%g0, %y	clr	%g1	clr	%g2	clr	%g3	clr	%g4	clr	%g5	clr	%g6	clr	%g7	mov	%asr17, %g3	and	%g3, 0x1f, %g3clear_window:	mov	%g0, %l0	mov	%g0, %l1	mov	%g0, %l2	mov	%g0, %l3	mov	%g0, %l4	mov	%g0, %l5	mov	%g0, %l6	mov	%g0, %l7	mov	%g0, %o0	mov	%g0, %o1	mov	%g0, %o2	mov	%g0, %o3	mov	%g0, %o4	mov	%g0, %o5	mov	%g0, %o6	mov	%g0, %o7	subcc	%g3, 1, %g3	bge	clear_window	saveleon2_init:	/* LEON2 Register Base in g1 */	set	LEON2_PREGS, %g1leon2_init_cache:	/* Set Cache control register */	set	0x1000f, %g2	st	%g2, [%g1 + 0x14]leon2_init_clear:	/* Clear LEON2 registers */	st	%g0, [%g1 + LEON2_ECTRL]	st	%g0, [%g1 + LEON2_IMASK]	st	%g0, [%g1 + LEON2_IPEND]	st	%g0, [%g1 + LEON2_IFORCE]	st	%g0, [%g1 + LEON2_ICLEAR]	st	%g0, [%g1 + LEON2_IOREG]	st	%g0, [%g1 + LEON2_IODIR]	st	%g0, [%g1 + LEON2_IOICONF]	st	%g0, [%g1 + LEON2_UCTRL0]	st	%g0, [%g1 + LEON2_UCTRL1]leon2_init_ioport:	/* I/O port initialization */	set	0xaa00, %g2	st	%g2, [%g1 + LEON2_IOREG]leon2_init_mctrl:	/* memory config register 1 */	set	CFG_GRLIB_MEMCFG1, %g2	ld	[%g1], %g3		!	and	%g3, 0x300, %g3	or	%g2, %g3, %g2	st	%g2, [%g1 + LEON2_MCFG1]	set	CFG_GRLIB_MEMCFG2, %g2		! Load memory config register 2#if !( defined(TSIM) || !defined(BZIMAGE))	st	%g2, [%g1 + LEON2_MCFG2]	! only for prom version, else done by "dumon -i"#endif	set	CFG_GRLIB_MEMCFG3, %g2		! Init FT register	st	%g2, [%g1 + LEON2_ECTRL]	ld	[%g1 + LEON2_ECTRL], %g2	srl	%g2, 30, %g2	andcc	%g2, 3, %g6	bne,a	leon2_init_wim	mov	%g0, %asr16		! clear err_regleon2_init_wim:	set	WIM_INIT, %g3	mov	%g3, %wimleon2_init_psr:	set	0x1000, %g3	mov	%psr, %g2	wr	%g2, %g3, %psr	nop	nop	nopleon2_init_stackp:	set	CFG_INIT_SP_OFFSET, %fp	andn	%fp, 0x0f, %fp	sub	%fp, 64, %spcpu_init_unreloc:	call	cpu_init_f	nop/* un relocated start address of monitor */#define TEXT_START _text/* un relocated end address of monitor */#define DATA_END __init_endreloc:	set	TEXT_START,%g2	set	DATA_END,%g3	set	CFG_RELOC_MONITOR_BASE,%g4reloc_loop:

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?