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