mp_locore.S revision 102040
189051Sjake/*- 289051Sjake * Copyright (c) 2002 Jake Burkholder. 389051Sjake * All rights reserved. 489051Sjake * 589051Sjake * Redistribution and use in source and binary forms, with or without 689051Sjake * modification, are permitted provided that the following conditions 789051Sjake * are met: 889051Sjake * 1. Redistributions of source code must retain the above copyright 989051Sjake * notice, this list of conditions and the following disclaimer. 1089051Sjake * 2. Redistributions in binary form must reproduce the above copyright 1189051Sjake * notice, this list of conditions and the following disclaimer in the 1289051Sjake * documentation and/or other materials provided with the distribution. 1389051Sjake * 1489051Sjake * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 1589051Sjake * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 1689051Sjake * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 1789051Sjake * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 1889051Sjake * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 1989051Sjake * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 2089051Sjake * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 2189051Sjake * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 2289051Sjake * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 2389051Sjake * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 2489051Sjake * SUCH DAMAGE. 2589051Sjake * 2689051Sjake * $FreeBSD: head/sys/sparc64/sparc64/mp_locore.S 102040 2002-08-18 02:09:27Z jake $ 2789051Sjake */ 2889051Sjake 2989051Sjake#include <machine/asi.h> 3089051Sjake#include <machine/asmacros.h> 3189051Sjake#include <machine/ktr.h> 3289051Sjake#include <machine/pstate.h> 3391617Sjake#include <machine/upa.h> 3489051Sjake 3589051Sjake#include "assym.s" 3689051Sjake 3789051Sjake .register %g2, #ignore 3889051Sjake .register %g3, #ignore 3989051Sjake 4091617Sjake .text 41100899Sjake _ALIGN_TEXT 4291617Sjake1: rd %pc, %l0 4391617Sjake ldx [%l0 + (4f-1b)], %l1 4491617Sjake add %l0, (6f-1b), %l2 4591617Sjake clr %l3 4691617Sjake2: cmp %l3, %l1 4791617Sjake be %xcc, 3f 4891617Sjake nop 4991617Sjake ldx [%l2 + TTE_VPN], %l4 5091617Sjake ldx [%l2 + TTE_DATA], %l5 51102040Sjake srlx %l4, TV_SIZE_BITS, %l4 52102040Sjake sllx %l4, PAGE_SHIFT_4M, %l4 5391617Sjake wr %g0, ASI_DMMU, %asi 5491617Sjake stxa %l4, [%g0 + AA_DMMU_TAR] %asi 5591617Sjake stxa %l5, [%g0] ASI_DTLB_DATA_IN_REG 5691617Sjake wr %g0, ASI_IMMU, %asi 5791617Sjake stxa %l4, [%g0 + AA_IMMU_TAR] %asi 5891617Sjake stxa %l5, [%g0] ASI_ITLB_DATA_IN_REG 5991617Sjake membar #Sync 6091617Sjake flush %l4 6191617Sjake add %l2, 1 << TTE_SHIFT, %l2 6291617Sjake add %l3, 1, %l3 6391617Sjake ba %xcc, 2b 6491617Sjake nop 6591617Sjake3: ldx [%l0 + (5f-1b)], %l1 6691617Sjake jmpl %l1, %g0 6791617Sjake nop 68100899Sjake _ALIGN_DATA 6991617Sjake4: .xword 0x0 7091617Sjake5: .xword 0x0 7191617Sjake6: 7291617Sjake 7391617SjakeDATA(mp_tramp_code) 7491617Sjake .xword 1b 7591617SjakeDATA(mp_tramp_code_len) 7691617Sjake .xword 6b-1b 7791617SjakeDATA(mp_tramp_tlb_slots) 7891617Sjake .xword 4b-1b 7991617SjakeDATA(mp_tramp_func) 8091617Sjake .xword 5b-1b 8191617Sjake 8289051Sjake/* 8391617Sjake * void mp_startup(void) 8489051Sjake */ 8591617SjakeENTRY(mp_startup) 8691617Sjake wrpr %g0, PSTATE_NORMAL, %pstate 8791617Sjake wrpr %g0, 0, %cleanwin 8891617Sjake wrpr %g0, 0, %pil 8991617Sjake wr %g0, 0, %fprs 9089051Sjake 9191617Sjake SET(cpu_start_args, %l1, %l0) 9291617Sjake 9391617Sjake mov CPU_CLKSYNC, %l1 9489051Sjake membar #StoreLoad 9591617Sjake stw %l1, [%l0 + CSA_STATE] 9689051Sjake 9791617Sjake1: ldx [%l0 + CSA_TICK], %l1 9891617Sjake brz %l1, 1b 9991617Sjake nop 10091617Sjake wrpr %l1, 0, %tick 10191617Sjake 10291617Sjake UPA_GET_MID(%o0) 10391617Sjake 10489051Sjake#if KTR_COMPILE & KTR_SMP 10591617Sjake CATR(KTR_SMP, "mp_start: cpu %d entered kernel" 10689051Sjake , %g1, %g2, %g3, 7, 8, 9) 10791617Sjake stx %o0, [%g1 + KTR_PARM1] 10889051Sjake9: 10989051Sjake#endif 11089051Sjake 11191617Sjake rdpr %ver, %l1 11291617Sjake stx %l1, [%l0 + CSA_VER] 11389051Sjake 11489051Sjake /* 11591617Sjake * Inform the boot processor we have inited. 11689051Sjake */ 11791617Sjake mov CPU_INIT, %l1 11891617Sjake membar #LoadStore 11991617Sjake stw %l1, [%l0 + CSA_STATE] 12091617Sjake 12191617Sjake /* 12291617Sjake * Wait till its our turn to bootstrap. 12391617Sjake */ 12491783Sjake2: lduw [%l0 + CSA_MID], %l1 12591617Sjake cmp %l1, %o0 12691783Sjake bne %xcc, 2b 12789051Sjake nop 12889051Sjake 12989051Sjake#if KTR_COMPILE & KTR_SMP 13089051Sjake CATR(KTR_SMP, "_mp_start: cpu %d got start signal" 13189051Sjake , %g1, %g2, %g3, 7, 8, 9) 13291617Sjake stx %o0, [%g1 + KTR_PARM1] 13389051Sjake9: 13489051Sjake#endif 13589051Sjake 13691783Sjake add %l0, CSA_TTES, %l1 13791783Sjake clr %l2 13891783Sjake 13989051Sjake /* 14091783Sjake * Map the per-cpu pages. 14189051Sjake */ 14291783Sjake3: sllx %l2, TTE_SHIFT, %l3 14391783Sjake add %l1, %l3, %l3 14489051Sjake 14591783Sjake ldx [%l3 + TTE_VPN], %l4 14691783Sjake ldx [%l3 + TTE_DATA], %l5 14791783Sjake 14889051Sjake wr %g0, ASI_DMMU, %asi 149102040Sjake srlx %l4, TV_SIZE_BITS, %l4 150102040Sjake sllx %l4, PAGE_SHIFT_8K, %l4 15191783Sjake stxa %l4, [%g0 + AA_DMMU_TAR] %asi 15291783Sjake stxa %l5, [%g0] ASI_DTLB_DATA_IN_REG 15389051Sjake membar #Sync 15489051Sjake 15591783Sjake add %l2, 1, %l2 15691783Sjake cmp %l2, PCPU_PAGES 15791783Sjake bne %xcc, 3b 15891783Sjake nop 15991783Sjake 16089051Sjake /* 16189051Sjake * Get onto our per-cpu panic stack, which precedes the struct pcpu 16289051Sjake * in the per-cpu page. 16389051Sjake */ 16491783Sjake ldx [%l0 + CSA_PCPU], %l1 16591617Sjake set PCPU_PAGES * PAGE_SIZE - PC_SIZEOF, %l2 16691617Sjake add %l1, %l2, %l1 16791617Sjake sub %l1, SPOFF + CCFSZ, %sp 16889051Sjake 16989051Sjake /* 17089051Sjake * Enable interrupts. 17189051Sjake */ 17289051Sjake wrpr %g0, PSTATE_KERNEL, %pstate 17389051Sjake 17489051Sjake#if KTR_COMPILE & KTR_SMP 17589051Sjake CATR(KTR_SMP, 17689051Sjake "_mp_start: bootstrap cpuid=%d mid=%d pcpu=%#lx data=%#lx sp=%#lx" 17789051Sjake , %g1, %g2, %g3, 7, 8, 9) 17891783Sjake lduw [%l1 + PC_CPUID], %g2 17989051Sjake stx %g2, [%g1 + KTR_PARM1] 18091783Sjake lduw [%l1 + PC_MID], %g2 18189051Sjake stx %g2, [%g1 + KTR_PARM2] 18291783Sjake stx %l1, [%g1 + KTR_PARM3] 18389051Sjake stx %sp, [%g1 + KTR_PARM5] 18489051Sjake9: 18589051Sjake#endif 18689051Sjake 18789051Sjake /* 18889051Sjake * And away we go. This doesn't return. 18989051Sjake */ 19089051Sjake call cpu_mp_bootstrap 19191617Sjake mov %l1, %o0 19289051Sjake sir 19389051Sjake ! NOTREACHED 19491617SjakeEND(mp_startup) 195