xref: /openbmc/linux/arch/sparc/kernel/trampoline_64.S (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2a88b5ba8SSam Ravnborg/*
3a88b5ba8SSam Ravnborg * trampoline.S: Jump start slave processors on sparc64.
4a88b5ba8SSam Ravnborg *
5a88b5ba8SSam Ravnborg * Copyright (C) 1997 David S. Miller (davem@caip.rutgers.edu)
6a88b5ba8SSam Ravnborg */
7a88b5ba8SSam Ravnborg
8a88b5ba8SSam Ravnborg
9*65fddcfcSMike Rapoport#include <linux/pgtable.h>
10a88b5ba8SSam Ravnborg#include <asm/head.h>
11a88b5ba8SSam Ravnborg#include <asm/asi.h>
12a88b5ba8SSam Ravnborg#include <asm/lsu.h>
13a88b5ba8SSam Ravnborg#include <asm/dcr.h>
14a88b5ba8SSam Ravnborg#include <asm/dcu.h>
15a88b5ba8SSam Ravnborg#include <asm/pstate.h>
16a88b5ba8SSam Ravnborg#include <asm/page.h>
17a88b5ba8SSam Ravnborg#include <asm/spitfire.h>
18a88b5ba8SSam Ravnborg#include <asm/processor.h>
19a88b5ba8SSam Ravnborg#include <asm/thread_info.h>
20a88b5ba8SSam Ravnborg#include <asm/mmu.h>
21a88b5ba8SSam Ravnborg#include <asm/hypervisor.h>
22a88b5ba8SSam Ravnborg#include <asm/cpudata.h>
23a88b5ba8SSam Ravnborg
24a88b5ba8SSam Ravnborg	.data
25a88b5ba8SSam Ravnborg	.align	8
26a88b5ba8SSam Ravnborgcall_method:
27a88b5ba8SSam Ravnborg	.asciz	"call-method"
28a88b5ba8SSam Ravnborg	.align	8
29a88b5ba8SSam Ravnborgitlb_load:
30a88b5ba8SSam Ravnborg	.asciz	"SUNW,itlb-load"
31a88b5ba8SSam Ravnborg	.align	8
32a88b5ba8SSam Ravnborgdtlb_load:
33a88b5ba8SSam Ravnborg	.asciz	"SUNW,dtlb-load"
34a88b5ba8SSam Ravnborg
35a88b5ba8SSam Ravnborg#define TRAMP_STACK_SIZE	1024
36a88b5ba8SSam Ravnborg	.align	16
37a88b5ba8SSam Ravnborgtramp_stack:
38a88b5ba8SSam Ravnborg	.skip	TRAMP_STACK_SIZE
39a88b5ba8SSam Ravnborg
40a88b5ba8SSam Ravnborg	.align		8
41a88b5ba8SSam Ravnborg	.globl		sparc64_cpu_startup, sparc64_cpu_startup_end
42a88b5ba8SSam Ravnborgsparc64_cpu_startup:
43a88b5ba8SSam Ravnborg	BRANCH_IF_SUN4V(g1, niagara_startup)
44a88b5ba8SSam Ravnborg	BRANCH_IF_CHEETAH_BASE(g1, g5, cheetah_startup)
45a88b5ba8SSam Ravnborg	BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1, g5, cheetah_plus_startup)
46a88b5ba8SSam Ravnborg
47a88b5ba8SSam Ravnborg	ba,pt	%xcc, spitfire_startup
48a88b5ba8SSam Ravnborg	 nop
49a88b5ba8SSam Ravnborg
50a88b5ba8SSam Ravnborgcheetah_plus_startup:
51a88b5ba8SSam Ravnborg	/* Preserve OBP chosen DCU and DCR register settings.  */
52a88b5ba8SSam Ravnborg	ba,pt	%xcc, cheetah_generic_startup
53a88b5ba8SSam Ravnborg	 nop
54a88b5ba8SSam Ravnborg
55a88b5ba8SSam Ravnborgcheetah_startup:
56a88b5ba8SSam Ravnborg	mov	DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1
57a88b5ba8SSam Ravnborg	wr	%g1, %asr18
58a88b5ba8SSam Ravnborg
59a88b5ba8SSam Ravnborg	sethi	%uhi(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5
60a88b5ba8SSam Ravnborg	or	%g5, %ulo(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g5
61a88b5ba8SSam Ravnborg	sllx	%g5, 32, %g5
62a88b5ba8SSam Ravnborg	or	%g5, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g5
63a88b5ba8SSam Ravnborg	stxa	%g5, [%g0] ASI_DCU_CONTROL_REG
64a88b5ba8SSam Ravnborg	membar	#Sync
65a88b5ba8SSam Ravnborg	/* fallthru */
66a88b5ba8SSam Ravnborg
67a88b5ba8SSam Ravnborgcheetah_generic_startup:
68a88b5ba8SSam Ravnborg	mov	TSB_EXTENSION_P, %g3
69a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_DMMU
70a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_IMMU
71a88b5ba8SSam Ravnborg	membar	#Sync
72a88b5ba8SSam Ravnborg
73a88b5ba8SSam Ravnborg	mov	TSB_EXTENSION_S, %g3
74a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_DMMU
75a88b5ba8SSam Ravnborg	membar	#Sync
76a88b5ba8SSam Ravnborg
77a88b5ba8SSam Ravnborg	mov	TSB_EXTENSION_N, %g3
78a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_DMMU
79a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_IMMU
80a88b5ba8SSam Ravnborg	membar	#Sync
81a88b5ba8SSam Ravnborg	/* fallthru */
82a88b5ba8SSam Ravnborg
83a88b5ba8SSam Ravnborgniagara_startup:
84a88b5ba8SSam Ravnborg	/* Disable STICK_INT interrupts. */
85a88b5ba8SSam Ravnborg	sethi		%hi(0x80000000), %g5
86a88b5ba8SSam Ravnborg	sllx		%g5, 32, %g5
87a88b5ba8SSam Ravnborg	wr		%g5, %asr25
88a88b5ba8SSam Ravnborg
89a88b5ba8SSam Ravnborg	ba,pt		%xcc, startup_continue
90a88b5ba8SSam Ravnborg	 nop
91a88b5ba8SSam Ravnborg
92a88b5ba8SSam Ravnborgspitfire_startup:
93a88b5ba8SSam Ravnborg	mov		(LSU_CONTROL_IC | LSU_CONTROL_DC | LSU_CONTROL_IM | LSU_CONTROL_DM), %g1
94a88b5ba8SSam Ravnborg	stxa		%g1, [%g0] ASI_LSU_CONTROL
95a88b5ba8SSam Ravnborg	membar		#Sync
96a88b5ba8SSam Ravnborg
97a88b5ba8SSam Ravnborgstartup_continue:
98a88b5ba8SSam Ravnborg	mov		%o0, %l0
99a88b5ba8SSam Ravnborg	BRANCH_IF_SUN4V(g1, niagara_lock_tlb)
100a88b5ba8SSam Ravnborg
101a88b5ba8SSam Ravnborg	sethi		%hi(0x80000000), %g2
102a88b5ba8SSam Ravnborg	sllx		%g2, 32, %g2
103a88b5ba8SSam Ravnborg	wr		%g2, 0, %tick_cmpr
104a88b5ba8SSam Ravnborg
105a88b5ba8SSam Ravnborg	/* Call OBP by hand to lock KERNBASE into i/d tlbs.
106a88b5ba8SSam Ravnborg	 * We lock 'num_kernel_image_mappings' consequetive entries.
107a88b5ba8SSam Ravnborg	 */
108a88b5ba8SSam Ravnborg	sethi		%hi(prom_entry_lock), %g2
109a88b5ba8SSam Ravnborg1:	ldstub		[%g2 + %lo(prom_entry_lock)], %g1
110a88b5ba8SSam Ravnborg	brnz,pn		%g1, 1b
111a88b5ba8SSam Ravnborg	 nop
112a88b5ba8SSam Ravnborg
113ef3e035cSDavid S. Miller	/* Get onto temporary stack which will be in the locked
114ef3e035cSDavid S. Miller	 * kernel image.
115ef3e035cSDavid S. Miller	 */
116ef3e035cSDavid S. Miller	sethi		%hi(tramp_stack), %g1
117ef3e035cSDavid S. Miller	or		%g1, %lo(tramp_stack), %g1
118ef3e035cSDavid S. Miller	add		%g1, TRAMP_STACK_SIZE, %g1
119ef3e035cSDavid S. Miller	sub		%g1, STACKFRAME_SZ + STACK_BIAS + 256, %sp
120a88b5ba8SSam Ravnborg	flushw
121a88b5ba8SSam Ravnborg
122a88b5ba8SSam Ravnborg	/* Setup the loop variables:
123a88b5ba8SSam Ravnborg	 * %l3: VADDR base
124a88b5ba8SSam Ravnborg	 * %l4: TTE base
125a88b5ba8SSam Ravnborg	 * %l5: Loop iterator, iterates from 0 to 'num_kernel_image_mappings'
126a88b5ba8SSam Ravnborg	 * %l6: Number of TTE entries to map
127a88b5ba8SSam Ravnborg	 * %l7: Highest TTE entry number, we count down
128a88b5ba8SSam Ravnborg	 */
129a88b5ba8SSam Ravnborg	sethi		%hi(KERNBASE), %l3
130a88b5ba8SSam Ravnborg	sethi		%hi(kern_locked_tte_data), %l4
131a88b5ba8SSam Ravnborg	ldx		[%l4 + %lo(kern_locked_tte_data)], %l4
132a88b5ba8SSam Ravnborg	clr		%l5
133a88b5ba8SSam Ravnborg	sethi		%hi(num_kernel_image_mappings), %l6
134a88b5ba8SSam Ravnborg	lduw		[%l6 + %lo(num_kernel_image_mappings)], %l6
135a88b5ba8SSam Ravnborg
136a88b5ba8SSam Ravnborg	mov		15, %l7
137a88b5ba8SSam Ravnborg	BRANCH_IF_ANY_CHEETAH(g1,g5,2f)
138a88b5ba8SSam Ravnborg
139a88b5ba8SSam Ravnborg	mov		63, %l7
140a88b5ba8SSam Ravnborg2:
141a88b5ba8SSam Ravnborg
142a88b5ba8SSam Ravnborg3:
143a88b5ba8SSam Ravnborg	/* Lock into I-MMU */
144a88b5ba8SSam Ravnborg	sethi		%hi(call_method), %g2
145a88b5ba8SSam Ravnborg	or		%g2, %lo(call_method), %g2
146a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x00]
147a88b5ba8SSam Ravnborg	mov		5, %g2
148a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x08]
149a88b5ba8SSam Ravnborg	mov		1, %g2
150a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x10]
151a88b5ba8SSam Ravnborg	sethi		%hi(itlb_load), %g2
152a88b5ba8SSam Ravnborg	or		%g2, %lo(itlb_load), %g2
153a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x18]
154a88b5ba8SSam Ravnborg	sethi		%hi(prom_mmu_ihandle_cache), %g2
155a88b5ba8SSam Ravnborg	lduw		[%g2 + %lo(prom_mmu_ihandle_cache)], %g2
156a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x20]
157a88b5ba8SSam Ravnborg
158a88b5ba8SSam Ravnborg	/* Each TTE maps 4MB, convert index to offset.  */
159a88b5ba8SSam Ravnborg	sllx		%l5, 22, %g1
160a88b5ba8SSam Ravnborg
161a88b5ba8SSam Ravnborg	add		%l3, %g1, %g2
162a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x28]	! VADDR
163a88b5ba8SSam Ravnborg	add		%l4, %g1, %g2
164a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x30]	! TTE
165a88b5ba8SSam Ravnborg
166a88b5ba8SSam Ravnborg	/* TTE index is highest minus loop index.  */
167a88b5ba8SSam Ravnborg	sub		%l7, %l5, %g2
168a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x38]
169a88b5ba8SSam Ravnborg
170a88b5ba8SSam Ravnborg	sethi		%hi(p1275buf), %g2
171a88b5ba8SSam Ravnborg	or		%g2, %lo(p1275buf), %g2
172a88b5ba8SSam Ravnborg	ldx		[%g2 + 0x08], %o1
173a88b5ba8SSam Ravnborg	call		%o1
174a88b5ba8SSam Ravnborg	 add		%sp, (2047 + 128), %o0
175a88b5ba8SSam Ravnborg
176a88b5ba8SSam Ravnborg	/* Lock into D-MMU */
177a88b5ba8SSam Ravnborg	sethi		%hi(call_method), %g2
178a88b5ba8SSam Ravnborg	or		%g2, %lo(call_method), %g2
179a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x00]
180a88b5ba8SSam Ravnborg	mov		5, %g2
181a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x08]
182a88b5ba8SSam Ravnborg	mov		1, %g2
183a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x10]
184a88b5ba8SSam Ravnborg	sethi		%hi(dtlb_load), %g2
185a88b5ba8SSam Ravnborg	or		%g2, %lo(dtlb_load), %g2
186a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x18]
187a88b5ba8SSam Ravnborg	sethi		%hi(prom_mmu_ihandle_cache), %g2
188a88b5ba8SSam Ravnborg	lduw		[%g2 + %lo(prom_mmu_ihandle_cache)], %g2
189a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x20]
190a88b5ba8SSam Ravnborg
191a88b5ba8SSam Ravnborg	/* Each TTE maps 4MB, convert index to offset.  */
192a88b5ba8SSam Ravnborg	sllx		%l5, 22, %g1
193a88b5ba8SSam Ravnborg
194a88b5ba8SSam Ravnborg	add		%l3, %g1, %g2
195a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x28]	! VADDR
196a88b5ba8SSam Ravnborg	add		%l4, %g1, %g2
197a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x30]	! TTE
198a88b5ba8SSam Ravnborg
199a88b5ba8SSam Ravnborg	/* TTE index is highest minus loop index.  */
200a88b5ba8SSam Ravnborg	sub		%l7, %l5, %g2
201a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x38]
202a88b5ba8SSam Ravnborg
203a88b5ba8SSam Ravnborg	sethi		%hi(p1275buf), %g2
204a88b5ba8SSam Ravnborg	or		%g2, %lo(p1275buf), %g2
205a88b5ba8SSam Ravnborg	ldx		[%g2 + 0x08], %o1
206a88b5ba8SSam Ravnborg	call		%o1
207a88b5ba8SSam Ravnborg	 add		%sp, (2047 + 128), %o0
208a88b5ba8SSam Ravnborg
209a88b5ba8SSam Ravnborg	add		%l5, 1, %l5
210a88b5ba8SSam Ravnborg	cmp		%l5, %l6
211a88b5ba8SSam Ravnborg	bne,pt		%xcc, 3b
212a88b5ba8SSam Ravnborg	 nop
213a88b5ba8SSam Ravnborg
214a88b5ba8SSam Ravnborg	sethi		%hi(prom_entry_lock), %g2
215a88b5ba8SSam Ravnborg	stb		%g0, [%g2 + %lo(prom_entry_lock)]
216a88b5ba8SSam Ravnborg
217a88b5ba8SSam Ravnborg	ba,pt		%xcc, after_lock_tlb
218a88b5ba8SSam Ravnborg	 nop
219a88b5ba8SSam Ravnborg
220a88b5ba8SSam Ravnborgniagara_lock_tlb:
221a88b5ba8SSam Ravnborg	sethi		%hi(KERNBASE), %l3
222a88b5ba8SSam Ravnborg	sethi		%hi(kern_locked_tte_data), %l4
223a88b5ba8SSam Ravnborg	ldx		[%l4 + %lo(kern_locked_tte_data)], %l4
224a88b5ba8SSam Ravnborg	clr		%l5
225a88b5ba8SSam Ravnborg	sethi		%hi(num_kernel_image_mappings), %l6
226a88b5ba8SSam Ravnborg	lduw		[%l6 + %lo(num_kernel_image_mappings)], %l6
227a88b5ba8SSam Ravnborg
228a88b5ba8SSam Ravnborg1:
229a88b5ba8SSam Ravnborg	mov		HV_FAST_MMU_MAP_PERM_ADDR, %o5
230a88b5ba8SSam Ravnborg	sllx		%l5, 22, %g2
231a88b5ba8SSam Ravnborg	add		%l3, %g2, %o0
232a88b5ba8SSam Ravnborg	clr		%o1
233a88b5ba8SSam Ravnborg	add		%l4, %g2, %o2
234a88b5ba8SSam Ravnborg	mov		HV_MMU_IMMU, %o3
235a88b5ba8SSam Ravnborg	ta		HV_FAST_TRAP
236a88b5ba8SSam Ravnborg
237a88b5ba8SSam Ravnborg	mov		HV_FAST_MMU_MAP_PERM_ADDR, %o5
238a88b5ba8SSam Ravnborg	sllx		%l5, 22, %g2
239a88b5ba8SSam Ravnborg	add		%l3, %g2, %o0
240a88b5ba8SSam Ravnborg	clr		%o1
241a88b5ba8SSam Ravnborg	add		%l4, %g2, %o2
242a88b5ba8SSam Ravnborg	mov		HV_MMU_DMMU, %o3
243a88b5ba8SSam Ravnborg	ta		HV_FAST_TRAP
244a88b5ba8SSam Ravnborg
245a88b5ba8SSam Ravnborg	add		%l5, 1, %l5
246a88b5ba8SSam Ravnborg	cmp		%l5, %l6
247a88b5ba8SSam Ravnborg	bne,pt		%xcc, 1b
248a88b5ba8SSam Ravnborg	 nop
249a88b5ba8SSam Ravnborg
250a88b5ba8SSam Ravnborgafter_lock_tlb:
251a88b5ba8SSam Ravnborg	wrpr		%g0, (PSTATE_PRIV | PSTATE_PEF), %pstate
252a88b5ba8SSam Ravnborg	wr		%g0, 0, %fprs
253a88b5ba8SSam Ravnborg
254a88b5ba8SSam Ravnborg	wr		%g0, ASI_P, %asi
255a88b5ba8SSam Ravnborg
256a88b5ba8SSam Ravnborg	mov		PRIMARY_CONTEXT, %g7
257a88b5ba8SSam Ravnborg
258a88b5ba8SSam Ravnborg661:	stxa		%g0, [%g7] ASI_DMMU
259a88b5ba8SSam Ravnborg	.section	.sun4v_1insn_patch, "ax"
260a88b5ba8SSam Ravnborg	.word		661b
261a88b5ba8SSam Ravnborg	stxa		%g0, [%g7] ASI_MMU
262a88b5ba8SSam Ravnborg	.previous
263a88b5ba8SSam Ravnborg
264a88b5ba8SSam Ravnborg	membar		#Sync
265a88b5ba8SSam Ravnborg	mov		SECONDARY_CONTEXT, %g7
266a88b5ba8SSam Ravnborg
267a88b5ba8SSam Ravnborg661:	stxa		%g0, [%g7] ASI_DMMU
268a88b5ba8SSam Ravnborg	.section	.sun4v_1insn_patch, "ax"
269a88b5ba8SSam Ravnborg	.word		661b
270a88b5ba8SSam Ravnborg	stxa		%g0, [%g7] ASI_MMU
271a88b5ba8SSam Ravnborg	.previous
272a88b5ba8SSam Ravnborg
273a88b5ba8SSam Ravnborg	membar		#Sync
274a88b5ba8SSam Ravnborg
275a88b5ba8SSam Ravnborg	/* Everything we do here, until we properly take over the
276a88b5ba8SSam Ravnborg	 * trap table, must be done with extreme care.  We cannot
277a88b5ba8SSam Ravnborg	 * make any references to %g6 (current thread pointer),
278a88b5ba8SSam Ravnborg	 * %g4 (current task pointer), or %g5 (base of current cpu's
279a88b5ba8SSam Ravnborg	 * per-cpu area) until we properly take over the trap table
280a88b5ba8SSam Ravnborg	 * from the firmware and hypervisor.
281a88b5ba8SSam Ravnborg	 *
282a88b5ba8SSam Ravnborg	 * Get onto temporary stack which is in the locked kernel image.
283a88b5ba8SSam Ravnborg	 */
284a88b5ba8SSam Ravnborg	sethi		%hi(tramp_stack), %g1
285a88b5ba8SSam Ravnborg	or		%g1, %lo(tramp_stack), %g1
286a88b5ba8SSam Ravnborg	add		%g1, TRAMP_STACK_SIZE, %g1
287a88b5ba8SSam Ravnborg	sub		%g1, STACKFRAME_SZ + STACK_BIAS + 256, %sp
288a88b5ba8SSam Ravnborg	mov		0, %fp
289a88b5ba8SSam Ravnborg
290a88b5ba8SSam Ravnborg	/* Put garbage in these registers to trap any access to them.  */
291a88b5ba8SSam Ravnborg	set		0xdeadbeef, %g4
292a88b5ba8SSam Ravnborg	set		0xdeadbeef, %g5
293a88b5ba8SSam Ravnborg	set		0xdeadbeef, %g6
294a88b5ba8SSam Ravnborg
295a88b5ba8SSam Ravnborg	call		init_irqwork_curcpu
296a88b5ba8SSam Ravnborg	 nop
297a88b5ba8SSam Ravnborg
298a88b5ba8SSam Ravnborg	sethi		%hi(tlb_type), %g3
299a88b5ba8SSam Ravnborg	lduw		[%g3 + %lo(tlb_type)], %g2
300a88b5ba8SSam Ravnborg	cmp		%g2, 3
301a88b5ba8SSam Ravnborg	bne,pt		%icc, 1f
302a88b5ba8SSam Ravnborg	 nop
303a88b5ba8SSam Ravnborg
304a88b5ba8SSam Ravnborg	call		hard_smp_processor_id
305a88b5ba8SSam Ravnborg	 nop
306a88b5ba8SSam Ravnborg
307a88b5ba8SSam Ravnborg	call		sun4v_register_mondo_queues
308a88b5ba8SSam Ravnborg	 nop
309a88b5ba8SSam Ravnborg
310a88b5ba8SSam Ravnborg1:	call		init_cur_cpu_trap
311a88b5ba8SSam Ravnborg	 ldx		[%l0], %o0
312a88b5ba8SSam Ravnborg
313a88b5ba8SSam Ravnborg	/* Start using proper page size encodings in ctx register.  */
314a88b5ba8SSam Ravnborg	sethi		%hi(sparc64_kern_pri_context), %g3
315a88b5ba8SSam Ravnborg	ldx		[%g3 + %lo(sparc64_kern_pri_context)], %g2
316a88b5ba8SSam Ravnborg	mov		PRIMARY_CONTEXT, %g1
317a88b5ba8SSam Ravnborg
318a88b5ba8SSam Ravnborg661:	stxa		%g2, [%g1] ASI_DMMU
319a88b5ba8SSam Ravnborg	.section	.sun4v_1insn_patch, "ax"
320a88b5ba8SSam Ravnborg	.word		661b
321a88b5ba8SSam Ravnborg	stxa		%g2, [%g1] ASI_MMU
322a88b5ba8SSam Ravnborg	.previous
323a88b5ba8SSam Ravnborg
324a88b5ba8SSam Ravnborg	membar		#Sync
325a88b5ba8SSam Ravnborg
326a88b5ba8SSam Ravnborg	wrpr		%g0, 0, %wstate
327a88b5ba8SSam Ravnborg
328a88b5ba8SSam Ravnborg	sethi		%hi(prom_entry_lock), %g2
329a88b5ba8SSam Ravnborg1:	ldstub		[%g2 + %lo(prom_entry_lock)], %g1
330a88b5ba8SSam Ravnborg	brnz,pn		%g1, 1b
331a88b5ba8SSam Ravnborg	 nop
332a88b5ba8SSam Ravnborg
333a88b5ba8SSam Ravnborg	/* As a hack, put &init_thread_union into %g6.
334a88b5ba8SSam Ravnborg	 * prom_world() loads from here to restore the %asi
335a88b5ba8SSam Ravnborg	 * register.
336a88b5ba8SSam Ravnborg	 */
337a88b5ba8SSam Ravnborg	sethi		%hi(init_thread_union), %g6
338a88b5ba8SSam Ravnborg	or		%g6, %lo(init_thread_union), %g6
339a88b5ba8SSam Ravnborg
340a88b5ba8SSam Ravnborg	sethi		%hi(is_sun4v), %o0
341a88b5ba8SSam Ravnborg	lduw		[%o0 + %lo(is_sun4v)], %o0
342a88b5ba8SSam Ravnborg	brz,pt		%o0, 2f
343a88b5ba8SSam Ravnborg	 nop
344a88b5ba8SSam Ravnborg
345a88b5ba8SSam Ravnborg	TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
346a88b5ba8SSam Ravnborg	add		%g2, TRAP_PER_CPU_FAULT_INFO, %g2
347a88b5ba8SSam Ravnborg	stxa		%g2, [%g0] ASI_SCRATCHPAD
348a88b5ba8SSam Ravnborg
349a88b5ba8SSam Ravnborg	/* Compute physical address:
350a88b5ba8SSam Ravnborg	 *
351a88b5ba8SSam Ravnborg	 * paddr = kern_base + (mmfsa_vaddr - KERNBASE)
352a88b5ba8SSam Ravnborg	 */
353a88b5ba8SSam Ravnborg	sethi		%hi(KERNBASE), %g3
354a88b5ba8SSam Ravnborg	sub		%g2, %g3, %g2
355a88b5ba8SSam Ravnborg	sethi		%hi(kern_base), %g3
356a88b5ba8SSam Ravnborg	ldx		[%g3 + %lo(kern_base)], %g3
357a88b5ba8SSam Ravnborg	add		%g2, %g3, %o1
358a88b5ba8SSam Ravnborg	sethi		%hi(sparc64_ttable_tl0), %o0
359a88b5ba8SSam Ravnborg
360a88b5ba8SSam Ravnborg	set		prom_set_trap_table_name, %g2
361a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x00]
362a88b5ba8SSam Ravnborg	mov		2, %g2
363a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x08]
364a88b5ba8SSam Ravnborg	mov		0, %g2
365a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x10]
366a88b5ba8SSam Ravnborg	stx		%o0, [%sp + 2047 + 128 + 0x18]
367a88b5ba8SSam Ravnborg	stx		%o1, [%sp + 2047 + 128 + 0x20]
368a88b5ba8SSam Ravnborg	sethi		%hi(p1275buf), %g2
369a88b5ba8SSam Ravnborg	or		%g2, %lo(p1275buf), %g2
370a88b5ba8SSam Ravnborg	ldx		[%g2 + 0x08], %o1
371a88b5ba8SSam Ravnborg	call		%o1
372a88b5ba8SSam Ravnborg	 add		%sp, (2047 + 128), %o0
373a88b5ba8SSam Ravnborg
374a88b5ba8SSam Ravnborg	ba,pt		%xcc, 3f
375a88b5ba8SSam Ravnborg	 nop
376a88b5ba8SSam Ravnborg
377a88b5ba8SSam Ravnborg2:	sethi		%hi(sparc64_ttable_tl0), %o0
378a88b5ba8SSam Ravnborg	set		prom_set_trap_table_name, %g2
379a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x00]
380a88b5ba8SSam Ravnborg	mov		1, %g2
381a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x08]
382a88b5ba8SSam Ravnborg	mov		0, %g2
383a88b5ba8SSam Ravnborg	stx		%g2, [%sp + 2047 + 128 + 0x10]
384a88b5ba8SSam Ravnborg	stx		%o0, [%sp + 2047 + 128 + 0x18]
385a88b5ba8SSam Ravnborg	sethi		%hi(p1275buf), %g2
386a88b5ba8SSam Ravnborg	or		%g2, %lo(p1275buf), %g2
387a88b5ba8SSam Ravnborg	ldx		[%g2 + 0x08], %o1
388a88b5ba8SSam Ravnborg	call		%o1
389a88b5ba8SSam Ravnborg	 add		%sp, (2047 + 128), %o0
390a88b5ba8SSam Ravnborg
391a88b5ba8SSam Ravnborg3:	sethi		%hi(prom_entry_lock), %g2
392a88b5ba8SSam Ravnborg	stb		%g0, [%g2 + %lo(prom_entry_lock)]
393a88b5ba8SSam Ravnborg
394a88b5ba8SSam Ravnborg	ldx		[%l0], %g6
395a88b5ba8SSam Ravnborg	ldx		[%g6 + TI_TASK], %g4
396a88b5ba8SSam Ravnborg
397a88b5ba8SSam Ravnborg	mov		1, %g5
398a88b5ba8SSam Ravnborg	sllx		%g5, THREAD_SHIFT, %g5
399a88b5ba8SSam Ravnborg	sub		%g5, (STACKFRAME_SZ + STACK_BIAS), %g5
400a88b5ba8SSam Ravnborg	add		%g6, %g5, %sp
401a88b5ba8SSam Ravnborg
402a88b5ba8SSam Ravnborg	rdpr		%pstate, %o1
403a88b5ba8SSam Ravnborg	or		%o1, PSTATE_IE, %o1
404a88b5ba8SSam Ravnborg	wrpr		%o1, 0, %pstate
405a88b5ba8SSam Ravnborg
406a88b5ba8SSam Ravnborg	call		smp_callin
407a88b5ba8SSam Ravnborg	 nop
40887fa05aeSSam Ravnborg
409a88b5ba8SSam Ravnborg	call		cpu_panic
410a88b5ba8SSam Ravnborg	 nop
411a88b5ba8SSam Ravnborg1:	b,a,pt		%xcc, 1b
412a88b5ba8SSam Ravnborg
413a88b5ba8SSam Ravnborg	.align		8
414a88b5ba8SSam Ravnborgsparc64_cpu_startup_end:
415