1/*- 2 * Copyright (c) 2001 Jake Burkholder. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <machine/asm.h> 28__FBSDID("$FreeBSD$"); 29 30#include <machine/asi.h> 31#include <machine/asmacros.h> 32#include <machine/intr_machdep.h> 33#include <machine/pstate.h> 34#include <machine/wstate.h> 35 36#include "assym.s" 37 38 .register %g2,#ignore 39 40 .globl kernbase 41 .set kernbase, KERNBASE 42 43/* 44 * void _start(caddr_t metadata, u_long o1, u_long o2, u_long o3, 45 * u_long ofw_vec) 46 */ 47ENTRY(btext) 48ENTRY(_start) 49 /* 50 * Initialize misc. state to known values: interrupts disabled, normal 51 * globals, windows flushed (cr = 0, cs = nwindows - 1), PIL_TICK and 52 * floating point disabled. 53 * Note that some firmware versions don't implement a clean window 54 * trap handler so we unfortunately can't clear the windows by setting 55 * %cleanwin to zero here. 56 */ 57 wrpr %g0, PSTATE_NORMAL, %pstate 58 flushw 59 wrpr %g0, PIL_TICK, %pil 60 wr %g0, 0, %fprs 61 62 /* 63 * Get onto our per-CPU panic stack, which precedes the struct pcpu in 64 * the per-CPU page. 65 */ 66 SET(pcpu0 + (PCPU_PAGES * PAGE_SIZE) - PC_SIZEOF, %l1, %l0) 67 sub %l0, SPOFF + CCFSZ, %sp 68 69 /* 70 * Do initial bootstrap to setup pmap and thread0. 71 */ 72 call sparc64_init 73 nop 74 75 /* 76 * Get onto thread0's kstack. 77 */ 78 sub PCB_REG, SPOFF + CCFSZ, %sp 79 80 /* 81 * And away we go. This doesn't return. 82 */ 83 call mi_startup 84 nop 85 sir 86 ! NOTREACHED 87END(_start) 88 89/* 90 * void cpu_setregs(struct pcpu *pc) 91 */ 92ENTRY(cpu_setregs) 93 ldx [%o0 + PC_CURPCB], %o1 94 95 /* 96 * Ensure we are on normal globals. 97 */ 98 wrpr %g0, PSTATE_NORMAL, %pstate 99 100 /* 101 * Normal %g6 points to the current thread's PCB, and %g7 points to 102 * the per-CPU data structure. 103 */ 104 mov %o1, PCB_REG 105 mov %o0, PCPU_REG 106 107 /* 108 * Switch to alternate globals. 109 */ 110 wrpr %g0, PSTATE_ALT, %pstate 111 112 /* 113 * Alternate %g5 points to a per-CPU panic stack, %g6 points to the 114 * current thread's PCB, and %g7 points to the per-CPU data structure. 115 */ 116 mov %o0, ASP_REG 117 mov %o1, PCB_REG 118 mov %o0, PCPU_REG 119 120 /* 121 * Switch to interrupt globals. 122 */ 123 wrpr %g0, PSTATE_INTR, %pstate 124 125 /* 126 * Interrupt %g7 points to the per-CPU data structure. 127 */ 128 mov %o0, PCPU_REG 129 130 /* 131 * Switch to normal globals again. 132 */ 133 wrpr %g0, PSTATE_NORMAL, %pstate 134 135 /* 136 * Force trap level 1 and take over the trap table. 137 */ 138 SET(tl0_base, %o2, %o1) 139 SET(tba_taken_over, %o3, %o2) 140 mov 1, %o3 141 wrpr %g0, WSTATE_KERNEL, %wstate 142 wrpr %g0, 1, %tl 143 wrpr %o1, 0, %tba 144 stw %o3, [%o2] 145 146 retl 147 nop 148END(cpu_setregs) 149