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 + -
显示快捷键?