2 * Copyright (C) 2009 Wind River Systems Inc
3 * Implemented by fredrik.markstrom@gmail.com and ivarholmqvist@gmail.com
4 * Copyright (C) 2004 Microtronix Datacom Ltd
5 * Copyright (C) 2001 Vic Phillips, Microtronix Datacom Ltd.
7 * Based on head.S for Altera's Excalibur development board with nios processor
9 * Based on the following from the Excalibur sdk distribution:
10 * NA_MemoryMap.s, NR_JumpToStart.s, NR_Setup.s, NR_CWPManager.s
12 * This file is subject to the terms and conditions of the GNU General Public
13 * License. See the file "COPYING" in the main directory of this archive
17 #include <linux/init.h>
18 #include <linux/linkage.h>
19 #include <asm/thread_info.h>
20 #include <asm/processor.h>
21 #include <asm/cache.h>
23 #include <asm/asm-offsets.h>
24 #include <asm/asm-macros.h>
27 * ZERO_PAGE is a special page that is used for zero-initialized
31 .global empty_zero_page
37 * This global variable is used as an extension to the nios'
38 * STATUS register to emulate a user/supervisor mode.
44 .global _current_thread
48 * Input(s): passed from u-boot
49 * r4 - Optional pointer to a board information structure.
50 * r5 - Optional pointer to the physical starting address of the init RAM
52 * r6 - Optional pointer to the physical ending address of the init RAM
54 * r7 - Optional pointer to the physical starting address of any kernel
55 * command-line parameters.
59 * First executable code - detected and jumped to by the ROM bootstrap
60 * if the code resides in flash (looks for "Nios" at offset 0x0c from
61 * the potential executable image).
65 wrctl status, r0 /* Disable interrupts */
67 /* Initialize all cache lines within the instruction cache */
68 movia r1, NIOS2_ICACHE_SIZE
69 movui r2, NIOS2_ICACHE_LINE_SIZE
74 bgt r1, r0, icache_init
78 * This is the default location for the exception handler. Code in jump
81 ENTRY(exception_handler_hook)
88 stw r3, r3save - helper(et)
106 ldw r3, r3save - helper2(et)
111 ENTRY(fast_handler_end)
115 * After the instruction cache is initialized, the data cache must
116 * also be initialized.
118 movia r1, NIOS2_DCACHE_SIZE
119 movui r2, NIOS2_DCACHE_LINE_SIZE
124 bgt r1, r0, dcache_init
126 nextpc r1 /* Find out where we are */
129 beq r1, r2,finish_move /* We are running in RAM done */
130 addi r1, r1,(_start - chkadr) /* Source */
131 movia r2, _start /* Destination */
132 movia r3, __bss_start /* End of copy */
134 loop_move: /* r1: src, r2: dest, r3: last dest */
135 ldw r8, 0(r1) /* load a word from [r1] */
136 stw r8, 0(r2) /* store a word to dest [r2] */
137 flushd 0(r2) /* Flush cache for safety */
138 addi r1, r1, 4 /* inc the src addr */
139 addi r2, r2, 4 /* inc the dest addr */
140 blt r2, r3, loop_move
142 movia r1, finish_move /* VMA(_start)->l1 */
143 jmp r1 /* jmp to _start */
147 /* Mask off all possible interrupts */
151 movia r2, __bss_start
158 movia r1, init_thread_union /* set stack at top of the task union */
159 addi sp, r1, THREAD_SIZE
160 movia r2, _current_thread /* Remember current thread */
163 movia r1, nios2_boot_init /* save args r4-r7 passed from u-boot */
166 movia r1, start_kernel /* call start_kernel as a subroutine */
169 /* If we return from start_kernel, break to the oci debugger and
174 /* End of startup code */