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