1 /* $OpenBSD: locore.S,v 1.18 1998/09/15 10:58:53 pefo Exp $ */
3 * Copyright (c) 1992, 1993
4 * The Regents of the University of California. All rights reserved.
6 * This code is derived from software contributed to Berkeley by
7 * Digital Equipment Corporation and Ralph Campbell.
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in the
16 * documentation and/or other materials provided with the distribution.
17 * 4. Neither the name of the University nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * Copyright (C) 1989 Digital Equipment Corporation.
34 * Permission to use, copy, modify, and distribute this software and
35 * its documentation for any purpose and without fee is hereby granted,
36 * provided that the above copyright notice appears in all copies.
37 * Digital Equipment Corporation makes no representations about the
38 * suitability of this software for any purpose. It is provided "as is"
39 * without express or implied warranty.
41 * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/loMem.s,
42 * v 1.1 89/07/11 17:55:04 nelson Exp SPRITE (DECWRL)
43 * from: Header: /sprite/src/kernel/mach/ds3100.md/RCS/machAsm.s,
44 * v 9.2 90/01/29 18:00:39 shirriff Exp SPRITE (DECWRL)
45 * from: Header: /sprite/src/kernel/vm/ds3100.md/vmPmaxAsm.s,
46 * v 1.1 89/07/10 14:27:41 nelson Exp SPRITE (DECWRL)
48 * from: @(#)locore.s 8.5 (Berkeley) 1/4/94
49 * JNPR: locore.S,v 1.6.2.1 2007/08/29 12:24:49 girish
54 * FREEBSD_DEVELOPERS_FIXME
55 * The start routine below was written for a multi-core CPU
56 * with each core being hyperthreaded. This serves as an example
57 * for a complex CPU architecture. For a different CPU complex
58 * please make necessary changes to read CPU-ID etc.
59 * A clean solution would be to have a different locore file for
64 * Contains code that is the first executed at boot time plus
65 * assembly language support routines.
68 #include <machine/asm.h>
69 #include <machine/cpu.h>
70 #include <machine/cpuregs.h>
71 #include <machine/regnum.h>
78 .space 4 # Assumes mips32? Is that OK?
80 #ifdef CFE /* Assumes MIPS32, bad? */
86 #if defined(TARGET_OCTEON)
87 GLOBAL(app_descriptor_addr)
91 .space NBPG /* Smaller than it should be since it's temp. */
102 VECTOR(_locore, unknown)
103 /* UNSAFE TO USE a0..a3, since some bootloaders pass that to us */
104 mtc0 zero, COP_0_CAUSE_REG # Clear soft interrupts
106 #if defined(TARGET_OCTEON)
108 * t1: Bits to set explicitly:
113 li t1, (MIPS_SR_COP_2_BIT | MIPS_SR_COP_0_BIT | MIPS_SR_PX | MIPS_SR_KX | MIPS_SR_UX | MIPS_SR_SX | MIPS_SR_BEV)
115 /* Reset these bits */
116 li t0, ~(MIPS_SR_DE | MIPS_SR_SOFT_RESET | MIPS_SR_ERL | MIPS_SR_EXL | MIPS_SR_INT_IE)
119 * t0: Bits to preserve if set:
121 * Boot exception vectors (firmware-provided)
123 li t0, (MIPS_SR_BEV | MIPS_SR_SOFT_RESET)
125 * t1: Bits to set explicitly:
128 li t1, MIPS_SR_COP_1_BIT
131 * Read coprocessor 0 status register, clear bits not
132 * preserved (namely, clearing interrupt bits), and set
133 * bits we want to explicitly set.
135 mfc0 t2, COP_0_STATUS_REG
138 mtc0 t2, COP_0_STATUS_REG
140 /* Make sure KSEG0 is cached */
142 mtc0 t0, MIPS_COP_0_CONFIG
145 /* Read and store the PrID FPU ID for CPU identification, if any. */
146 mfc0 t2, COP_0_STATUS_REG
147 mfc0 t0, MIPS_COP_0_PRID
149 and t2, MIPS_SR_COP_1_BIT
156 * This platform has no FPU, and attempting to detect one
157 * using the official method causes an exception.
161 sw t0, _C_LABEL(cpu_id)
162 sw t1, _C_LABEL(fpu_id)
165 * Initialize stack and call machine startup.
167 la sp, _C_LABEL(topstack) - START_FRAME
169 sw zero, START_FRAME - 4(sp) # Zero out old ra for debugger
172 * now that we pass a0...a3 to the platform_init routine, do we need
173 * to stash this stuff here?
176 /* Save YAMON boot environment pointer */
177 sw a2, _C_LABEL(fenvp)
181 * Save the CFE context passed to us by the loader.
184 bne a3, t1, no_cfe /* Check for "CFE1" signature */
185 sw a0, _C_LABEL(cfe_handle)/* Firmware data segment */
186 sw a2, _C_LABEL(cfe_vector)/* Firmware entry vector */
189 #if defined(TARGET_OCTEON)
190 la a0, app_descriptor_addr
191 sw a3, 0(a0) /* Store app descriptor ptr */
195 * The following needs to be done differently for each platform and
196 * there needs to be a good way to plug this in.
198 #if defined(SMP) && defined(CPU_XLR)
200 * Block all the slave CPUs
203 * Read the cpu id from the cp0 config register
204 * cpuid[9:4], thrid[3: 0]
206 mfc0 a0, COP_0_CONFIG, 7
211 /* calculate linear cpuid */
214 /* Initially, disable all hardware threads on each core except thread0 */
216 li t2, XLR_THREAD_ENABLE_IND
221 #if defined(TARGET_OCTEON) /* Maybe this is mips32/64 generic? */
230 /* Stage the secondary cpu start until later */
231 bne t0, zero, start_secondary
235 la t0, _C_LABEL(__pcpu)
237 /* If not master cpu, jump... */
238 /*XXX this assumes the above #if 0'd code runs */
239 bne a2, zero, start_secondary
243 /* Call the platform-specific startup code. */
244 jal _C_LABEL(platform_start)
245 sw zero, START_FRAME - 8(sp) # Zero out old fp for debugger
247 la sp, _C_LABEL(thread0)
251 subu sp, a0, START_FRAME
253 jal _C_LABEL(mi_startup) # mi_startup(frame)
254 sw zero, START_FRAME - 8(sp) # Zero out old fp for debugger
256 PANIC("Startup failed!")
268 lw sp, PC_BOOT_STACK(t0)
271 jal _C_LABEL(smp_init_secondary)