xref: /openbmc/linux/arch/sparc/kernel/head_64.S (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
2a88b5ba8SSam Ravnborg/* head.S: Initial boot code for the Sparc64 port of Linux.
3a88b5ba8SSam Ravnborg *
4a88b5ba8SSam Ravnborg * Copyright (C) 1996, 1997, 2007 David S. Miller (davem@davemloft.net)
5a88b5ba8SSam Ravnborg * Copyright (C) 1996 David Sitsky (David.Sitsky@anu.edu.au)
6a88b5ba8SSam Ravnborg * Copyright (C) 1997, 1998 Jakub Jelinek (jj@sunsite.mff.cuni.cz)
7a88b5ba8SSam Ravnborg * Copyright (C) 1997 Miguel de Icaza (miguel@nuclecu.unam.mx)
8a88b5ba8SSam Ravnborg */
9a88b5ba8SSam Ravnborg
10a88b5ba8SSam Ravnborg#include <linux/version.h>
11a88b5ba8SSam Ravnborg#include <linux/errno.h>
12*4cdb71b6SMasahiro Yamada#include <linux/export.h>
13a88b5ba8SSam Ravnborg#include <linux/threads.h>
14a88b5ba8SSam Ravnborg#include <linux/init.h>
15a88b5ba8SSam Ravnborg#include <linux/linkage.h>
1665fddcfcSMike Rapoport#include <linux/pgtable.h>
17a88b5ba8SSam Ravnborg#include <asm/thread_info.h>
18a88b5ba8SSam Ravnborg#include <asm/asi.h>
19a88b5ba8SSam Ravnborg#include <asm/pstate.h>
20a88b5ba8SSam Ravnborg#include <asm/ptrace.h>
21a88b5ba8SSam Ravnborg#include <asm/spitfire.h>
22a88b5ba8SSam Ravnborg#include <asm/page.h>
23a88b5ba8SSam Ravnborg#include <asm/errno.h>
24a88b5ba8SSam Ravnborg#include <asm/signal.h>
25a88b5ba8SSam Ravnborg#include <asm/processor.h>
26a88b5ba8SSam Ravnborg#include <asm/lsu.h>
27a88b5ba8SSam Ravnborg#include <asm/dcr.h>
28a88b5ba8SSam Ravnborg#include <asm/dcu.h>
29a88b5ba8SSam Ravnborg#include <asm/head.h>
30a88b5ba8SSam Ravnborg#include <asm/ttable.h>
31a88b5ba8SSam Ravnborg#include <asm/mmu.h>
32a88b5ba8SSam Ravnborg#include <asm/cpudata.h>
33a88b5ba8SSam Ravnborg#include <asm/pil.h>
34a88b5ba8SSam Ravnborg#include <asm/estate.h>
35a88b5ba8SSam Ravnborg#include <asm/sfafsr.h>
36a88b5ba8SSam Ravnborg#include <asm/unistd.h>
37a88b5ba8SSam Ravnborg
38a88b5ba8SSam Ravnborg/* This section from from _start to sparc64_boot_end should fit into
39a88b5ba8SSam Ravnborg * 0x0000000000404000 to 0x0000000000408000.
40a88b5ba8SSam Ravnborg */
41a88b5ba8SSam Ravnborg	.text
42a88b5ba8SSam Ravnborg	.globl	start, _start, stext, _stext
43a88b5ba8SSam Ravnborg_start:
44a88b5ba8SSam Ravnborgstart:
45a88b5ba8SSam Ravnborg_stext:
46a88b5ba8SSam Ravnborgstext:
47a88b5ba8SSam Ravnborg! 0x0000000000404000
48a88b5ba8SSam Ravnborg	b	sparc64_boot
49a88b5ba8SSam Ravnborg	 flushw					/* Flush register file.      */
50a88b5ba8SSam Ravnborg
51a88b5ba8SSam Ravnborg/* This stuff has to be in sync with SILO and other potential boot loaders
52a88b5ba8SSam Ravnborg * Fields should be kept upward compatible and whenever any change is made,
53a88b5ba8SSam Ravnborg * HdrS version should be incremented.
54a88b5ba8SSam Ravnborg */
55a88b5ba8SSam Ravnborg        .global root_flags, ram_flags, root_dev
56a88b5ba8SSam Ravnborg        .global sparc_ramdisk_image, sparc_ramdisk_size
57a88b5ba8SSam Ravnborg	.global sparc_ramdisk_image64
58a88b5ba8SSam Ravnborg
59a88b5ba8SSam Ravnborg        .ascii  "HdrS"
60a88b5ba8SSam Ravnborg        .word   LINUX_VERSION_CODE
61a88b5ba8SSam Ravnborg
62a88b5ba8SSam Ravnborg	/* History:
63a88b5ba8SSam Ravnborg	 *
64a88b5ba8SSam Ravnborg	 * 0x0300 : Supports being located at other than 0x4000
65a88b5ba8SSam Ravnborg	 * 0x0202 : Supports kernel params string
66a88b5ba8SSam Ravnborg	 * 0x0201 : Supports reboot_command
67a88b5ba8SSam Ravnborg	 */
68a88b5ba8SSam Ravnborg	.half   0x0301          /* HdrS version */
69a88b5ba8SSam Ravnborg
70a88b5ba8SSam Ravnborgroot_flags:
71a88b5ba8SSam Ravnborg        .half   1
72a88b5ba8SSam Ravnborgroot_dev:
73a88b5ba8SSam Ravnborg        .half   0
74a88b5ba8SSam Ravnborgram_flags:
75a88b5ba8SSam Ravnborg        .half   0
76a88b5ba8SSam Ravnborgsparc_ramdisk_image:
77a88b5ba8SSam Ravnborg        .word   0
78a88b5ba8SSam Ravnborgsparc_ramdisk_size:
79a88b5ba8SSam Ravnborg        .word   0
80a88b5ba8SSam Ravnborg        .xword  reboot_command
81a88b5ba8SSam Ravnborg	.xword	bootstr_info
82a88b5ba8SSam Ravnborgsparc_ramdisk_image64:
83a88b5ba8SSam Ravnborg	.xword	0
84a88b5ba8SSam Ravnborg	.word	_end
85a88b5ba8SSam Ravnborg
86a88b5ba8SSam Ravnborg	/* PROM cif handler code address is in %o4.  */
87a88b5ba8SSam Ravnborgsparc64_boot:
88a88b5ba8SSam Ravnborg	mov	%o4, %l7
89a88b5ba8SSam Ravnborg
9025985edcSLucas De Marchi	/* We need to remap the kernel.  Use position independent
91a88b5ba8SSam Ravnborg	 * code to remap us to KERNBASE.
92a88b5ba8SSam Ravnborg	 *
93a88b5ba8SSam Ravnborg	 * SILO can invoke us with 32-bit address masking enabled,
94a88b5ba8SSam Ravnborg	 * so make sure that's clear.
95a88b5ba8SSam Ravnborg	 */
96a88b5ba8SSam Ravnborg	rdpr	%pstate, %g1
97a88b5ba8SSam Ravnborg	andn	%g1, PSTATE_AM, %g1
98a88b5ba8SSam Ravnborg	wrpr	%g1, 0x0, %pstate
99a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, 1f
1000ae2d26fSBabu Moger	 nop
101a88b5ba8SSam Ravnborg
102a88b5ba8SSam Ravnborg	.globl	prom_finddev_name, prom_chosen_path, prom_root_node
103a88b5ba8SSam Ravnborg	.globl	prom_getprop_name, prom_mmu_name, prom_peer_name
104a88b5ba8SSam Ravnborg	.globl	prom_callmethod_name, prom_translate_name, prom_root_compatible
105a88b5ba8SSam Ravnborg	.globl	prom_map_name, prom_unmap_name, prom_mmu_ihandle_cache
106a88b5ba8SSam Ravnborg	.globl	prom_boot_mapped_pc, prom_boot_mapping_mode
107a88b5ba8SSam Ravnborg	.globl	prom_boot_mapping_phys_high, prom_boot_mapping_phys_low
108a88b5ba8SSam Ravnborg	.globl	prom_compatible_name, prom_cpu_path, prom_cpu_compatible
109a88b5ba8SSam Ravnborg	.globl	is_sun4v, sun4v_chip_type, prom_set_trap_table_name
110a88b5ba8SSam Ravnborgprom_peer_name:
111a88b5ba8SSam Ravnborg	.asciz	"peer"
112a88b5ba8SSam Ravnborgprom_compatible_name:
113a88b5ba8SSam Ravnborg	.asciz	"compatible"
114a88b5ba8SSam Ravnborgprom_finddev_name:
115a88b5ba8SSam Ravnborg	.asciz	"finddevice"
116a88b5ba8SSam Ravnborgprom_chosen_path:
117a88b5ba8SSam Ravnborg	.asciz	"/chosen"
118a88b5ba8SSam Ravnborgprom_cpu_path:
119a88b5ba8SSam Ravnborg	.asciz	"/cpu"
120a88b5ba8SSam Ravnborgprom_getprop_name:
121a88b5ba8SSam Ravnborg	.asciz	"getprop"
122a88b5ba8SSam Ravnborgprom_mmu_name:
123a88b5ba8SSam Ravnborg	.asciz	"mmu"
124a88b5ba8SSam Ravnborgprom_callmethod_name:
125a88b5ba8SSam Ravnborg	.asciz	"call-method"
126a88b5ba8SSam Ravnborgprom_translate_name:
127a88b5ba8SSam Ravnborg	.asciz	"translate"
128a88b5ba8SSam Ravnborgprom_map_name:
129a88b5ba8SSam Ravnborg	.asciz	"map"
130a88b5ba8SSam Ravnborgprom_unmap_name:
131a88b5ba8SSam Ravnborg	.asciz	"unmap"
132a88b5ba8SSam Ravnborgprom_set_trap_table_name:
133a88b5ba8SSam Ravnborg	.asciz	"SUNW,set-trap-table"
134a88b5ba8SSam Ravnborgprom_sun4v_name:
135a88b5ba8SSam Ravnborg	.asciz	"sun4v"
136a88b5ba8SSam Ravnborgprom_niagara_prefix:
137a88b5ba8SSam Ravnborg	.asciz	"SUNW,UltraSPARC-T"
1384ba991d3SDavid S. Millerprom_sparc_prefix:
13908cefa9fSDavid S. Miller	.asciz	"SPARC-"
14076950e6eSAllen Paisprom_sparc64x_prefix:
14176950e6eSAllen Pais	.asciz	"SPARC64-X"
142a88b5ba8SSam Ravnborg	.align	4
143a88b5ba8SSam Ravnborgprom_root_compatible:
144a88b5ba8SSam Ravnborg	.skip	64
145a88b5ba8SSam Ravnborgprom_cpu_compatible:
146a88b5ba8SSam Ravnborg	.skip	64
147a88b5ba8SSam Ravnborgprom_root_node:
148a88b5ba8SSam Ravnborg	.word	0
149d3867f04SAl ViroEXPORT_SYMBOL(prom_root_node)
150a88b5ba8SSam Ravnborgprom_mmu_ihandle_cache:
151a88b5ba8SSam Ravnborg	.word	0
152a88b5ba8SSam Ravnborgprom_boot_mapped_pc:
153a88b5ba8SSam Ravnborg	.word	0
154a88b5ba8SSam Ravnborgprom_boot_mapping_mode:
155a88b5ba8SSam Ravnborg	.word	0
156a88b5ba8SSam Ravnborg	.align	8
157a88b5ba8SSam Ravnborgprom_boot_mapping_phys_high:
158a88b5ba8SSam Ravnborg	.xword	0
159a88b5ba8SSam Ravnborgprom_boot_mapping_phys_low:
160a88b5ba8SSam Ravnborg	.xword	0
161a88b5ba8SSam Ravnborgis_sun4v:
162a88b5ba8SSam Ravnborg	.word	0
163a88b5ba8SSam Ravnborgsun4v_chip_type:
164a88b5ba8SSam Ravnborg	.word	SUN4V_CHIP_INVALID
165d3867f04SAl ViroEXPORT_SYMBOL(sun4v_chip_type)
166a88b5ba8SSam Ravnborg1:
167a88b5ba8SSam Ravnborg	rd	%pc, %l0
168a88b5ba8SSam Ravnborg
169a88b5ba8SSam Ravnborg	mov	(1b - prom_peer_name), %l1
170a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
171a88b5ba8SSam Ravnborg	mov	0, %l2
172a88b5ba8SSam Ravnborg
173a88b5ba8SSam Ravnborg	/* prom_root_node = prom_peer(0) */
174a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "peer"
175a88b5ba8SSam Ravnborg	mov	1, %l3
176a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 1
177a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
178a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x18]	! arg1, 0
179a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x20]	! ret1
180a88b5ba8SSam Ravnborg	call	%l7
181a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
182a88b5ba8SSam Ravnborg
183a88b5ba8SSam Ravnborg	ldx	[%sp + 2047 + 128 + 0x20], %l4	! prom root node
184a88b5ba8SSam Ravnborg	mov	(1b - prom_root_node), %l1
185a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
186a88b5ba8SSam Ravnborg	stw	%l4, [%l1]
187a88b5ba8SSam Ravnborg
188a88b5ba8SSam Ravnborg	mov	(1b - prom_getprop_name), %l1
189a88b5ba8SSam Ravnborg	mov	(1b - prom_compatible_name), %l2
190a88b5ba8SSam Ravnborg	mov	(1b - prom_root_compatible), %l5
191a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
192a88b5ba8SSam Ravnborg	sub	%l0, %l2, %l2
193a88b5ba8SSam Ravnborg	sub	%l0, %l5, %l5
194a88b5ba8SSam Ravnborg
195a88b5ba8SSam Ravnborg	/* prom_getproperty(prom_root_node, "compatible",
196a88b5ba8SSam Ravnborg	 *                  &prom_root_compatible, 64)
197a88b5ba8SSam Ravnborg	 */
198a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "getprop"
199a88b5ba8SSam Ravnborg	mov	4, %l3
200a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 4
201a88b5ba8SSam Ravnborg	mov	1, %l3
202a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
203a88b5ba8SSam Ravnborg	stx	%l4, [%sp + 2047 + 128 + 0x18]	! arg1, prom_root_node
204a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x20]	! arg2, "compatible"
205a88b5ba8SSam Ravnborg	stx	%l5, [%sp + 2047 + 128 + 0x28]	! arg3, &prom_root_compatible
206a88b5ba8SSam Ravnborg	mov	64, %l3
207a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x30]	! arg4, size
208a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x38]	! ret1
209a88b5ba8SSam Ravnborg	call	%l7
210a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
211a88b5ba8SSam Ravnborg
212a88b5ba8SSam Ravnborg	mov	(1b - prom_finddev_name), %l1
213a88b5ba8SSam Ravnborg	mov	(1b - prom_chosen_path), %l2
214a88b5ba8SSam Ravnborg	mov	(1b - prom_boot_mapped_pc), %l3
215a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
216a88b5ba8SSam Ravnborg	sub	%l0, %l2, %l2
217a88b5ba8SSam Ravnborg	sub	%l0, %l3, %l3
218a88b5ba8SSam Ravnborg	stw	%l0, [%l3]
219a88b5ba8SSam Ravnborg	sub	%sp, (192 + 128), %sp
220a88b5ba8SSam Ravnborg
221a88b5ba8SSam Ravnborg	/* chosen_node = prom_finddevice("/chosen") */
222a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "finddevice"
223a88b5ba8SSam Ravnborg	mov	1, %l3
224a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 1
225a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
226a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x18]	! arg1, "/chosen"
227a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x20]	! ret1
228a88b5ba8SSam Ravnborg	call	%l7
229a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
230a88b5ba8SSam Ravnborg
231a88b5ba8SSam Ravnborg	ldx	[%sp + 2047 + 128 + 0x20], %l4	! chosen device node
232a88b5ba8SSam Ravnborg
233a88b5ba8SSam Ravnborg	mov	(1b - prom_getprop_name), %l1
234a88b5ba8SSam Ravnborg	mov	(1b - prom_mmu_name), %l2
235a88b5ba8SSam Ravnborg	mov	(1b - prom_mmu_ihandle_cache), %l5
236a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
237a88b5ba8SSam Ravnborg	sub	%l0, %l2, %l2
238a88b5ba8SSam Ravnborg	sub	%l0, %l5, %l5
239a88b5ba8SSam Ravnborg
240a88b5ba8SSam Ravnborg	/* prom_mmu_ihandle_cache = prom_getint(chosen_node, "mmu") */
241a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "getprop"
242a88b5ba8SSam Ravnborg	mov	4, %l3
243a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 4
244a88b5ba8SSam Ravnborg	mov	1, %l3
245a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
246a88b5ba8SSam Ravnborg	stx	%l4, [%sp + 2047 + 128 + 0x18]	! arg1, chosen_node
247a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x20]	! arg2, "mmu"
248a88b5ba8SSam Ravnborg	stx	%l5, [%sp + 2047 + 128 + 0x28]	! arg3, &prom_mmu_ihandle_cache
249a88b5ba8SSam Ravnborg	mov	4, %l3
250a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x30]	! arg4, sizeof(arg3)
251a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x38]	! ret1
252a88b5ba8SSam Ravnborg	call	%l7
253a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
254a88b5ba8SSam Ravnborg
255a88b5ba8SSam Ravnborg	mov	(1b - prom_callmethod_name), %l1
256a88b5ba8SSam Ravnborg	mov	(1b - prom_translate_name), %l2
257a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
258a88b5ba8SSam Ravnborg	sub	%l0, %l2, %l2
259a88b5ba8SSam Ravnborg	lduw	[%l5], %l5			! prom_mmu_ihandle_cache
260a88b5ba8SSam Ravnborg
261a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "call-method"
262a88b5ba8SSam Ravnborg	mov	3, %l3
263a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 3
264a88b5ba8SSam Ravnborg	mov	5, %l3
265a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 5
266a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x18]	! arg1: "translate"
267a88b5ba8SSam Ravnborg	stx	%l5, [%sp + 2047 + 128 + 0x20]	! arg2: prom_mmu_ihandle_cache
268a88b5ba8SSam Ravnborg	/* PAGE align */
269a88b5ba8SSam Ravnborg	srlx	%l0, 13, %l3
270a88b5ba8SSam Ravnborg	sllx	%l3, 13, %l3
271a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x28]	! arg3: vaddr, our PC
272a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x30]	! res1
273a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x38]	! res2
274a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x40]	! res3
275a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x48]	! res4
276a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x50]	! res5
277a88b5ba8SSam Ravnborg	call	%l7
278a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
279a88b5ba8SSam Ravnborg
280a88b5ba8SSam Ravnborg	ldx	[%sp + 2047 + 128 + 0x40], %l1	! translation mode
281a88b5ba8SSam Ravnborg	mov	(1b - prom_boot_mapping_mode), %l4
282a88b5ba8SSam Ravnborg	sub	%l0, %l4, %l4
283a88b5ba8SSam Ravnborg	stw	%l1, [%l4]
284a88b5ba8SSam Ravnborg	mov	(1b - prom_boot_mapping_phys_high), %l4
285a88b5ba8SSam Ravnborg	sub	%l0, %l4, %l4
286a88b5ba8SSam Ravnborg	ldx	[%sp + 2047 + 128 + 0x48], %l2	! physaddr high
287a88b5ba8SSam Ravnborg	stx	%l2, [%l4 + 0x0]
288a88b5ba8SSam Ravnborg	ldx	[%sp + 2047 + 128 + 0x50], %l3	! physaddr low
289a88b5ba8SSam Ravnborg	/* 4MB align */
2900eef331aSDavid S. Miller	srlx	%l3, ILOG2_4MB, %l3
2910eef331aSDavid S. Miller	sllx	%l3, ILOG2_4MB, %l3
292a88b5ba8SSam Ravnborg	stx	%l3, [%l4 + 0x8]
293a88b5ba8SSam Ravnborg
294a88b5ba8SSam Ravnborg	/* Leave service as-is, "call-method" */
295a88b5ba8SSam Ravnborg	mov	7, %l3
296a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 7
297a88b5ba8SSam Ravnborg	mov	1, %l3
298a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
299a88b5ba8SSam Ravnborg	mov	(1b - prom_map_name), %l3
300a88b5ba8SSam Ravnborg	sub	%l0, %l3, %l3
301a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x18]	! arg1: "map"
302a88b5ba8SSam Ravnborg	/* Leave arg2 as-is, prom_mmu_ihandle_cache */
303a88b5ba8SSam Ravnborg	mov	-1, %l3
304a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x28]	! arg3: mode (-1 default)
305a88b5ba8SSam Ravnborg	/* 4MB align the kernel image size. */
306a88b5ba8SSam Ravnborg	set	(_end - KERNBASE), %l3
307a88b5ba8SSam Ravnborg	set	((4 * 1024 * 1024) - 1), %l4
308a88b5ba8SSam Ravnborg	add	%l3, %l4, %l3
309a88b5ba8SSam Ravnborg	andn	%l3, %l4, %l3
310a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x30]	! arg4: roundup(ksize, 4MB)
311a88b5ba8SSam Ravnborg	sethi	%hi(KERNBASE), %l3
312a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x38]	! arg5: vaddr (KERNBASE)
313a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x40]	! arg6: empty
314a88b5ba8SSam Ravnborg	mov	(1b - prom_boot_mapping_phys_low), %l3
315a88b5ba8SSam Ravnborg	sub	%l0, %l3, %l3
316a88b5ba8SSam Ravnborg	ldx	[%l3], %l3
317a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x48]	! arg7: phys addr
318a88b5ba8SSam Ravnborg	call	%l7
319a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
320a88b5ba8SSam Ravnborg
321a88b5ba8SSam Ravnborg	add	%sp, (192 + 128), %sp
322a88b5ba8SSam Ravnborg
323a88b5ba8SSam Ravnborg	sethi	%hi(prom_root_compatible), %g1
324a88b5ba8SSam Ravnborg	or	%g1, %lo(prom_root_compatible), %g1
325a88b5ba8SSam Ravnborg	sethi	%hi(prom_sun4v_name), %g7
326a88b5ba8SSam Ravnborg	or	%g7, %lo(prom_sun4v_name), %g7
327a88b5ba8SSam Ravnborg	mov	5, %g3
328a88b5ba8SSam Ravnborg90:	ldub	[%g7], %g2
329a88b5ba8SSam Ravnborg	ldub	[%g1], %g4
330a88b5ba8SSam Ravnborg	cmp	%g2, %g4
331a88b5ba8SSam Ravnborg	bne,pn	%icc, 80f
332a88b5ba8SSam Ravnborg	 add	%g7, 1, %g7
333a88b5ba8SSam Ravnborg	subcc	%g3, 1, %g3
334a88b5ba8SSam Ravnborg	bne,pt	%xcc, 90b
335a88b5ba8SSam Ravnborg	 add	%g1, 1, %g1
336a88b5ba8SSam Ravnborg
337a88b5ba8SSam Ravnborg	sethi	%hi(is_sun4v), %g1
338a88b5ba8SSam Ravnborg	or	%g1, %lo(is_sun4v), %g1
339a88b5ba8SSam Ravnborg	mov	1, %g7
340a88b5ba8SSam Ravnborg	stw	%g7, [%g1]
341a88b5ba8SSam Ravnborg
342a88b5ba8SSam Ravnborg	/* cpu_node = prom_finddevice("/cpu") */
343a88b5ba8SSam Ravnborg	mov	(1b - prom_finddev_name), %l1
344a88b5ba8SSam Ravnborg	mov	(1b - prom_cpu_path), %l2
345a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
346a88b5ba8SSam Ravnborg	sub	%l0, %l2, %l2
347a88b5ba8SSam Ravnborg	sub	%sp, (192 + 128), %sp
348a88b5ba8SSam Ravnborg
349a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "finddevice"
350a88b5ba8SSam Ravnborg	mov	1, %l3
351a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 1
352a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
353a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x18]	! arg1, "/cpu"
354a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x20]	! ret1
355a88b5ba8SSam Ravnborg	call	%l7
356a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
357a88b5ba8SSam Ravnborg
358a88b5ba8SSam Ravnborg	ldx	[%sp + 2047 + 128 + 0x20], %l4	! cpu device node
359a88b5ba8SSam Ravnborg
360a88b5ba8SSam Ravnborg	mov	(1b - prom_getprop_name), %l1
361a88b5ba8SSam Ravnborg	mov	(1b - prom_compatible_name), %l2
362a88b5ba8SSam Ravnborg	mov	(1b - prom_cpu_compatible), %l5
363a88b5ba8SSam Ravnborg	sub	%l0, %l1, %l1
364a88b5ba8SSam Ravnborg	sub	%l0, %l2, %l2
365a88b5ba8SSam Ravnborg	sub	%l0, %l5, %l5
366a88b5ba8SSam Ravnborg
367a88b5ba8SSam Ravnborg	/* prom_getproperty(cpu_node, "compatible",
368a88b5ba8SSam Ravnborg	 *                  &prom_cpu_compatible, 64)
369a88b5ba8SSam Ravnborg	 */
370a88b5ba8SSam Ravnborg	stx	%l1, [%sp + 2047 + 128 + 0x00]	! service, "getprop"
371a88b5ba8SSam Ravnborg	mov	4, %l3
372a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x08]	! num_args, 4
373a88b5ba8SSam Ravnborg	mov	1, %l3
374a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x10]	! num_rets, 1
375a88b5ba8SSam Ravnborg	stx	%l4, [%sp + 2047 + 128 + 0x18]	! arg1, cpu_node
376a88b5ba8SSam Ravnborg	stx	%l2, [%sp + 2047 + 128 + 0x20]	! arg2, "compatible"
377a88b5ba8SSam Ravnborg	stx	%l5, [%sp + 2047 + 128 + 0x28]	! arg3, &prom_cpu_compatible
378a88b5ba8SSam Ravnborg	mov	64, %l3
379a88b5ba8SSam Ravnborg	stx	%l3, [%sp + 2047 + 128 + 0x30]	! arg4, size
380a88b5ba8SSam Ravnborg	stx	%g0, [%sp + 2047 + 128 + 0x38]	! ret1
381a88b5ba8SSam Ravnborg	call	%l7
382a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0		! argument array
383a88b5ba8SSam Ravnborg
384a88b5ba8SSam Ravnborg	add	%sp, (192 + 128), %sp
385a88b5ba8SSam Ravnborg
386a88b5ba8SSam Ravnborg	sethi	%hi(prom_cpu_compatible), %g1
387a88b5ba8SSam Ravnborg	or	%g1, %lo(prom_cpu_compatible), %g1
388a88b5ba8SSam Ravnborg	sethi	%hi(prom_niagara_prefix), %g7
389a88b5ba8SSam Ravnborg	or	%g7, %lo(prom_niagara_prefix), %g7
390a88b5ba8SSam Ravnborg	mov	17, %g3
391a88b5ba8SSam Ravnborg90:	ldub	[%g7], %g2
392a88b5ba8SSam Ravnborg	ldub	[%g1], %g4
393a88b5ba8SSam Ravnborg	cmp	%g2, %g4
3944ba991d3SDavid S. Miller	bne,pn	%icc, 89f
3954ba991d3SDavid S. Miller	 add	%g7, 1, %g7
3964ba991d3SDavid S. Miller	subcc	%g3, 1, %g3
3974ba991d3SDavid S. Miller	bne,pt	%xcc, 90b
3984ba991d3SDavid S. Miller	 add	%g1, 1, %g1
3994ba991d3SDavid S. Miller	ba,pt	%xcc, 91f
4004ba991d3SDavid S. Miller	 nop
4014ba991d3SDavid S. Miller
4024ba991d3SDavid S. Miller89:	sethi	%hi(prom_cpu_compatible), %g1
4034ba991d3SDavid S. Miller	or	%g1, %lo(prom_cpu_compatible), %g1
4044ba991d3SDavid S. Miller	sethi	%hi(prom_sparc_prefix), %g7
4054ba991d3SDavid S. Miller	or	%g7, %lo(prom_sparc_prefix), %g7
40608cefa9fSDavid S. Miller	mov	6, %g3
4074ba991d3SDavid S. Miller90:	ldub	[%g7], %g2
4084ba991d3SDavid S. Miller	ldub	[%g1], %g4
4094ba991d3SDavid S. Miller	cmp	%g2, %g4
410a88b5ba8SSam Ravnborg	bne,pn	%icc, 4f
411a88b5ba8SSam Ravnborg	 add	%g7, 1, %g7
412a88b5ba8SSam Ravnborg	subcc	%g3, 1, %g3
413a88b5ba8SSam Ravnborg	bne,pt	%xcc, 90b
414a88b5ba8SSam Ravnborg	 add	%g1, 1, %g1
415a88b5ba8SSam Ravnborg
416a88b5ba8SSam Ravnborg	sethi	%hi(prom_cpu_compatible), %g1
417a88b5ba8SSam Ravnborg	or	%g1, %lo(prom_cpu_compatible), %g1
41808cefa9fSDavid S. Miller	ldub	[%g1 + 6], %g2
41908cefa9fSDavid S. Miller	cmp	%g2, 'T'
42008cefa9fSDavid S. Miller	be,pt	%xcc, 70f
42108cefa9fSDavid S. Miller	 cmp	%g2, 'M'
422c5b8b5beSKhalid Aziz	be,pt	%xcc, 70f
423c5b8b5beSKhalid Aziz	 cmp	%g2, 'S'
42476950e6eSAllen Pais	bne,pn	%xcc, 49f
42508cefa9fSDavid S. Miller	 nop
42608cefa9fSDavid S. Miller
42708cefa9fSDavid S. Miller70:	ldub	[%g1 + 7], %g2
4289e48cd4aSAllen Pais	cmp	%g2, CPU_ID_NIAGARA3
4294ba991d3SDavid S. Miller	be,pt	%xcc, 5f
4304ba991d3SDavid S. Miller	 mov	SUN4V_CHIP_NIAGARA3, %g4
4319e48cd4aSAllen Pais	cmp	%g2, CPU_ID_NIAGARA4
43208cefa9fSDavid S. Miller	be,pt	%xcc, 5f
43308cefa9fSDavid S. Miller	 mov	SUN4V_CHIP_NIAGARA4, %g4
4349e48cd4aSAllen Pais	cmp	%g2, CPU_ID_NIAGARA5
43508cefa9fSDavid S. Miller	be,pt	%xcc, 5f
43608cefa9fSDavid S. Miller	 mov	SUN4V_CHIP_NIAGARA5, %g4
4379e48cd4aSAllen Pais	cmp	%g2, CPU_ID_M6
438cadbb580SAllen Pais	be,pt	%xcc, 5f
439cadbb580SAllen Pais	 mov	SUN4V_CHIP_SPARC_M6, %g4
4409e48cd4aSAllen Pais	cmp	%g2, CPU_ID_M7
441cadbb580SAllen Pais	be,pt	%xcc, 5f
442cadbb580SAllen Pais	 mov	SUN4V_CHIP_SPARC_M7, %g4
4437d484acbSAllen Pais	cmp	%g2, CPU_ID_M8
4447d484acbSAllen Pais	be,pt	%xcc, 5f
4457d484acbSAllen Pais	 mov	SUN4V_CHIP_SPARC_M8, %g4
4469e48cd4aSAllen Pais	cmp	%g2, CPU_ID_SONOMA1
447c5b8b5beSKhalid Aziz	be,pt	%xcc, 5f
448c5b8b5beSKhalid Aziz	 mov	SUN4V_CHIP_SPARC_SN, %g4
44976950e6eSAllen Pais	ba,pt	%xcc, 49f
4504ba991d3SDavid S. Miller	 nop
4514ba991d3SDavid S. Miller
4524ba991d3SDavid S. Miller91:	sethi	%hi(prom_cpu_compatible), %g1
4534ba991d3SDavid S. Miller	or	%g1, %lo(prom_cpu_compatible), %g1
454a88b5ba8SSam Ravnborg	ldub	[%g1 + 17], %g2
4559e48cd4aSAllen Pais	cmp	%g2, CPU_ID_NIAGARA1
456a88b5ba8SSam Ravnborg	be,pt	%xcc, 5f
457a88b5ba8SSam Ravnborg	 mov	SUN4V_CHIP_NIAGARA1, %g4
4589e48cd4aSAllen Pais	cmp	%g2, CPU_ID_NIAGARA2
459a88b5ba8SSam Ravnborg	be,pt	%xcc, 5f
460a88b5ba8SSam Ravnborg	 mov	SUN4V_CHIP_NIAGARA2, %g4
4614ba991d3SDavid S. Miller
462a88b5ba8SSam Ravnborg4:
46376950e6eSAllen Pais	/* Athena */
46476950e6eSAllen Pais	sethi	%hi(prom_cpu_compatible), %g1
46576950e6eSAllen Pais	or	%g1, %lo(prom_cpu_compatible), %g1
46676950e6eSAllen Pais	sethi	%hi(prom_sparc64x_prefix), %g7
46776950e6eSAllen Pais	or	%g7, %lo(prom_sparc64x_prefix), %g7
46876950e6eSAllen Pais	mov	9, %g3
46976950e6eSAllen Pais41:	ldub	[%g7], %g2
47076950e6eSAllen Pais	ldub	[%g1], %g4
47176950e6eSAllen Pais	cmp	%g2, %g4
47276950e6eSAllen Pais	bne,pn	%icc, 49f
47376950e6eSAllen Pais	add	%g7, 1, %g7
47476950e6eSAllen Pais	subcc	%g3, 1, %g3
47576950e6eSAllen Pais	bne,pt	%xcc, 41b
47676950e6eSAllen Pais	add	%g1, 1, %g1
47776950e6eSAllen Pais	ba,pt	%xcc, 5f
47849fa5230SDavid S. Miller	 mov	SUN4V_CHIP_SPARC64X, %g4
47976950e6eSAllen Pais
48076950e6eSAllen Pais49:
481a88b5ba8SSam Ravnborg	mov	SUN4V_CHIP_UNKNOWN, %g4
482a88b5ba8SSam Ravnborg5:	sethi	%hi(sun4v_chip_type), %g2
483a88b5ba8SSam Ravnborg	or	%g2, %lo(sun4v_chip_type), %g2
484a88b5ba8SSam Ravnborg	stw	%g4, [%g2]
485a88b5ba8SSam Ravnborg
486a88b5ba8SSam Ravnborg80:
487a88b5ba8SSam Ravnborg	BRANCH_IF_SUN4V(g1, jump_to_sun4u_init)
488a88b5ba8SSam Ravnborg	BRANCH_IF_CHEETAH_BASE(g1,g7,cheetah_boot)
489a88b5ba8SSam Ravnborg	BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g7,cheetah_plus_boot)
490a88b5ba8SSam Ravnborg	ba,pt	%xcc, spitfire_boot
491a88b5ba8SSam Ravnborg	 nop
492a88b5ba8SSam Ravnborg
493a88b5ba8SSam Ravnborgcheetah_plus_boot:
494a88b5ba8SSam Ravnborg	/* Preserve OBP chosen DCU and DCR register settings.  */
495a88b5ba8SSam Ravnborg	ba,pt	%xcc, cheetah_generic_boot
496a88b5ba8SSam Ravnborg	 nop
497a88b5ba8SSam Ravnborg
498a88b5ba8SSam Ravnborgcheetah_boot:
499a88b5ba8SSam Ravnborg	mov	DCR_BPE | DCR_RPE | DCR_SI | DCR_IFPOE | DCR_MS, %g1
500a88b5ba8SSam Ravnborg	wr	%g1, %asr18
501a88b5ba8SSam Ravnborg
502a88b5ba8SSam Ravnborg	sethi	%uhi(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g7
503a88b5ba8SSam Ravnborg	or	%g7, %ulo(DCU_ME|DCU_RE|DCU_HPE|DCU_SPE|DCU_SL|DCU_WE), %g7
504a88b5ba8SSam Ravnborg	sllx	%g7, 32, %g7
505a88b5ba8SSam Ravnborg	or	%g7, DCU_DM | DCU_IM | DCU_DC | DCU_IC, %g7
506a88b5ba8SSam Ravnborg	stxa	%g7, [%g0] ASI_DCU_CONTROL_REG
507a88b5ba8SSam Ravnborg	membar	#Sync
508a88b5ba8SSam Ravnborg
509a88b5ba8SSam Ravnborgcheetah_generic_boot:
510a88b5ba8SSam Ravnborg	mov	TSB_EXTENSION_P, %g3
511a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_DMMU
512a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_IMMU
513a88b5ba8SSam Ravnborg	membar	#Sync
514a88b5ba8SSam Ravnborg
515a88b5ba8SSam Ravnborg	mov	TSB_EXTENSION_S, %g3
516a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_DMMU
517a88b5ba8SSam Ravnborg	membar	#Sync
518a88b5ba8SSam Ravnborg
519a88b5ba8SSam Ravnborg	mov	TSB_EXTENSION_N, %g3
520a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_DMMU
521a88b5ba8SSam Ravnborg	stxa	%g0, [%g3] ASI_IMMU
522a88b5ba8SSam Ravnborg	membar	#Sync
523a88b5ba8SSam Ravnborg
524a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, jump_to_sun4u_init
525a88b5ba8SSam Ravnborg
526a88b5ba8SSam Ravnborgspitfire_boot:
527a88b5ba8SSam Ravnborg	/* Typically PROM has already enabled both MMU's and both on-chip
528a88b5ba8SSam Ravnborg	 * caches, but we do it here anyway just to be paranoid.
529a88b5ba8SSam Ravnborg	 */
530a88b5ba8SSam Ravnborg	mov	(LSU_CONTROL_IC|LSU_CONTROL_DC|LSU_CONTROL_IM|LSU_CONTROL_DM), %g1
531a88b5ba8SSam Ravnborg	stxa	%g1, [%g0] ASI_LSU_CONTROL
532a88b5ba8SSam Ravnborg	membar	#Sync
533a88b5ba8SSam Ravnborg
534a88b5ba8SSam Ravnborgjump_to_sun4u_init:
535a88b5ba8SSam Ravnborg	/*
536a88b5ba8SSam Ravnborg	 * Make sure we are in privileged mode, have address masking,
537a88b5ba8SSam Ravnborg         * using the ordinary globals and have enabled floating
538a88b5ba8SSam Ravnborg         * point.
539a88b5ba8SSam Ravnborg	 *
540a88b5ba8SSam Ravnborg	 * Again, typically PROM has left %pil at 13 or similar, and
541a88b5ba8SSam Ravnborg	 * (PSTATE_PRIV | PSTATE_PEF | PSTATE_IE) in %pstate.
542a88b5ba8SSam Ravnborg         */
543a88b5ba8SSam Ravnborg	wrpr    %g0, (PSTATE_PRIV|PSTATE_PEF|PSTATE_IE), %pstate
544a88b5ba8SSam Ravnborg	wr	%g0, 0, %fprs
545a88b5ba8SSam Ravnborg
546a88b5ba8SSam Ravnborg	set	sun4u_init, %g2
547a88b5ba8SSam Ravnborg	jmpl    %g2 + %g0, %g0
548a88b5ba8SSam Ravnborg	 nop
549a88b5ba8SSam Ravnborg
550a0871e8cSTim Abbott	__REF
551a88b5ba8SSam Ravnborgsun4u_init:
552a88b5ba8SSam Ravnborg	BRANCH_IF_SUN4V(g1, sun4v_init)
553a88b5ba8SSam Ravnborg
554a88b5ba8SSam Ravnborg	/* Set ctx 0 */
555a88b5ba8SSam Ravnborg	mov		PRIMARY_CONTEXT, %g7
556a88b5ba8SSam Ravnborg	stxa		%g0, [%g7] ASI_DMMU
557a88b5ba8SSam Ravnborg	membar		#Sync
558a88b5ba8SSam Ravnborg
559a88b5ba8SSam Ravnborg	mov		SECONDARY_CONTEXT, %g7
560a88b5ba8SSam Ravnborg	stxa		%g0, [%g7] ASI_DMMU
561a88b5ba8SSam Ravnborg	membar	#Sync
562a88b5ba8SSam Ravnborg
56349fa5230SDavid S. Miller	ba,a,pt		%xcc, sun4u_continue
564a88b5ba8SSam Ravnborg
565a88b5ba8SSam Ravnborgsun4v_init:
566a88b5ba8SSam Ravnborg	/* Set ctx 0 */
567a88b5ba8SSam Ravnborg	mov		PRIMARY_CONTEXT, %g7
568a88b5ba8SSam Ravnborg	stxa		%g0, [%g7] ASI_MMU
569a88b5ba8SSam Ravnborg	membar		#Sync
570a88b5ba8SSam Ravnborg
571a88b5ba8SSam Ravnborg	mov		SECONDARY_CONTEXT, %g7
572a88b5ba8SSam Ravnborg	stxa		%g0, [%g7] ASI_MMU
573a88b5ba8SSam Ravnborg	membar		#Sync
57449fa5230SDavid S. Miller	ba,a,pt		%xcc, niagara_tlb_fixup
575a88b5ba8SSam Ravnborg
576a88b5ba8SSam Ravnborgsun4u_continue:
577a88b5ba8SSam Ravnborg	BRANCH_IF_ANY_CHEETAH(g1, g7, cheetah_tlb_fixup)
578a88b5ba8SSam Ravnborg
57949fa5230SDavid S. Miller	ba,a,pt	%xcc, spitfire_tlb_fixup
580a88b5ba8SSam Ravnborg
581a88b5ba8SSam Ravnborgniagara_tlb_fixup:
582a88b5ba8SSam Ravnborg	mov	3, %g2		/* Set TLB type to hypervisor. */
583a88b5ba8SSam Ravnborg	sethi	%hi(tlb_type), %g1
584a88b5ba8SSam Ravnborg	stw	%g2, [%g1 + %lo(tlb_type)]
585a88b5ba8SSam Ravnborg
586a88b5ba8SSam Ravnborg	/* Patch copy/clear ops.  */
587a88b5ba8SSam Ravnborg	sethi	%hi(sun4v_chip_type), %g1
588a88b5ba8SSam Ravnborg	lduw	[%g1 + %lo(sun4v_chip_type)], %g1
589a88b5ba8SSam Ravnborg	cmp	%g1, SUN4V_CHIP_NIAGARA1
590a88b5ba8SSam Ravnborg	be,pt	%xcc, niagara_patch
591a88b5ba8SSam Ravnborg	 cmp	%g1, SUN4V_CHIP_NIAGARA2
592a88b5ba8SSam Ravnborg	be,pt	%xcc, niagara2_patch
593a88b5ba8SSam Ravnborg	 nop
5944ba991d3SDavid S. Miller	cmp	%g1, SUN4V_CHIP_NIAGARA3
5954ba991d3SDavid S. Miller	be,pt	%xcc, niagara2_patch
5964ba991d3SDavid S. Miller	 nop
59708cefa9fSDavid S. Miller	cmp	%g1, SUN4V_CHIP_NIAGARA4
598ae2c6ca6SDavid S. Miller	be,pt	%xcc, niagara4_patch
59908cefa9fSDavid S. Miller	 nop
60008cefa9fSDavid S. Miller	cmp	%g1, SUN4V_CHIP_NIAGARA5
601ae2c6ca6SDavid S. Miller	be,pt	%xcc, niagara4_patch
60208cefa9fSDavid S. Miller	 nop
603cadbb580SAllen Pais	cmp	%g1, SUN4V_CHIP_SPARC_M6
604cadbb580SAllen Pais	be,pt	%xcc, niagara4_patch
605cadbb580SAllen Pais	 nop
606cadbb580SAllen Pais	cmp	%g1, SUN4V_CHIP_SPARC_M7
607b3a04ed5SBabu Moger	be,pt	%xcc, sparc_m7_patch
608cadbb580SAllen Pais	 nop
6097d484acbSAllen Pais	cmp	%g1, SUN4V_CHIP_SPARC_M8
610b3a04ed5SBabu Moger	be,pt	%xcc, sparc_m7_patch
6117d484acbSAllen Pais	 nop
612c5b8b5beSKhalid Aziz	cmp	%g1, SUN4V_CHIP_SPARC_SN
613c5b8b5beSKhalid Aziz	be,pt	%xcc, niagara4_patch
614c5b8b5beSKhalid Aziz	 nop
615a88b5ba8SSam Ravnborg
616a88b5ba8SSam Ravnborg	call	generic_patch_copyops
617a88b5ba8SSam Ravnborg	 nop
618a88b5ba8SSam Ravnborg	call	generic_patch_bzero
619a88b5ba8SSam Ravnborg	 nop
620a88b5ba8SSam Ravnborg	call	generic_patch_pageops
621a88b5ba8SSam Ravnborg	 nop
622a88b5ba8SSam Ravnborg
623a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, 80f
6240ae2d26fSBabu Moger	 nop
625b3a04ed5SBabu Moger
626b3a04ed5SBabu Mogersparc_m7_patch:
627b3a04ed5SBabu Moger	call	m7_patch_copyops
628b3a04ed5SBabu Moger	 nop
629b3a04ed5SBabu Moger	call	m7_patch_bzero
630b3a04ed5SBabu Moger	 nop
631b3a04ed5SBabu Moger	call	m7_patch_pageops
632b3a04ed5SBabu Moger	 nop
633b3a04ed5SBabu Moger
634b3a04ed5SBabu Moger	ba,a,pt	%xcc, 80f
635b3a04ed5SBabu Moger	 nop
636b3a04ed5SBabu Moger
637ae2c6ca6SDavid S. Millerniagara4_patch:
638ae2c6ca6SDavid S. Miller	call	niagara4_patch_copyops
639ae2c6ca6SDavid S. Miller	 nop
6409f825962SDavid S. Miller	call	niagara4_patch_bzero
641ae2c6ca6SDavid S. Miller	 nop
642ae2c6ca6SDavid S. Miller	call	niagara4_patch_pageops
643ae2c6ca6SDavid S. Miller	 nop
64446ad8d2dSVijay Kumar	call	niagara4_patch_fls
64546ad8d2dSVijay Kumar	 nop
646ae2c6ca6SDavid S. Miller
647ae2c6ca6SDavid S. Miller	ba,a,pt	%xcc, 80f
6480ae2d26fSBabu Moger	 nop
649ae2c6ca6SDavid S. Miller
650a88b5ba8SSam Ravnborgniagara2_patch:
651a88b5ba8SSam Ravnborg	call	niagara2_patch_copyops
652a88b5ba8SSam Ravnborg	 nop
653a88b5ba8SSam Ravnborg	call	niagara_patch_bzero
654a88b5ba8SSam Ravnborg	 nop
655e95ade08SDavid S. Miller	call	niagara_patch_pageops
656a88b5ba8SSam Ravnborg	 nop
657a88b5ba8SSam Ravnborg
658a88b5ba8SSam Ravnborg	ba,a,pt	%xcc, 80f
6590ae2d26fSBabu Moger	 nop
660a88b5ba8SSam Ravnborg
661a88b5ba8SSam Ravnborgniagara_patch:
662a88b5ba8SSam Ravnborg	call	niagara_patch_copyops
663a88b5ba8SSam Ravnborg	 nop
664a88b5ba8SSam Ravnborg	call	niagara_patch_bzero
665a88b5ba8SSam Ravnborg	 nop
666a88b5ba8SSam Ravnborg	call	niagara_patch_pageops
667a88b5ba8SSam Ravnborg	 nop
668a88b5ba8SSam Ravnborg
669a88b5ba8SSam Ravnborg80:
670a88b5ba8SSam Ravnborg	/* Patch TLB/cache ops.  */
671a88b5ba8SSam Ravnborg	call	hypervisor_patch_cachetlbops
672a88b5ba8SSam Ravnborg	 nop
673a88b5ba8SSam Ravnborg
67449fa5230SDavid S. Miller	ba,a,pt	%xcc, tlb_fixup_done
675a88b5ba8SSam Ravnborg
676a88b5ba8SSam Ravnborgcheetah_tlb_fixup:
677a88b5ba8SSam Ravnborg	mov	2, %g2		/* Set TLB type to cheetah+. */
678a88b5ba8SSam Ravnborg	BRANCH_IF_CHEETAH_PLUS_OR_FOLLOWON(g1,g7,1f)
679a88b5ba8SSam Ravnborg
680a88b5ba8SSam Ravnborg	mov	1, %g2		/* Set TLB type to cheetah. */
681a88b5ba8SSam Ravnborg
682a88b5ba8SSam Ravnborg1:	sethi	%hi(tlb_type), %g1
683a88b5ba8SSam Ravnborg	stw	%g2, [%g1 + %lo(tlb_type)]
684a88b5ba8SSam Ravnborg
685a88b5ba8SSam Ravnborg	/* Patch copy/page operations to cheetah optimized versions. */
686a88b5ba8SSam Ravnborg	call	cheetah_patch_copyops
687a88b5ba8SSam Ravnborg	 nop
688a88b5ba8SSam Ravnborg	call	cheetah_patch_copy_page
689a88b5ba8SSam Ravnborg	 nop
690a88b5ba8SSam Ravnborg	call	cheetah_patch_cachetlbops
691a88b5ba8SSam Ravnborg	 nop
692a88b5ba8SSam Ravnborg
69349fa5230SDavid S. Miller	ba,a,pt	%xcc, tlb_fixup_done
694a88b5ba8SSam Ravnborg
695a88b5ba8SSam Ravnborgspitfire_tlb_fixup:
696a88b5ba8SSam Ravnborg	/* Set TLB type to spitfire. */
697a88b5ba8SSam Ravnborg	mov	0, %g2
698a88b5ba8SSam Ravnborg	sethi	%hi(tlb_type), %g1
699a88b5ba8SSam Ravnborg	stw	%g2, [%g1 + %lo(tlb_type)]
700a88b5ba8SSam Ravnborg
701a88b5ba8SSam Ravnborgtlb_fixup_done:
702a88b5ba8SSam Ravnborg	sethi	%hi(init_thread_union), %g6
703a88b5ba8SSam Ravnborg	or	%g6, %lo(init_thread_union), %g6
704a88b5ba8SSam Ravnborg	ldx	[%g6 + TI_TASK], %g4
705a88b5ba8SSam Ravnborg
706a88b5ba8SSam Ravnborg	wr	%g0, ASI_P, %asi
707a88b5ba8SSam Ravnborg	mov	1, %g1
708a88b5ba8SSam Ravnborg	sllx	%g1, THREAD_SHIFT, %g1
709d17b9ec7SAl Viro	sub	%g1, (STACKFRAME_SZ + STACK_BIAS + TRACEREG_SZ), %g1
710a88b5ba8SSam Ravnborg	add	%g6, %g1, %sp
711a88b5ba8SSam Ravnborg
712a88b5ba8SSam Ravnborg	/* Set per-cpu pointer initially to zero, this makes
713a88b5ba8SSam Ravnborg	 * the boot-cpu use the in-kernel-image per-cpu areas
714a88b5ba8SSam Ravnborg	 * before setup_per_cpu_area() is invoked.
715a88b5ba8SSam Ravnborg	 */
716a88b5ba8SSam Ravnborg	clr	%g5
717a88b5ba8SSam Ravnborg
718a88b5ba8SSam Ravnborg	wrpr	%g0, 0, %wstate
719a88b5ba8SSam Ravnborg	wrpr	%g0, 0x0, %tl
720a88b5ba8SSam Ravnborg
721a88b5ba8SSam Ravnborg	/* Clear the bss */
722a88b5ba8SSam Ravnborg	sethi	%hi(__bss_start), %o0
723a88b5ba8SSam Ravnborg	or	%o0, %lo(__bss_start), %o0
724a88b5ba8SSam Ravnborg	sethi	%hi(_end), %o1
725a88b5ba8SSam Ravnborg	or	%o1, %lo(_end), %o1
726a88b5ba8SSam Ravnborg	call	__bzero
727a88b5ba8SSam Ravnborg	 sub	%o1, %o0, %o1
728a88b5ba8SSam Ravnborg
729a88b5ba8SSam Ravnborg	call	prom_init
730a88b5ba8SSam Ravnborg	 mov	%l7, %o0			! OpenPROM cif handler
731a88b5ba8SSam Ravnborg
732ef3e035cSDavid S. Miller	/* To create a one-register-window buffer between the kernel's
733ef3e035cSDavid S. Miller	 * initial stack and the last stack frame we use from the firmware,
734ef3e035cSDavid S. Miller	 * do the rest of the boot from a C helper function.
735a88b5ba8SSam Ravnborg	 */
736ef3e035cSDavid S. Miller	call	start_early_boot
737a88b5ba8SSam Ravnborg	 nop
738a88b5ba8SSam Ravnborg	/* Not reached... */
739a88b5ba8SSam Ravnborg
740a88b5ba8SSam Ravnborg	.previous
741a88b5ba8SSam Ravnborg
742a88b5ba8SSam Ravnborg	/* This is meant to allow the sharing of this code between
743a88b5ba8SSam Ravnborg	 * boot processor invocation (via setup_tba() below) and
744a88b5ba8SSam Ravnborg	 * secondary processor startup (via trampoline.S).  The
745a88b5ba8SSam Ravnborg	 * former does use this code, the latter does not yet due
746a88b5ba8SSam Ravnborg	 * to some complexities.  That should be fixed up at some
747a88b5ba8SSam Ravnborg	 * point.
748a88b5ba8SSam Ravnborg	 *
749a88b5ba8SSam Ravnborg	 * There used to be enormous complexity wrt. transferring
750877d0310SNick Andrew	 * over from the firmware's trap table to the Linux kernel's.
751a88b5ba8SSam Ravnborg	 * For example, there was a chicken & egg problem wrt. building
752a88b5ba8SSam Ravnborg	 * the OBP page tables, yet needing to be on the Linux kernel
753a88b5ba8SSam Ravnborg	 * trap table (to translate PAGE_OFFSET addresses) in order to
754a88b5ba8SSam Ravnborg	 * do that.
755a88b5ba8SSam Ravnborg	 *
756a88b5ba8SSam Ravnborg	 * We now handle OBP tlb misses differently, via linear lookups
757a88b5ba8SSam Ravnborg	 * into the prom_trans[] array.  So that specific problem no
758a88b5ba8SSam Ravnborg	 * longer exists.  Yet, unfortunately there are still some issues
759a88b5ba8SSam Ravnborg	 * preventing trampoline.S from using this code... ho hum.
760a88b5ba8SSam Ravnborg	 */
761a88b5ba8SSam Ravnborg	.globl	setup_trap_table
762a88b5ba8SSam Ravnborgsetup_trap_table:
763a88b5ba8SSam Ravnborg	save	%sp, -192, %sp
764a88b5ba8SSam Ravnborg
765a88b5ba8SSam Ravnborg	/* Force interrupts to be disabled. */
766a88b5ba8SSam Ravnborg	rdpr	%pstate, %l0
767a88b5ba8SSam Ravnborg	andn	%l0, PSTATE_IE, %o1
768a88b5ba8SSam Ravnborg	wrpr	%o1, 0x0, %pstate
769a88b5ba8SSam Ravnborg	rdpr	%pil, %l1
770a88b5ba8SSam Ravnborg	wrpr	%g0, PIL_NORMAL_MAX, %pil
771a88b5ba8SSam Ravnborg
772a88b5ba8SSam Ravnborg	/* Make the firmware call to jump over to the Linux trap table.  */
773a88b5ba8SSam Ravnborg	sethi	%hi(is_sun4v), %o0
774a88b5ba8SSam Ravnborg	lduw	[%o0 + %lo(is_sun4v)], %o0
775a88b5ba8SSam Ravnborg	brz,pt	%o0, 1f
776a88b5ba8SSam Ravnborg	 nop
777a88b5ba8SSam Ravnborg
778a88b5ba8SSam Ravnborg	TRAP_LOAD_TRAP_BLOCK(%g2, %g3)
779a88b5ba8SSam Ravnborg	add	%g2, TRAP_PER_CPU_FAULT_INFO, %g2
780a88b5ba8SSam Ravnborg	stxa	%g2, [%g0] ASI_SCRATCHPAD
781a88b5ba8SSam Ravnborg
782a88b5ba8SSam Ravnborg	/* Compute physical address:
783a88b5ba8SSam Ravnborg	 *
784a88b5ba8SSam Ravnborg	 * paddr = kern_base + (mmfsa_vaddr - KERNBASE)
785a88b5ba8SSam Ravnborg	 */
786a88b5ba8SSam Ravnborg	sethi	%hi(KERNBASE), %g3
787a88b5ba8SSam Ravnborg	sub	%g2, %g3, %g2
788a88b5ba8SSam Ravnborg	sethi	%hi(kern_base), %g3
789a88b5ba8SSam Ravnborg	ldx	[%g3 + %lo(kern_base)], %g3
790a88b5ba8SSam Ravnborg	add	%g2, %g3, %o1
791a88b5ba8SSam Ravnborg	sethi	%hi(sparc64_ttable_tl0), %o0
792a88b5ba8SSam Ravnborg
793a88b5ba8SSam Ravnborg	set	prom_set_trap_table_name, %g2
794a88b5ba8SSam Ravnborg	stx	%g2, [%sp + 2047 + 128 + 0x00]
795a88b5ba8SSam Ravnborg	mov	2, %g2
796a88b5ba8SSam Ravnborg	stx	%g2, [%sp + 2047 + 128 + 0x08]
797a88b5ba8SSam Ravnborg	mov	0, %g2
798a88b5ba8SSam Ravnborg	stx	%g2, [%sp + 2047 + 128 + 0x10]
799a88b5ba8SSam Ravnborg	stx	%o0, [%sp + 2047 + 128 + 0x18]
800a88b5ba8SSam Ravnborg	stx	%o1, [%sp + 2047 + 128 + 0x20]
801a88b5ba8SSam Ravnborg	sethi	%hi(p1275buf), %g2
802a88b5ba8SSam Ravnborg	or	%g2, %lo(p1275buf), %g2
803a88b5ba8SSam Ravnborg	ldx	[%g2 + 0x08], %o1
804a88b5ba8SSam Ravnborg	call	%o1
805a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0
806a88b5ba8SSam Ravnborg
80749fa5230SDavid S. Miller	ba,a,pt	%xcc, 2f
808a88b5ba8SSam Ravnborg
809a88b5ba8SSam Ravnborg1:	sethi	%hi(sparc64_ttable_tl0), %o0
810a88b5ba8SSam Ravnborg	set	prom_set_trap_table_name, %g2
811a88b5ba8SSam Ravnborg	stx	%g2, [%sp + 2047 + 128 + 0x00]
812a88b5ba8SSam Ravnborg	mov	1, %g2
813a88b5ba8SSam Ravnborg	stx	%g2, [%sp + 2047 + 128 + 0x08]
814a88b5ba8SSam Ravnborg	mov	0, %g2
815a88b5ba8SSam Ravnborg	stx	%g2, [%sp + 2047 + 128 + 0x10]
816a88b5ba8SSam Ravnborg	stx	%o0, [%sp + 2047 + 128 + 0x18]
817a88b5ba8SSam Ravnborg	sethi	%hi(p1275buf), %g2
818a88b5ba8SSam Ravnborg	or	%g2, %lo(p1275buf), %g2
819a88b5ba8SSam Ravnborg	ldx	[%g2 + 0x08], %o1
820a88b5ba8SSam Ravnborg	call	%o1
821a88b5ba8SSam Ravnborg	 add	%sp, (2047 + 128), %o0
822a88b5ba8SSam Ravnborg
823a88b5ba8SSam Ravnborg	/* Start using proper page size encodings in ctx register.  */
824a88b5ba8SSam Ravnborg2:	sethi	%hi(sparc64_kern_pri_context), %g3
825a88b5ba8SSam Ravnborg	ldx	[%g3 + %lo(sparc64_kern_pri_context)], %g2
826a88b5ba8SSam Ravnborg
827a88b5ba8SSam Ravnborg	mov		PRIMARY_CONTEXT, %g1
828a88b5ba8SSam Ravnborg
829a88b5ba8SSam Ravnborg661:	stxa		%g2, [%g1] ASI_DMMU
830a88b5ba8SSam Ravnborg	.section	.sun4v_1insn_patch, "ax"
831a88b5ba8SSam Ravnborg	.word		661b
832a88b5ba8SSam Ravnborg	stxa		%g2, [%g1] ASI_MMU
833a88b5ba8SSam Ravnborg	.previous
834a88b5ba8SSam Ravnborg
835a88b5ba8SSam Ravnborg	membar	#Sync
836a88b5ba8SSam Ravnborg
837a88b5ba8SSam Ravnborg	BRANCH_IF_SUN4V(o2, 1f)
838a88b5ba8SSam Ravnborg
839a88b5ba8SSam Ravnborg	/* Kill PROM timer */
840a88b5ba8SSam Ravnborg	sethi	%hi(0x80000000), %o2
841a88b5ba8SSam Ravnborg	sllx	%o2, 32, %o2
842a88b5ba8SSam Ravnborg	wr	%o2, 0, %tick_cmpr
843a88b5ba8SSam Ravnborg
844a88b5ba8SSam Ravnborg	BRANCH_IF_ANY_CHEETAH(o2, o3, 1f)
845a88b5ba8SSam Ravnborg
84649fa5230SDavid S. Miller	ba,a,pt	%xcc, 2f
847a88b5ba8SSam Ravnborg
848a88b5ba8SSam Ravnborg	/* Disable STICK_INT interrupts. */
849a88b5ba8SSam Ravnborg1:
850a88b5ba8SSam Ravnborg	sethi	%hi(0x80000000), %o2
851a88b5ba8SSam Ravnborg	sllx	%o2, 32, %o2
852a88b5ba8SSam Ravnborg	wr	%o2, %asr25
853a88b5ba8SSam Ravnborg
854a88b5ba8SSam Ravnborg2:
855a88b5ba8SSam Ravnborg	wrpr	%g0, %g0, %wstate
856a88b5ba8SSam Ravnborg
857a88b5ba8SSam Ravnborg	call	init_irqwork_curcpu
858a88b5ba8SSam Ravnborg	 nop
859a88b5ba8SSam Ravnborg
860a88b5ba8SSam Ravnborg	/* Now we can restore interrupt state. */
861a88b5ba8SSam Ravnborg	wrpr	%l0, 0, %pstate
862a88b5ba8SSam Ravnborg	wrpr	%l1, 0x0, %pil
863a88b5ba8SSam Ravnborg
864a88b5ba8SSam Ravnborg	ret
865a88b5ba8SSam Ravnborg	 restore
866a88b5ba8SSam Ravnborg
867a88b5ba8SSam Ravnborg	.globl	setup_tba
868a88b5ba8SSam Ravnborgsetup_tba:
869a88b5ba8SSam Ravnborg	save	%sp, -192, %sp
870a88b5ba8SSam Ravnborg
871a88b5ba8SSam Ravnborg	/* The boot processor is the only cpu which invokes this
872a88b5ba8SSam Ravnborg	 * routine, the other cpus set things up via trampoline.S.
873a88b5ba8SSam Ravnborg	 * So save the OBP trap table address here.
874a88b5ba8SSam Ravnborg	 */
875a88b5ba8SSam Ravnborg	rdpr	%tba, %g7
876a88b5ba8SSam Ravnborg	sethi	%hi(prom_tba), %o1
877a88b5ba8SSam Ravnborg	or	%o1, %lo(prom_tba), %o1
878a88b5ba8SSam Ravnborg	stx	%g7, [%o1]
879a88b5ba8SSam Ravnborg
880a88b5ba8SSam Ravnborg	call	setup_trap_table
881a88b5ba8SSam Ravnborg	 nop
882a88b5ba8SSam Ravnborg
883a88b5ba8SSam Ravnborg	ret
884a88b5ba8SSam Ravnborg	 restore
885a88b5ba8SSam Ravnborgsparc64_boot_end:
886a88b5ba8SSam Ravnborg
887a88b5ba8SSam Ravnborg#include "etrap_64.S"
888a88b5ba8SSam Ravnborg#include "rtrap_64.S"
889a88b5ba8SSam Ravnborg#include "winfixup.S"
890a88b5ba8SSam Ravnborg#include "fpu_traps.S"
891a88b5ba8SSam Ravnborg#include "ivec.S"
892a88b5ba8SSam Ravnborg#include "getsetcc.S"
893a88b5ba8SSam Ravnborg#include "utrap.S"
894a88b5ba8SSam Ravnborg#include "spiterrs.S"
895a88b5ba8SSam Ravnborg#include "cherrs.S"
896a88b5ba8SSam Ravnborg#include "misctrap.S"
897a88b5ba8SSam Ravnborg#include "syscalls.S"
898a88b5ba8SSam Ravnborg#include "helpers.S"
899a88b5ba8SSam Ravnborg#include "sun4v_tlb_miss.S"
90075037500SKhalid Aziz#include "sun4v_mcd.S"
901a88b5ba8SSam Ravnborg#include "sun4v_ivec.S"
902a88b5ba8SSam Ravnborg#include "ktlb.S"
903a88b5ba8SSam Ravnborg#include "tsb.S"
904a88b5ba8SSam Ravnborg
905a88b5ba8SSam Ravnborg/*
906a88b5ba8SSam Ravnborg * The following skip makes sure the trap table in ttable.S is aligned
907a88b5ba8SSam Ravnborg * on a 32K boundary as required by the v9 specs for TBA register.
908a88b5ba8SSam Ravnborg *
909a88b5ba8SSam Ravnborg * We align to a 32K boundary, then we have the 32K kernel TSB,
910a88b5ba8SSam Ravnborg * the 64K kernel 4MB TSB, and then the 32K aligned trap table.
911a88b5ba8SSam Ravnborg */
912a88b5ba8SSam Ravnborg1:
913a88b5ba8SSam Ravnborg	.skip	0x4000 + _start - 1b
914a88b5ba8SSam Ravnborg
915a88b5ba8SSam Ravnborg! 0x0000000000408000
916a88b5ba8SSam Ravnborg
917a88b5ba8SSam Ravnborg	.globl	swapper_tsb
918a88b5ba8SSam Ravnborgswapper_tsb:
919a88b5ba8SSam Ravnborg	.skip	(32 * 1024)
920a88b5ba8SSam Ravnborg
921a88b5ba8SSam Ravnborg	.globl	swapper_4m_tsb
922a88b5ba8SSam Ravnborgswapper_4m_tsb:
923a88b5ba8SSam Ravnborg	.skip	(64 * 1024)
924a88b5ba8SSam Ravnborg
925a88b5ba8SSam Ravnborg! 0x0000000000420000
926a88b5ba8SSam Ravnborg
927a88b5ba8SSam Ravnborg	/* Some care needs to be exercised if you try to move the
928a88b5ba8SSam Ravnborg	 * location of the trap table relative to other things.  For
929a88b5ba8SSam Ravnborg	 * one thing there are br* instructions in some of the
930a88b5ba8SSam Ravnborg	 * trap table entires which branch back to code in ktlb.S
931a88b5ba8SSam Ravnborg	 * Those instructions can only handle a signed 16-bit
932a88b5ba8SSam Ravnborg	 * displacement.
933a88b5ba8SSam Ravnborg	 *
934a88b5ba8SSam Ravnborg	 * There is a binutils bug (bugzilla #4558) which causes
935a88b5ba8SSam Ravnborg	 * the relocation overflow checks for such instructions to
936a88b5ba8SSam Ravnborg	 * not be done correctly.  So bintuils will not notice the
937a88b5ba8SSam Ravnborg	 * error and will instead write junk into the relocation and
938a88b5ba8SSam Ravnborg	 * you'll have an unbootable kernel.
939a88b5ba8SSam Ravnborg	 */
940b979542dSSam Ravnborg#include "ttable_64.S"
941a88b5ba8SSam Ravnborg
942a88b5ba8SSam Ravnborg! 0x0000000000428000
943a88b5ba8SSam Ravnborg
944df7b2155SNitin Gupta#include "hvcalls.S"
945a88b5ba8SSam Ravnborg#include "systbls_64.S"
946a88b5ba8SSam Ravnborg
947a88b5ba8SSam Ravnborg	.data
948a88b5ba8SSam Ravnborg	.align	8
949a88b5ba8SSam Ravnborg	.globl	prom_tba, tlb_type
950a88b5ba8SSam Ravnborgprom_tba:	.xword	0
951a88b5ba8SSam Ravnborgtlb_type:	.word	0	/* Must NOT end up in BSS */
952d3867f04SAl ViroEXPORT_SYMBOL(tlb_type)
953a88b5ba8SSam Ravnborg	.section	".fixup",#alloc,#execinstr
954a88b5ba8SSam Ravnborg
95540bdac7dSDavid S. MillerENTRY(__retl_efault)
956a88b5ba8SSam Ravnborg	retl
957a88b5ba8SSam Ravnborg	 mov	-EFAULT, %o0
95840bdac7dSDavid S. MillerENDPROC(__retl_efault)
95940bdac7dSDavid S. Miller
96040bdac7dSDavid S. MillerENTRY(__retl_o1)
96140bdac7dSDavid S. Miller	retl
96240bdac7dSDavid S. Miller	 mov	%o1, %o0
96340bdac7dSDavid S. MillerENDPROC(__retl_o1)
9643c7f6221SDave Aldridge
9653c7f6221SDave AldridgeENTRY(__retl_o1_asi)
9663c7f6221SDave Aldridge	wr      %o5, 0x0, %asi
9673c7f6221SDave Aldridge	retl
9683c7f6221SDave Aldridge	 mov    %o1, %o0
9693c7f6221SDave AldridgeENDPROC(__retl_o1_asi)
970