mp_locore.S revision 91617
1100882Smike/*- 2100882Smike * Copyright (c) 2002 Jake Burkholder. 3100882Smike * All rights reserved. 4100882Smike * 5100882Smike * Redistribution and use in source and binary forms, with or without 6100882Smike * modification, are permitted provided that the following conditions 7100882Smike * are met: 8100882Smike * 1. Redistributions of source code must retain the above copyright 9100882Smike * notice, this list of conditions and the following disclaimer. 10100882Smike * 2. Redistributions in binary form must reproduce the above copyright 11100882Smike * notice, this list of conditions and the following disclaimer in the 12100882Smike * documentation and/or other materials provided with the distribution. 13100882Smike * 14100882Smike * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15100882Smike * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16100882Smike * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17100882Smike * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18100882Smike * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19100882Smike * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20100882Smike * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21100882Smike * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22100882Smike * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23100882Smike * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24100882Smike * SUCH DAMAGE. 25100882Smike * 26100882Smike * $FreeBSD: head/sys/sparc64/sparc64/mp_locore.S 91617 2002-03-04 07:12:36Z jake $ 27100882Smike */ 28100882Smike 29100882Smike#include <machine/asi.h> 30100882Smike#include <machine/asmacros.h> 31100882Smike#include <machine/ktr.h> 32100882Smike#include <machine/pstate.h> 33100882Smike#include <machine/upa.h> 34100882Smike 35100882Smike#include "assym.s" 36100882Smike 37100882Smike .register %g2, #ignore 38100882Smike .register %g3, #ignore 39100882Smike 40100882Smike .text 41100882Smike .align 16 42100882Smike1: rd %pc, %l0 43100882Smike ldx [%l0 + (4f-1b)], %l1 44100882Smike add %l0, (6f-1b), %l2 45100882Smike clr %l3 46100882Smike2: cmp %l3, %l1 47100882Smike be %xcc, 3f 48100882Smike nop 49100882Smike ldx [%l2 + TTE_VPN], %l4 50100882Smike ldx [%l2 + TTE_DATA], %l5 51100882Smike sllx %l4, PAGE_SHIFT, %l4 52100882Smike wr %g0, ASI_DMMU, %asi 53100882Smike stxa %l4, [%g0 + AA_DMMU_TAR] %asi 54100882Smike stxa %l5, [%g0] ASI_DTLB_DATA_IN_REG 55100882Smike wr %g0, ASI_IMMU, %asi 56100882Smike stxa %l4, [%g0 + AA_IMMU_TAR] %asi 57100882Smike stxa %l5, [%g0] ASI_ITLB_DATA_IN_REG 58100882Smike membar #Sync 59100882Smike flush %l4 60100882Smike add %l2, 1 << TTE_SHIFT, %l2 61100882Smike add %l3, 1, %l3 62100882Smike ba %xcc, 2b 63100882Smike nop 64100882Smike3: ldx [%l0 + (5f-1b)], %l1 65100882Smike jmpl %l1, %g0 66100882Smike nop 67100882Smike .align 16 68100882Smike4: .xword 0x0 69100882Smike5: .xword 0x0 70100882Smike6: 71100882Smike 72100882SmikeDATA(mp_tramp_code) 73100882Smike .xword 1b 74100882SmikeDATA(mp_tramp_code_len) 75100882Smike .xword 6b-1b 76100882SmikeDATA(mp_tramp_tlb_slots) 77100882Smike .xword 4b-1b 78100882SmikeDATA(mp_tramp_func) 79100882Smike .xword 5b-1b 80100882Smike 81100882Smike/* 82100882Smike * void mp_startup(void) 83100882Smike */ 84100882SmikeENTRY(mp_startup) 85100882Smike wrpr %g0, PSTATE_NORMAL, %pstate 86100882Smike wrpr %g0, 0, %cleanwin 87100882Smike wrpr %g0, 0, %pil 88100882Smike wr %g0, 0, %fprs 89100882Smike 90100882Smike SET(cpu_start_args, %l1, %l0) 91100882Smike 92100882Smike mov CPU_CLKSYNC, %l1 93100882Smike membar #StoreLoad 94100882Smike stw %l1, [%l0 + CSA_STATE] 95100882Smike 96100882Smike1: ldx [%l0 + CSA_TICK], %l1 97100882Smike brz %l1, 1b 98100882Smike nop 99100882Smike wrpr %l1, 0, %tick 100100882Smike 101100882Smike UPA_GET_MID(%o0) 102100882Smike 103100882Smike#if KTR_COMPILE & KTR_SMP 104100882Smike CATR(KTR_SMP, "mp_start: cpu %d entered kernel" 105100882Smike , %g1, %g2, %g3, 7, 8, 9) 106100882Smike stx %o0, [%g1 + KTR_PARM1] 107100882Smike9: 108100882Smike#endif 109100882Smike 110100882Smike rdpr %ver, %l1 111100882Smike stx %l1, [%l0 + CSA_VER] 112100882Smike 113100882Smike /* 114100882Smike * Inform the boot processor we have inited. 115100882Smike */ 116100882Smike mov CPU_INIT, %l1 117100882Smike membar #LoadStore 118100882Smike stw %l1, [%l0 + CSA_STATE] 119100882Smike 120100882Smike /* 121100882Smike * Wait till its our turn to bootstrap. 122100882Smike */ 123100882Smike1: lduw [%l0 + CSA_MID], %l1 124100882Smike cmp %l1, %o0 125100882Smike bne %xcc, 1b 126100882Smike nop 127100882Smike 128100882Smike#if KTR_COMPILE & KTR_SMP 129100882Smike CATR(KTR_SMP, "_mp_start: cpu %d got start signal" 130100882Smike , %g1, %g2, %g3, 7, 8, 9) 131100882Smike stx %o0, [%g1 + KTR_PARM1] 132100882Smike9: 133100882Smike#endif 134100882Smike 135100882Smike /* 136100882Smike * Find our per-cpu page and the tte data that we will use to map it. 137100882Smike */ 138100882Smike ldx [%l0 + CSA_TTES + TTE_VPN], %l1 139100882Smike ldx [%l0 + CSA_TTES + TTE_DATA], %l2 140100882Smike 141100882Smike /* 142100882Smike * Map the per-cpu page. It uses a locked tlb entry. 143100882Smike */ 144100882Smike wr %g0, ASI_DMMU, %asi 145100882Smike sllx %l1, PAGE_SHIFT, %l1 146100882Smike stxa %l1, [%g0 + AA_DMMU_TAR] %asi 147100882Smike stxa %l2, [%g0] ASI_DTLB_DATA_IN_REG 148100882Smike membar #Sync 149100882Smike 150100882Smike /* 151100882Smike * Get onto our per-cpu panic stack, which precedes the struct pcpu 152100882Smike * in the per-cpu page. 153100882Smike */ 154100882Smike set PCPU_PAGES * PAGE_SIZE - PC_SIZEOF, %l2 155100882Smike add %l1, %l2, %l1 156100882Smike sub %l1, SPOFF + CCFSZ, %sp 157100882Smike 158100882Smike /* 159100882Smike * Enable interrupts. 160100882Smike */ 161100882Smike wrpr %g0, PSTATE_KERNEL, %pstate 162100882Smike 163100882Smike#if KTR_COMPILE & KTR_SMP 164100882Smike CATR(KTR_SMP, 165100882Smike "_mp_start: bootstrap cpuid=%d mid=%d pcpu=%#lx data=%#lx sp=%#lx" 166100882Smike , %g1, %g2, %g3, 7, 8, 9) 167100882Smike lduw [%l2 + PC_CPUID], %g2 168100882Smike stx %g2, [%g1 + KTR_PARM1] 169100882Smike lduw [%l2 + PC_MID], %g2 170100882Smike stx %g2, [%g1 + KTR_PARM2] 171100882Smike stx %l2, [%g1 + KTR_PARM3] 172 stx %l1, [%g1 + KTR_PARM4] 173 stx %sp, [%g1 + KTR_PARM5] 1749: 175#endif 176 177 /* 178 * And away we go. This doesn't return. 179 */ 180 call cpu_mp_bootstrap 181 mov %l1, %o0 182 sir 183 ! NOTREACHED 184END(mp_startup) 185