mp_exception.S revision 92199
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_exception.S 92199 2002-03-13 03:43:00Z jake $ 2789051Sjake */ 2889051Sjake 2989051Sjake#include <machine/asi.h> 3089051Sjake#include <machine/ktr.h> 3189051Sjake#include <machine/asmacros.h> 3289051Sjake#include <machine/pstate.h> 3389051Sjake 3489051Sjake#include "assym.s" 3589051Sjake 3689051Sjake .register %g2, #ignore 3789051Sjake .register %g3, #ignore 3889051Sjake 3992199Sjake#define IPI_WAIT(r1, r2, r3, r4) \ 4092199Sjake lduw [PCPU(CPUMASK)], r4 ; \ 4192199Sjake ATOMIC_CLEAR_INT(r1, r2, r3, r4) ; \ 4291783Sjake9: lduw [r1], r2 ; \ 4389051Sjake brnz,a,pn r2, 9b ; \ 4489051Sjake nop 4591783Sjake#else 4691783Sjake#define IPI_WAIT(r1, r2, r3) 4791783Sjake#endif 4889051Sjake 4989051Sjake/* 5089051Sjake * Trigger a softint at the desired level. 5189051Sjake */ 5289051SjakeENTRY(tl_ipi_level) 5392199Sjake#if KTR_COMPILE & KTR_SMP 5492199Sjake CATR(KTR_SMP, "tl_ipi_level: cpuid=%d mid=%d d1=%#lx d2=%#lx" 5592199Sjake , %g1, %g2, %g3, 7, 8, 9) 5692199Sjake lduw [PCPU(CPUID)], %g2 5792199Sjake stx %g2, [%g1 + KTR_PARM1] 5892199Sjake lduw [PCPU(MID)], %g2 5992199Sjake stx %g2, [%g1 + KTR_PARM2] 6092199Sjake stx %g4, [%g1 + KTR_PARM3] 6192199Sjake stx %g5, [%g1 + KTR_PARM4] 6292199Sjake9: 6392199Sjake#endif 6489051Sjake 6589051Sjake mov 1, %g1 6692199Sjake sllx %g1, %g5, %g1 6789051Sjake wr %g1, 0, %asr20 6889051Sjake retry 6989051SjakeEND(tl_ipi_level) 7089051Sjake 7189051SjakeENTRY(tl_ipi_test) 7289051Sjake#if KTR_COMPILE & KTR_SMP 7389051Sjake CATR(KTR_SMP, "ipi_test: cpuid=%d mid=%d d1=%#lx d2=%#lx" 7489051Sjake , %g1, %g2, %g3, 7, 8, 9) 7589051Sjake lduw [PCPU(CPUID)], %g2 7689051Sjake stx %g2, [%g1 + KTR_PARM1] 7789051Sjake lduw [PCPU(MID)], %g2 7889051Sjake stx %g2, [%g1 + KTR_PARM2] 7989051Sjake stx %g4, [%g1 + KTR_PARM3] 8089051Sjake stx %g5, [%g1 + KTR_PARM4] 8189051Sjake9: 8289051Sjake#endif 8389051Sjake retry 8489051SjakeEND(tl_ipi_test) 8589051Sjake 8689051Sjake/* 8789051Sjake * Demap a page from the dtlb and/or itlb. 8889051Sjake */ 8989051SjakeENTRY(tl_ipi_tlb_page_demap) 9091783Sjake#if KTR_COMPILE & KTR_SMP 9191783Sjake CATR(KTR_SMP, "ipi_tlb_page_demap: pm=%p va=%#lx" 9291783Sjake , %g1, %g2, %g3, 7, 8, 9) 9391783Sjake ldx [%g5 + ITA_PMAP], %g2 9491783Sjake stx %g2, [%g1 + KTR_PARM1] 9591783Sjake ldx [%g5 + ITA_VA], %g2 9691783Sjake stx %g2, [%g1 + KTR_PARM2] 9791783Sjake9: 9891783Sjake#endif 9989051Sjake 10091783Sjake ldx [%g5 + ITA_PMAP], %g1 10189051Sjake 10291783Sjake SET(kernel_pmap_store, %g3, %g2) 10391783Sjake mov TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE, %g3 10489051Sjake 10591783Sjake cmp %g1, %g2 10691783Sjake movne %xcc, TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE, %g3 10789051Sjake 10891783Sjake ldx [%g5 + ITA_TLB], %g1 10991783Sjake ldx [%g5 + ITA_VA], %g2 11091783Sjake or %g2, %g3, %g2 11189051Sjake 11291783Sjake andcc %g1, TLB_DTLB, %g0 11391783Sjake bz,a,pn %xcc, 1f 11489051Sjake nop 11591783Sjake stxa %g0, [%g2] ASI_DMMU_DEMAP 11691783Sjake membar #Sync 11789051Sjake 11891783Sjake1: andcc %g1, TLB_ITLB, %g0 11991783Sjake bz,a,pn %xcc, 2f 12089051Sjake nop 12191783Sjake stxa %g0, [%g2] ASI_IMMU_DEMAP 12291783Sjake membar #Sync 12389051Sjake 12492199Sjake2: IPI_WAIT(%g5, %g1, %g2, %g3) 12589051Sjake retry 12689051SjakeEND(tl_ipi_tlb_page_demap) 12789051Sjake 12889051Sjake/* 12989051Sjake * Demap a range of pages from the dtlb and itlb. 13089051Sjake */ 13189051SjakeENTRY(tl_ipi_tlb_range_demap) 13291783Sjake#if KTR_COMPILE & KTR_SMP 13391783Sjake CATR(KTR_SMP, "ipi_tlb_range_demap: pm=%p start=%#lx end=%#lx" 13491783Sjake , %g1, %g2, %g3, 7, 8, 9) 13591783Sjake ldx [%g5 + ITA_PMAP], %g2 13691783Sjake stx %g2, [%g1 + KTR_PARM1] 13789051Sjake ldx [%g5 + ITA_START], %g2 13891783Sjake stx %g2, [%g1 + KTR_PARM2] 13991783Sjake ldx [%g5 + ITA_END], %g2 14091783Sjake stx %g2, [%g1 + KTR_PARM3] 14191783Sjake9: 14291783Sjake#endif 14389051Sjake 14491783Sjake ldx [%g5 + ITA_PMAP], %g1 14589051Sjake 14691783Sjake SET(kernel_pmap_store, %g3, %g2) 14791783Sjake mov TLB_DEMAP_NUCLEUS | TLB_DEMAP_PAGE, %g3 14889051Sjake 14991783Sjake cmp %g1, %g2 15091783Sjake movne %xcc, TLB_DEMAP_PRIMARY | TLB_DEMAP_PAGE, %g3 15189051Sjake 15291783Sjake ldx [%g5 + ITA_START], %g1 15391783Sjake ldx [%g5 + ITA_END], %g2 15489051Sjake 15591783Sjake set PAGE_SIZE, %g6 15691783Sjake 15791783Sjake1: or %g1, %g3, %g4 15889051Sjake stxa %g0, [%g4] ASI_DMMU_DEMAP 15989051Sjake stxa %g0, [%g4] ASI_IMMU_DEMAP 16091783Sjake membar #Sync 16189051Sjake 16291783Sjake add %g1, %g6, %g1 16391783Sjake cmp %g1, %g2 16491783Sjake blt,a,pt %xcc, 1b 16589051Sjake nop 16689051Sjake 16792199Sjake IPI_WAIT(%g5, %g1, %g2, %g3) 16889051Sjake retry 16989051SjakeEND(tl_ipi_tlb_range_demap) 17089051Sjake 17189051Sjake/* 17291783Sjake * Demap the primary context from the dtlb and itlb. 17389051Sjake */ 17489051SjakeENTRY(tl_ipi_tlb_context_demap) 17591783Sjake#if KTR_COMPILE & KTR_SMP 17691783Sjake CATR(KTR_SMP, "ipi_tlb_page_demap: pm=%p va=%#lx" 17791783Sjake , %g1, %g2, %g3, 7, 8, 9) 17891783Sjake ldx [%g5 + ITA_PMAP], %g2 17991783Sjake stx %g2, [%g1 + KTR_PARM1] 18091783Sjake ldx [%g5 + ITA_VA], %g2 18191783Sjake stx %g2, [%g1 + KTR_PARM2] 18291783Sjake9: 18391783Sjake#endif 18489051Sjake 18591783Sjake mov TLB_DEMAP_PRIMARY | TLB_DEMAP_CONTEXT, %g1 18691783Sjake stxa %g0, [%g1] ASI_DMMU_DEMAP 18791783Sjake stxa %g0, [%g1] ASI_IMMU_DEMAP 18889051Sjake membar #Sync 18989051Sjake 19092199Sjake IPI_WAIT(%g5, %g1, %g2, %g3) 19189051Sjake retry 19289051SjakeEND(tl_ipi_tlb_context_demap) 193