xref: /openbmc/linux/arch/sparc/mm/ultra.S (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
1b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */
227137e52SSam Ravnborg/*
327137e52SSam Ravnborg * ultra.S: Don't expand these all over the place...
427137e52SSam Ravnborg *
527137e52SSam Ravnborg * Copyright (C) 1997, 2000, 2008 David S. Miller (davem@davemloft.net)
627137e52SSam Ravnborg */
727137e52SSam Ravnborg
8ca5999fdSMike Rapoport#include <linux/pgtable.h>
9*65fddcfcSMike Rapoport#include <asm/asi.h>
1027137e52SSam Ravnborg#include <asm/page.h>
1127137e52SSam Ravnborg#include <asm/spitfire.h>
1227137e52SSam Ravnborg#include <asm/mmu_context.h>
1327137e52SSam Ravnborg#include <asm/mmu.h>
1427137e52SSam Ravnborg#include <asm/pil.h>
1527137e52SSam Ravnborg#include <asm/head.h>
1627137e52SSam Ravnborg#include <asm/thread_info.h>
1727137e52SSam Ravnborg#include <asm/cacheflush.h>
1827137e52SSam Ravnborg#include <asm/hypervisor.h>
1927137e52SSam Ravnborg#include <asm/cpudata.h>
2027137e52SSam Ravnborg
2127137e52SSam Ravnborg	/* Basically, most of the Spitfire vs. Cheetah madness
2227137e52SSam Ravnborg	 * has to do with the fact that Cheetah does not support
2327137e52SSam Ravnborg	 * IMMU flushes out of the secondary context.  Someone needs
2427137e52SSam Ravnborg	 * to throw a south lake birthday party for the folks
2527137e52SSam Ravnborg	 * in Microelectronics who refused to fix this shit.
2627137e52SSam Ravnborg	 */
2727137e52SSam Ravnborg
2827137e52SSam Ravnborg	/* This file is meant to be read efficiently by the CPU, not humans.
2927137e52SSam Ravnborg	 * Staraj sie tego nikomu nie pierdolnac...
3027137e52SSam Ravnborg	 */
3127137e52SSam Ravnborg	.text
3227137e52SSam Ravnborg	.align		32
3327137e52SSam Ravnborg	.globl		__flush_tlb_mm
34b429ae4dSDavid S. Miller__flush_tlb_mm:		/* 19 insns */
3527137e52SSam Ravnborg	/* %o0=(ctx & TAG_CONTEXT_BITS), %o1=SECONDARY_CONTEXT */
3627137e52SSam Ravnborg	ldxa		[%o1] ASI_DMMU, %g2
3727137e52SSam Ravnborg	cmp		%g2, %o0
3827137e52SSam Ravnborg	bne,pn		%icc, __spitfire_flush_tlb_mm_slow
3927137e52SSam Ravnborg	 mov		0x50, %g3
4027137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_DMMU_DEMAP
4127137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_IMMU_DEMAP
4227137e52SSam Ravnborg	sethi		%hi(KERNBASE), %g3
4327137e52SSam Ravnborg	flush		%g3
4427137e52SSam Ravnborg	retl
4527137e52SSam Ravnborg	 nop
4627137e52SSam Ravnborg	nop
4727137e52SSam Ravnborg	nop
4827137e52SSam Ravnborg	nop
4927137e52SSam Ravnborg	nop
5027137e52SSam Ravnborg	nop
5127137e52SSam Ravnborg	nop
5227137e52SSam Ravnborg	nop
5327137e52SSam Ravnborg	nop
5427137e52SSam Ravnborg	nop
5527137e52SSam Ravnborg
5627137e52SSam Ravnborg	.align		32
57f36391d2SDavid S. Miller	.globl		__flush_tlb_page
58f36391d2SDavid S. Miller__flush_tlb_page:	/* 22 insns */
59f36391d2SDavid S. Miller	/* %o0 = context, %o1 = vaddr */
60f36391d2SDavid S. Miller	rdpr		%pstate, %g7
61f36391d2SDavid S. Miller	andn		%g7, PSTATE_IE, %g2
62f36391d2SDavid S. Miller	wrpr		%g2, %pstate
63f36391d2SDavid S. Miller	mov		SECONDARY_CONTEXT, %o4
64f36391d2SDavid S. Miller	ldxa		[%o4] ASI_DMMU, %g2
65f36391d2SDavid S. Miller	stxa		%o0, [%o4] ASI_DMMU
66f36391d2SDavid S. Miller	andcc		%o1, 1, %g0
67f36391d2SDavid S. Miller	andn		%o1, 1, %o3
68f36391d2SDavid S. Miller	be,pn		%icc, 1f
69f36391d2SDavid S. Miller	 or		%o3, 0x10, %o3
70f36391d2SDavid S. Miller	stxa		%g0, [%o3] ASI_IMMU_DEMAP
71f36391d2SDavid S. Miller1:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
72f36391d2SDavid S. Miller	membar		#Sync
73f36391d2SDavid S. Miller	stxa		%g2, [%o4] ASI_DMMU
74f36391d2SDavid S. Miller	sethi		%hi(KERNBASE), %o4
75f36391d2SDavid S. Miller	flush		%o4
76f36391d2SDavid S. Miller	retl
77f36391d2SDavid S. Miller	 wrpr		%g7, 0x0, %pstate
78f36391d2SDavid S. Miller	nop
79f36391d2SDavid S. Miller	nop
80f36391d2SDavid S. Miller	nop
81f36391d2SDavid S. Miller	nop
82f36391d2SDavid S. Miller
83f36391d2SDavid S. Miller	.align		32
8427137e52SSam Ravnborg	.globl		__flush_tlb_pending
85b429ae4dSDavid S. Miller__flush_tlb_pending:	/* 27 insns */
8627137e52SSam Ravnborg	/* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
8727137e52SSam Ravnborg	rdpr		%pstate, %g7
8827137e52SSam Ravnborg	sllx		%o1, 3, %o1
8927137e52SSam Ravnborg	andn		%g7, PSTATE_IE, %g2
9027137e52SSam Ravnborg	wrpr		%g2, %pstate
9127137e52SSam Ravnborg	mov		SECONDARY_CONTEXT, %o4
9227137e52SSam Ravnborg	ldxa		[%o4] ASI_DMMU, %g2
9327137e52SSam Ravnborg	stxa		%o0, [%o4] ASI_DMMU
9427137e52SSam Ravnborg1:	sub		%o1, (1 << 3), %o1
9527137e52SSam Ravnborg	ldx		[%o2 + %o1], %o3
9627137e52SSam Ravnborg	andcc		%o3, 1, %g0
9727137e52SSam Ravnborg	andn		%o3, 1, %o3
9827137e52SSam Ravnborg	be,pn		%icc, 2f
9927137e52SSam Ravnborg	 or		%o3, 0x10, %o3
10027137e52SSam Ravnborg	stxa		%g0, [%o3] ASI_IMMU_DEMAP
10127137e52SSam Ravnborg2:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
10227137e52SSam Ravnborg	membar		#Sync
10327137e52SSam Ravnborg	brnz,pt		%o1, 1b
10427137e52SSam Ravnborg	 nop
10527137e52SSam Ravnborg	stxa		%g2, [%o4] ASI_DMMU
10627137e52SSam Ravnborg	sethi		%hi(KERNBASE), %o4
10727137e52SSam Ravnborg	flush		%o4
10827137e52SSam Ravnborg	retl
10927137e52SSam Ravnborg	 wrpr		%g7, 0x0, %pstate
11027137e52SSam Ravnborg	nop
11127137e52SSam Ravnborg	nop
11227137e52SSam Ravnborg	nop
11327137e52SSam Ravnborg	nop
11427137e52SSam Ravnborg
11527137e52SSam Ravnborg	.align		32
11627137e52SSam Ravnborg	.globl		__flush_tlb_kernel_range
117a74ad5e6SDavid S. Miller__flush_tlb_kernel_range:	/* 31 insns */
11827137e52SSam Ravnborg	/* %o0=start, %o1=end */
11927137e52SSam Ravnborg	cmp		%o0, %o1
12027137e52SSam Ravnborg	be,pn		%xcc, 2f
12127137e52SSam Ravnborg	 sub		%o1, %o0, %o3
122a74ad5e6SDavid S. Miller	srlx		%o3, 18, %o4
123a74ad5e6SDavid S. Miller	brnz,pn		%o4, __spitfire_flush_tlb_kernel_range_slow
124a74ad5e6SDavid S. Miller	 sethi		%hi(PAGE_SIZE), %o4
12527137e52SSam Ravnborg	sub		%o3, %o4, %o3
12627137e52SSam Ravnborg	or		%o0, 0x20, %o0		! Nucleus
12727137e52SSam Ravnborg1:	stxa		%g0, [%o0 + %o3] ASI_DMMU_DEMAP
12827137e52SSam Ravnborg	stxa		%g0, [%o0 + %o3] ASI_IMMU_DEMAP
12927137e52SSam Ravnborg	membar		#Sync
13027137e52SSam Ravnborg	brnz,pt		%o3, 1b
13127137e52SSam Ravnborg	 sub		%o3, %o4, %o3
13227137e52SSam Ravnborg2:	sethi		%hi(KERNBASE), %o3
13327137e52SSam Ravnborg	flush		%o3
13427137e52SSam Ravnborg	retl
13527137e52SSam Ravnborg	 nop
13627137e52SSam Ravnborg	nop
137b429ae4dSDavid S. Miller	nop
138b429ae4dSDavid S. Miller	nop
139b429ae4dSDavid S. Miller	nop
140a74ad5e6SDavid S. Miller	nop
141a74ad5e6SDavid S. Miller	nop
142a74ad5e6SDavid S. Miller	nop
143a74ad5e6SDavid S. Miller	nop
144a74ad5e6SDavid S. Miller	nop
145a74ad5e6SDavid S. Miller	nop
146a74ad5e6SDavid S. Miller	nop
147a74ad5e6SDavid S. Miller	nop
148a74ad5e6SDavid S. Miller	nop
149a74ad5e6SDavid S. Miller	nop
150a74ad5e6SDavid S. Miller
151a74ad5e6SDavid S. Miller__spitfire_flush_tlb_kernel_range_slow:
152a74ad5e6SDavid S. Miller	mov		63 * 8, %o4
153a74ad5e6SDavid S. Miller1:	ldxa		[%o4] ASI_ITLB_DATA_ACCESS, %o3
154a74ad5e6SDavid S. Miller	andcc		%o3, 0x40, %g0			/* _PAGE_L_4U */
155a74ad5e6SDavid S. Miller	bne,pn		%xcc, 2f
156a74ad5e6SDavid S. Miller	 mov		TLB_TAG_ACCESS, %o3
157a74ad5e6SDavid S. Miller	stxa		%g0, [%o3] ASI_IMMU
158a74ad5e6SDavid S. Miller	stxa		%g0, [%o4] ASI_ITLB_DATA_ACCESS
159a74ad5e6SDavid S. Miller	membar		#Sync
160a74ad5e6SDavid S. Miller2:	ldxa		[%o4] ASI_DTLB_DATA_ACCESS, %o3
161a74ad5e6SDavid S. Miller	andcc		%o3, 0x40, %g0
162a74ad5e6SDavid S. Miller	bne,pn		%xcc, 2f
163a74ad5e6SDavid S. Miller	 mov		TLB_TAG_ACCESS, %o3
164a74ad5e6SDavid S. Miller	stxa		%g0, [%o3] ASI_DMMU
165a74ad5e6SDavid S. Miller	stxa		%g0, [%o4] ASI_DTLB_DATA_ACCESS
166a74ad5e6SDavid S. Miller	membar		#Sync
167a74ad5e6SDavid S. Miller2:	sub		%o4, 8, %o4
168a74ad5e6SDavid S. Miller	brgez,pt	%o4, 1b
169a74ad5e6SDavid S. Miller	 nop
170a74ad5e6SDavid S. Miller	retl
171a74ad5e6SDavid S. Miller	 nop
17227137e52SSam Ravnborg
17327137e52SSam Ravnborg__spitfire_flush_tlb_mm_slow:
17427137e52SSam Ravnborg	rdpr		%pstate, %g1
17527137e52SSam Ravnborg	wrpr		%g1, PSTATE_IE, %pstate
17627137e52SSam Ravnborg	stxa		%o0, [%o1] ASI_DMMU
17727137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_DMMU_DEMAP
17827137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_IMMU_DEMAP
17927137e52SSam Ravnborg	flush		%g6
18027137e52SSam Ravnborg	stxa		%g2, [%o1] ASI_DMMU
18127137e52SSam Ravnborg	sethi		%hi(KERNBASE), %o1
18227137e52SSam Ravnborg	flush		%o1
18327137e52SSam Ravnborg	retl
18427137e52SSam Ravnborg	 wrpr		%g1, 0, %pstate
18527137e52SSam Ravnborg
18627137e52SSam Ravnborg/*
18727137e52SSam Ravnborg * The following code flushes one page_size worth.
18827137e52SSam Ravnborg */
18927137e52SSam Ravnborg	.section .kprobes.text, "ax"
19027137e52SSam Ravnborg	.align		32
19127137e52SSam Ravnborg	.globl		__flush_icache_page
19227137e52SSam Ravnborg__flush_icache_page:	/* %o0 = phys_page */
19327137e52SSam Ravnborg	srlx		%o0, PAGE_SHIFT, %o0
194b2d43834SDavid S. Miller	sethi		%hi(PAGE_OFFSET), %g1
19527137e52SSam Ravnborg	sllx		%o0, PAGE_SHIFT, %o0
19627137e52SSam Ravnborg	sethi		%hi(PAGE_SIZE), %g2
197b2d43834SDavid S. Miller	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1
19827137e52SSam Ravnborg	add		%o0, %g1, %o0
19927137e52SSam Ravnborg1:	subcc		%g2, 32, %g2
20027137e52SSam Ravnborg	bne,pt		%icc, 1b
20127137e52SSam Ravnborg	 flush		%o0 + %g2
20227137e52SSam Ravnborg	retl
20327137e52SSam Ravnborg	 nop
20427137e52SSam Ravnborg
20527137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE
20627137e52SSam Ravnborg
20727137e52SSam Ravnborg#if (PAGE_SHIFT != 13)
20827137e52SSam Ravnborg#error only page shift of 13 is supported by dcache flush
20927137e52SSam Ravnborg#endif
21027137e52SSam Ravnborg
21127137e52SSam Ravnborg#define DTAG_MASK 0x3
21227137e52SSam Ravnborg
21327137e52SSam Ravnborg	/* This routine is Spitfire specific so the hardcoded
21427137e52SSam Ravnborg	 * D-cache size and line-size are OK.
21527137e52SSam Ravnborg	 */
21627137e52SSam Ravnborg	.align		64
21727137e52SSam Ravnborg	.globl		__flush_dcache_page
21827137e52SSam Ravnborg__flush_dcache_page:	/* %o0=kaddr, %o1=flush_icache */
219b2d43834SDavid S. Miller	sethi		%hi(PAGE_OFFSET), %g1
220b2d43834SDavid S. Miller	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1
22127137e52SSam Ravnborg	sub		%o0, %g1, %o0			! physical address
22227137e52SSam Ravnborg	srlx		%o0, 11, %o0			! make D-cache TAG
22327137e52SSam Ravnborg	sethi		%hi(1 << 14), %o2		! D-cache size
22427137e52SSam Ravnborg	sub		%o2, (1 << 5), %o2		! D-cache line size
22527137e52SSam Ravnborg1:	ldxa		[%o2] ASI_DCACHE_TAG, %o3	! load D-cache TAG
22627137e52SSam Ravnborg	andcc		%o3, DTAG_MASK, %g0		! Valid?
22727137e52SSam Ravnborg	be,pn		%xcc, 2f			! Nope, branch
22827137e52SSam Ravnborg	 andn		%o3, DTAG_MASK, %o3		! Clear valid bits
22927137e52SSam Ravnborg	cmp		%o3, %o0			! TAG match?
23027137e52SSam Ravnborg	bne,pt		%xcc, 2f			! Nope, branch
23127137e52SSam Ravnborg	 nop
23227137e52SSam Ravnborg	stxa		%g0, [%o2] ASI_DCACHE_TAG	! Invalidate TAG
23327137e52SSam Ravnborg	membar		#Sync
23427137e52SSam Ravnborg2:	brnz,pt		%o2, 1b
23527137e52SSam Ravnborg	 sub		%o2, (1 << 5), %o2		! D-cache line size
23627137e52SSam Ravnborg
23727137e52SSam Ravnborg	/* The I-cache does not snoop local stores so we
23827137e52SSam Ravnborg	 * better flush that too when necessary.
23927137e52SSam Ravnborg	 */
24027137e52SSam Ravnborg	brnz,pt		%o1, __flush_icache_page
24127137e52SSam Ravnborg	 sllx		%o0, 11, %o0
24227137e52SSam Ravnborg	retl
24327137e52SSam Ravnborg	 nop
24427137e52SSam Ravnborg
24527137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */
24627137e52SSam Ravnborg
24727137e52SSam Ravnborg	.previous
24827137e52SSam Ravnborg
24927137e52SSam Ravnborg	/* Cheetah specific versions, patched at boot time. */
25027137e52SSam Ravnborg__cheetah_flush_tlb_mm: /* 19 insns */
25127137e52SSam Ravnborg	rdpr		%pstate, %g7
25227137e52SSam Ravnborg	andn		%g7, PSTATE_IE, %g2
25327137e52SSam Ravnborg	wrpr		%g2, 0x0, %pstate
25427137e52SSam Ravnborg	wrpr		%g0, 1, %tl
25527137e52SSam Ravnborg	mov		PRIMARY_CONTEXT, %o2
25627137e52SSam Ravnborg	mov		0x40, %g3
25727137e52SSam Ravnborg	ldxa		[%o2] ASI_DMMU, %g2
25827137e52SSam Ravnborg	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %o1
25927137e52SSam Ravnborg	sllx		%o1, CTX_PGSZ1_NUC_SHIFT, %o1
26027137e52SSam Ravnborg	or		%o0, %o1, %o0	/* Preserve nucleus page size fields */
26127137e52SSam Ravnborg	stxa		%o0, [%o2] ASI_DMMU
26227137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_DMMU_DEMAP
26327137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_IMMU_DEMAP
26427137e52SSam Ravnborg	stxa		%g2, [%o2] ASI_DMMU
26527137e52SSam Ravnborg	sethi		%hi(KERNBASE), %o2
26627137e52SSam Ravnborg	flush		%o2
26727137e52SSam Ravnborg	wrpr		%g0, 0, %tl
26827137e52SSam Ravnborg	retl
26927137e52SSam Ravnborg	 wrpr		%g7, 0x0, %pstate
27027137e52SSam Ravnborg
271f36391d2SDavid S. Miller__cheetah_flush_tlb_page:	/* 22 insns */
272f36391d2SDavid S. Miller	/* %o0 = context, %o1 = vaddr */
273f36391d2SDavid S. Miller	rdpr		%pstate, %g7
274f36391d2SDavid S. Miller	andn		%g7, PSTATE_IE, %g2
275f36391d2SDavid S. Miller	wrpr		%g2, 0x0, %pstate
276f36391d2SDavid S. Miller	wrpr		%g0, 1, %tl
277f36391d2SDavid S. Miller	mov		PRIMARY_CONTEXT, %o4
278f36391d2SDavid S. Miller	ldxa		[%o4] ASI_DMMU, %g2
279f36391d2SDavid S. Miller	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %o3
280f36391d2SDavid S. Miller	sllx		%o3, CTX_PGSZ1_NUC_SHIFT, %o3
281f36391d2SDavid S. Miller	or		%o0, %o3, %o0	/* Preserve nucleus page size fields */
282f36391d2SDavid S. Miller	stxa		%o0, [%o4] ASI_DMMU
283f36391d2SDavid S. Miller	andcc		%o1, 1, %g0
284f36391d2SDavid S. Miller	be,pn		%icc, 1f
285f36391d2SDavid S. Miller	 andn		%o1, 1, %o3
286f36391d2SDavid S. Miller	stxa		%g0, [%o3] ASI_IMMU_DEMAP
287f36391d2SDavid S. Miller1:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
288f36391d2SDavid S. Miller	membar		#Sync
289f36391d2SDavid S. Miller	stxa		%g2, [%o4] ASI_DMMU
290f36391d2SDavid S. Miller	sethi		%hi(KERNBASE), %o4
291f36391d2SDavid S. Miller	flush		%o4
292f36391d2SDavid S. Miller	wrpr		%g0, 0, %tl
293f36391d2SDavid S. Miller	retl
294f36391d2SDavid S. Miller	 wrpr		%g7, 0x0, %pstate
295f36391d2SDavid S. Miller
29627137e52SSam Ravnborg__cheetah_flush_tlb_pending:	/* 27 insns */
29727137e52SSam Ravnborg	/* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
29827137e52SSam Ravnborg	rdpr		%pstate, %g7
29927137e52SSam Ravnborg	sllx		%o1, 3, %o1
30027137e52SSam Ravnborg	andn		%g7, PSTATE_IE, %g2
30127137e52SSam Ravnborg	wrpr		%g2, 0x0, %pstate
30227137e52SSam Ravnborg	wrpr		%g0, 1, %tl
30327137e52SSam Ravnborg	mov		PRIMARY_CONTEXT, %o4
30427137e52SSam Ravnborg	ldxa		[%o4] ASI_DMMU, %g2
30527137e52SSam Ravnborg	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %o3
30627137e52SSam Ravnborg	sllx		%o3, CTX_PGSZ1_NUC_SHIFT, %o3
30727137e52SSam Ravnborg	or		%o0, %o3, %o0	/* Preserve nucleus page size fields */
30827137e52SSam Ravnborg	stxa		%o0, [%o4] ASI_DMMU
30927137e52SSam Ravnborg1:	sub		%o1, (1 << 3), %o1
31027137e52SSam Ravnborg	ldx		[%o2 + %o1], %o3
31127137e52SSam Ravnborg	andcc		%o3, 1, %g0
31227137e52SSam Ravnborg	be,pn		%icc, 2f
31327137e52SSam Ravnborg	 andn		%o3, 1, %o3
31427137e52SSam Ravnborg	stxa		%g0, [%o3] ASI_IMMU_DEMAP
31527137e52SSam Ravnborg2:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
31627137e52SSam Ravnborg	membar		#Sync
31727137e52SSam Ravnborg	brnz,pt		%o1, 1b
31827137e52SSam Ravnborg	 nop
31927137e52SSam Ravnborg	stxa		%g2, [%o4] ASI_DMMU
32027137e52SSam Ravnborg	sethi		%hi(KERNBASE), %o4
32127137e52SSam Ravnborg	flush		%o4
32227137e52SSam Ravnborg	wrpr		%g0, 0, %tl
32327137e52SSam Ravnborg	retl
32427137e52SSam Ravnborg	 wrpr		%g7, 0x0, %pstate
32527137e52SSam Ravnborg
326a74ad5e6SDavid S. Miller__cheetah_flush_tlb_kernel_range:	/* 31 insns */
327a74ad5e6SDavid S. Miller	/* %o0=start, %o1=end */
328a74ad5e6SDavid S. Miller	cmp		%o0, %o1
329a74ad5e6SDavid S. Miller	be,pn		%xcc, 2f
330a74ad5e6SDavid S. Miller	 sub		%o1, %o0, %o3
331a74ad5e6SDavid S. Miller	srlx		%o3, 18, %o4
332a74ad5e6SDavid S. Miller	brnz,pn		%o4, 3f
333a74ad5e6SDavid S. Miller	 sethi		%hi(PAGE_SIZE), %o4
334a74ad5e6SDavid S. Miller	sub		%o3, %o4, %o3
335a74ad5e6SDavid S. Miller	or		%o0, 0x20, %o0		! Nucleus
336a74ad5e6SDavid S. Miller1:	stxa		%g0, [%o0 + %o3] ASI_DMMU_DEMAP
337a74ad5e6SDavid S. Miller	stxa		%g0, [%o0 + %o3] ASI_IMMU_DEMAP
338a74ad5e6SDavid S. Miller	membar		#Sync
339a74ad5e6SDavid S. Miller	brnz,pt		%o3, 1b
340a74ad5e6SDavid S. Miller	 sub		%o3, %o4, %o3
341a74ad5e6SDavid S. Miller2:	sethi		%hi(KERNBASE), %o3
342a74ad5e6SDavid S. Miller	flush		%o3
343a74ad5e6SDavid S. Miller	retl
344a74ad5e6SDavid S. Miller	 nop
345a74ad5e6SDavid S. Miller3:	mov		0x80, %o4
346a74ad5e6SDavid S. Miller	stxa		%g0, [%o4] ASI_DMMU_DEMAP
347a74ad5e6SDavid S. Miller	membar		#Sync
348a74ad5e6SDavid S. Miller	stxa		%g0, [%o4] ASI_IMMU_DEMAP
349a74ad5e6SDavid S. Miller	membar		#Sync
350a74ad5e6SDavid S. Miller	retl
351a74ad5e6SDavid S. Miller	 nop
352a74ad5e6SDavid S. Miller	nop
353a74ad5e6SDavid S. Miller	nop
354a74ad5e6SDavid S. Miller	nop
355a74ad5e6SDavid S. Miller	nop
356a74ad5e6SDavid S. Miller	nop
357a74ad5e6SDavid S. Miller	nop
358a74ad5e6SDavid S. Miller	nop
359a74ad5e6SDavid S. Miller
36027137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE
36127137e52SSam Ravnborg__cheetah_flush_dcache_page: /* 11 insns */
362b2d43834SDavid S. Miller	sethi		%hi(PAGE_OFFSET), %g1
363b2d43834SDavid S. Miller	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1
36427137e52SSam Ravnborg	sub		%o0, %g1, %o0
36527137e52SSam Ravnborg	sethi		%hi(PAGE_SIZE), %o4
36627137e52SSam Ravnborg1:	subcc		%o4, (1 << 5), %o4
36727137e52SSam Ravnborg	stxa		%g0, [%o0 + %o4] ASI_DCACHE_INVALIDATE
36827137e52SSam Ravnborg	membar		#Sync
36927137e52SSam Ravnborg	bne,pt		%icc, 1b
37027137e52SSam Ravnborg	 nop
37127137e52SSam Ravnborg	retl		/* I-cache flush never needed on Cheetah, see callers. */
37227137e52SSam Ravnborg	 nop
37327137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */
37427137e52SSam Ravnborg
37527137e52SSam Ravnborg	/* Hypervisor specific versions, patched at boot time.  */
37627137e52SSam Ravnborg__hypervisor_tlb_tl0_error:
37727137e52SSam Ravnborg	save		%sp, -192, %sp
37827137e52SSam Ravnborg	mov		%i0, %o0
37927137e52SSam Ravnborg	call		hypervisor_tlbop_error
38027137e52SSam Ravnborg	 mov		%i1, %o1
38127137e52SSam Ravnborg	ret
38227137e52SSam Ravnborg	 restore
38327137e52SSam Ravnborg
384b429ae4dSDavid S. Miller__hypervisor_flush_tlb_mm: /* 19 insns */
38527137e52SSam Ravnborg	mov		%o0, %o2	/* ARG2: mmu context */
38627137e52SSam Ravnborg	mov		0, %o0		/* ARG0: CPU lists unimplemented */
38727137e52SSam Ravnborg	mov		0, %o1		/* ARG1: CPU lists unimplemented */
38827137e52SSam Ravnborg	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
38927137e52SSam Ravnborg	mov		HV_FAST_MMU_DEMAP_CTX, %o5
39027137e52SSam Ravnborg	ta		HV_FAST_TRAP
391b429ae4dSDavid S. Miller	brnz,pn		%o0, 1f
39227137e52SSam Ravnborg	 mov		HV_FAST_MMU_DEMAP_CTX, %o1
39327137e52SSam Ravnborg	retl
39427137e52SSam Ravnborg	 nop
395b429ae4dSDavid S. Miller1:	sethi		%hi(__hypervisor_tlb_tl0_error), %o5
396b429ae4dSDavid S. Miller	jmpl		%o5 + %lo(__hypervisor_tlb_tl0_error), %g0
397b429ae4dSDavid S. Miller	 nop
398b429ae4dSDavid S. Miller	nop
399b429ae4dSDavid S. Miller	nop
400b429ae4dSDavid S. Miller	nop
401b429ae4dSDavid S. Miller	nop
402b429ae4dSDavid S. Miller	nop
403b429ae4dSDavid S. Miller	nop
40427137e52SSam Ravnborg
405b429ae4dSDavid S. Miller__hypervisor_flush_tlb_page: /* 22 insns */
406f36391d2SDavid S. Miller	/* %o0 = context, %o1 = vaddr */
407f36391d2SDavid S. Miller	mov		%o0, %g2
408f36391d2SDavid S. Miller	mov		%o1, %o0              /* ARG0: vaddr + IMMU-bit */
409f36391d2SDavid S. Miller	mov		%g2, %o1	      /* ARG1: mmu context */
410f36391d2SDavid S. Miller	mov		HV_MMU_ALL, %o2	      /* ARG2: flags */
411f36391d2SDavid S. Miller	srlx		%o0, PAGE_SHIFT, %o0
412f36391d2SDavid S. Miller	sllx		%o0, PAGE_SHIFT, %o0
413f36391d2SDavid S. Miller	ta		HV_MMU_UNMAP_ADDR_TRAP
414b429ae4dSDavid S. Miller	brnz,pn		%o0, 1f
415f36391d2SDavid S. Miller	 mov		HV_MMU_UNMAP_ADDR_TRAP, %o1
416f36391d2SDavid S. Miller	retl
417f36391d2SDavid S. Miller	 nop
418b429ae4dSDavid S. Miller1:	sethi		%hi(__hypervisor_tlb_tl0_error), %o2
419b429ae4dSDavid S. Miller	jmpl		%o2 + %lo(__hypervisor_tlb_tl0_error), %g0
420b429ae4dSDavid S. Miller	 nop
421b429ae4dSDavid S. Miller	nop
422b429ae4dSDavid S. Miller	nop
423b429ae4dSDavid S. Miller	nop
424b429ae4dSDavid S. Miller	nop
425b429ae4dSDavid S. Miller	nop
426b429ae4dSDavid S. Miller	nop
427b429ae4dSDavid S. Miller	nop
428b429ae4dSDavid S. Miller	nop
429f36391d2SDavid S. Miller
430830cda3fSDavid S. Miller__hypervisor_flush_tlb_pending: /* 27 insns */
43127137e52SSam Ravnborg	/* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
43227137e52SSam Ravnborg	sllx		%o1, 3, %g1
43327137e52SSam Ravnborg	mov		%o2, %g2
43427137e52SSam Ravnborg	mov		%o0, %g3
43527137e52SSam Ravnborg1:	sub		%g1, (1 << 3), %g1
43627137e52SSam Ravnborg	ldx		[%g2 + %g1], %o0      /* ARG0: vaddr + IMMU-bit */
43727137e52SSam Ravnborg	mov		%g3, %o1	      /* ARG1: mmu context */
43827137e52SSam Ravnborg	mov		HV_MMU_ALL, %o2	      /* ARG2: flags */
43927137e52SSam Ravnborg	srlx		%o0, PAGE_SHIFT, %o0
44027137e52SSam Ravnborg	sllx		%o0, PAGE_SHIFT, %o0
44127137e52SSam Ravnborg	ta		HV_MMU_UNMAP_ADDR_TRAP
442b429ae4dSDavid S. Miller	brnz,pn		%o0, 1f
44327137e52SSam Ravnborg	 mov		HV_MMU_UNMAP_ADDR_TRAP, %o1
44427137e52SSam Ravnborg	brnz,pt		%g1, 1b
44527137e52SSam Ravnborg	 nop
44627137e52SSam Ravnborg	retl
44727137e52SSam Ravnborg	 nop
448b429ae4dSDavid S. Miller1:	sethi		%hi(__hypervisor_tlb_tl0_error), %o2
449b429ae4dSDavid S. Miller	jmpl		%o2 + %lo(__hypervisor_tlb_tl0_error), %g0
450b429ae4dSDavid S. Miller	 nop
451b429ae4dSDavid S. Miller	nop
452b429ae4dSDavid S. Miller	nop
453b429ae4dSDavid S. Miller	nop
454b429ae4dSDavid S. Miller	nop
455b429ae4dSDavid S. Miller	nop
456b429ae4dSDavid S. Miller	nop
457b429ae4dSDavid S. Miller	nop
458b429ae4dSDavid S. Miller	nop
45927137e52SSam Ravnborg
460a74ad5e6SDavid S. Miller__hypervisor_flush_tlb_kernel_range: /* 31 insns */
46127137e52SSam Ravnborg	/* %o0=start, %o1=end */
46227137e52SSam Ravnborg	cmp		%o0, %o1
46327137e52SSam Ravnborg	be,pn		%xcc, 2f
464a74ad5e6SDavid S. Miller	 sub		%o1, %o0, %g2
465a74ad5e6SDavid S. Miller	srlx		%g2, 18, %g3
466a74ad5e6SDavid S. Miller	brnz,pn		%g3, 4f
46727137e52SSam Ravnborg	 mov		%o0, %g1
468a74ad5e6SDavid S. Miller	sethi		%hi(PAGE_SIZE), %g3
46927137e52SSam Ravnborg	sub		%g2, %g3, %g2
47027137e52SSam Ravnborg1:	add		%g1, %g2, %o0	/* ARG0: virtual address */
47127137e52SSam Ravnborg	mov		0, %o1		/* ARG1: mmu context */
47227137e52SSam Ravnborg	mov		HV_MMU_ALL, %o2	/* ARG2: flags */
47327137e52SSam Ravnborg	ta		HV_MMU_UNMAP_ADDR_TRAP
474b429ae4dSDavid S. Miller	brnz,pn		%o0, 3f
47527137e52SSam Ravnborg	 mov		HV_MMU_UNMAP_ADDR_TRAP, %o1
47627137e52SSam Ravnborg	brnz,pt		%g2, 1b
47727137e52SSam Ravnborg	 sub		%g2, %g3, %g2
47827137e52SSam Ravnborg2:	retl
47927137e52SSam Ravnborg	 nop
480b429ae4dSDavid S. Miller3:	sethi		%hi(__hypervisor_tlb_tl0_error), %o2
481b429ae4dSDavid S. Miller	jmpl		%o2 + %lo(__hypervisor_tlb_tl0_error), %g0
482b429ae4dSDavid S. Miller	 nop
483a74ad5e6SDavid S. Miller4:	mov		0, %o0		/* ARG0: CPU lists unimplemented */
484a74ad5e6SDavid S. Miller	mov		0, %o1		/* ARG1: CPU lists unimplemented */
485a74ad5e6SDavid S. Miller	mov		0, %o2		/* ARG2: mmu context == nucleus */
486a74ad5e6SDavid S. Miller	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
487a74ad5e6SDavid S. Miller	mov		HV_FAST_MMU_DEMAP_CTX, %o5
488a74ad5e6SDavid S. Miller	ta		HV_FAST_TRAP
489a74ad5e6SDavid S. Miller	brnz,pn		%o0, 3b
490a74ad5e6SDavid S. Miller	 mov		HV_FAST_MMU_DEMAP_CTX, %o1
491a74ad5e6SDavid S. Miller	retl
492a74ad5e6SDavid S. Miller	 nop
49327137e52SSam Ravnborg
49427137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE
49527137e52SSam Ravnborg	/* XXX Niagara and friends have an 8K cache, so no aliasing is
49627137e52SSam Ravnborg	 * XXX possible, but nothing explicit in the Hypervisor API
49727137e52SSam Ravnborg	 * XXX guarantees this.
49827137e52SSam Ravnborg	 */
49927137e52SSam Ravnborg__hypervisor_flush_dcache_page:	/* 2 insns */
50027137e52SSam Ravnborg	retl
50127137e52SSam Ravnborg	 nop
50227137e52SSam Ravnborg#endif
50327137e52SSam Ravnborg
50427137e52SSam Ravnborgtlb_patch_one:
50527137e52SSam Ravnborg1:	lduw		[%o1], %g1
50627137e52SSam Ravnborg	stw		%g1, [%o0]
50727137e52SSam Ravnborg	flush		%o0
50827137e52SSam Ravnborg	subcc		%o2, 1, %o2
50927137e52SSam Ravnborg	add		%o1, 4, %o1
51027137e52SSam Ravnborg	bne,pt		%icc, 1b
51127137e52SSam Ravnborg	 add		%o0, 4, %o0
51227137e52SSam Ravnborg	retl
51327137e52SSam Ravnborg	 nop
51427137e52SSam Ravnborg
51527137e52SSam Ravnborg#ifdef CONFIG_SMP
51627137e52SSam Ravnborg	/* These are all called by the slaves of a cross call, at
51727137e52SSam Ravnborg	 * trap level 1, with interrupts fully disabled.
51827137e52SSam Ravnborg	 *
51927137e52SSam Ravnborg	 * Register usage:
52027137e52SSam Ravnborg	 *   %g5	mm->context	(all tlb flushes)
52127137e52SSam Ravnborg	 *   %g1	address arg 1	(tlb page and range flushes)
52227137e52SSam Ravnborg	 *   %g7	address arg 2	(tlb range flush only)
52327137e52SSam Ravnborg	 *
52427137e52SSam Ravnborg	 *   %g6	scratch 1
52527137e52SSam Ravnborg	 *   %g2	scratch 2
52627137e52SSam Ravnborg	 *   %g3	scratch 3
52727137e52SSam Ravnborg	 *   %g4	scratch 4
52827137e52SSam Ravnborg	 */
52927137e52SSam Ravnborg	.align		32
53027137e52SSam Ravnborg	.globl		xcall_flush_tlb_mm
531a236441bSDavid S. Millerxcall_flush_tlb_mm:	/* 24 insns */
53227137e52SSam Ravnborg	mov		PRIMARY_CONTEXT, %g2
53327137e52SSam Ravnborg	ldxa		[%g2] ASI_DMMU, %g3
53427137e52SSam Ravnborg	srlx		%g3, CTX_PGSZ1_NUC_SHIFT, %g4
53527137e52SSam Ravnborg	sllx		%g4, CTX_PGSZ1_NUC_SHIFT, %g4
53627137e52SSam Ravnborg	or		%g5, %g4, %g5	/* Preserve nucleus page size fields */
53727137e52SSam Ravnborg	stxa		%g5, [%g2] ASI_DMMU
53827137e52SSam Ravnborg	mov		0x40, %g4
53927137e52SSam Ravnborg	stxa		%g0, [%g4] ASI_DMMU_DEMAP
54027137e52SSam Ravnborg	stxa		%g0, [%g4] ASI_IMMU_DEMAP
54127137e52SSam Ravnborg	stxa		%g3, [%g2] ASI_DMMU
54227137e52SSam Ravnborg	retry
54327137e52SSam Ravnborg	nop
54427137e52SSam Ravnborg	nop
54527137e52SSam Ravnborg	nop
54627137e52SSam Ravnborg	nop
54727137e52SSam Ravnborg	nop
54827137e52SSam Ravnborg	nop
54927137e52SSam Ravnborg	nop
55027137e52SSam Ravnborg	nop
55127137e52SSam Ravnborg	nop
55227137e52SSam Ravnborg	nop
553a236441bSDavid S. Miller	nop
554a236441bSDavid S. Miller	nop
555a236441bSDavid S. Miller	nop
55627137e52SSam Ravnborg
557f36391d2SDavid S. Miller	.globl		xcall_flush_tlb_page
558a236441bSDavid S. Millerxcall_flush_tlb_page:	/* 20 insns */
559f36391d2SDavid S. Miller	/* %g5=context, %g1=vaddr */
56027137e52SSam Ravnborg	mov		PRIMARY_CONTEXT, %g4
56127137e52SSam Ravnborg	ldxa		[%g4] ASI_DMMU, %g2
56227137e52SSam Ravnborg	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %g4
56327137e52SSam Ravnborg	sllx		%g4, CTX_PGSZ1_NUC_SHIFT, %g4
56427137e52SSam Ravnborg	or		%g5, %g4, %g5
56527137e52SSam Ravnborg	mov		PRIMARY_CONTEXT, %g4
56627137e52SSam Ravnborg	stxa		%g5, [%g4] ASI_DMMU
567f36391d2SDavid S. Miller	andcc		%g1, 0x1, %g0
56827137e52SSam Ravnborg	be,pn		%icc, 2f
569f36391d2SDavid S. Miller	 andn		%g1, 0x1, %g5
57027137e52SSam Ravnborg	stxa		%g0, [%g5] ASI_IMMU_DEMAP
57127137e52SSam Ravnborg2:	stxa		%g0, [%g5] ASI_DMMU_DEMAP
57227137e52SSam Ravnborg	membar		#Sync
57327137e52SSam Ravnborg	stxa		%g2, [%g4] ASI_DMMU
57427137e52SSam Ravnborg	retry
57527137e52SSam Ravnborg	nop
576f36391d2SDavid S. Miller	nop
577a236441bSDavid S. Miller	nop
578a236441bSDavid S. Miller	nop
579a236441bSDavid S. Miller	nop
58027137e52SSam Ravnborg
58127137e52SSam Ravnborg	.globl		xcall_flush_tlb_kernel_range
582a74ad5e6SDavid S. Millerxcall_flush_tlb_kernel_range:	/* 44 insns */
58327137e52SSam Ravnborg	sethi		%hi(PAGE_SIZE - 1), %g2
58427137e52SSam Ravnborg	or		%g2, %lo(PAGE_SIZE - 1), %g2
58527137e52SSam Ravnborg	andn		%g1, %g2, %g1
58627137e52SSam Ravnborg	andn		%g7, %g2, %g7
58727137e52SSam Ravnborg	sub		%g7, %g1, %g3
588a74ad5e6SDavid S. Miller	srlx		%g3, 18, %g2
589a74ad5e6SDavid S. Miller	brnz,pn		%g2, 2f
590d3c976c1SJames Clarke	 sethi		%hi(PAGE_SIZE), %g2
59127137e52SSam Ravnborg	sub		%g3, %g2, %g3
59227137e52SSam Ravnborg	or		%g1, 0x20, %g1		! Nucleus
59327137e52SSam Ravnborg1:	stxa		%g0, [%g1 + %g3] ASI_DMMU_DEMAP
59427137e52SSam Ravnborg	stxa		%g0, [%g1 + %g3] ASI_IMMU_DEMAP
59527137e52SSam Ravnborg	membar		#Sync
59627137e52SSam Ravnborg	brnz,pt		%g3, 1b
59727137e52SSam Ravnborg	 sub		%g3, %g2, %g3
59827137e52SSam Ravnborg	retry
599a74ad5e6SDavid S. Miller2:	mov		63 * 8, %g1
600a74ad5e6SDavid S. Miller1:	ldxa		[%g1] ASI_ITLB_DATA_ACCESS, %g2
601a74ad5e6SDavid S. Miller	andcc		%g2, 0x40, %g0			/* _PAGE_L_4U */
602a74ad5e6SDavid S. Miller	bne,pn		%xcc, 2f
603a74ad5e6SDavid S. Miller	 mov		TLB_TAG_ACCESS, %g2
604a74ad5e6SDavid S. Miller	stxa		%g0, [%g2] ASI_IMMU
605a74ad5e6SDavid S. Miller	stxa		%g0, [%g1] ASI_ITLB_DATA_ACCESS
606a74ad5e6SDavid S. Miller	membar		#Sync
607a74ad5e6SDavid S. Miller2:	ldxa		[%g1] ASI_DTLB_DATA_ACCESS, %g2
608a74ad5e6SDavid S. Miller	andcc		%g2, 0x40, %g0
609a74ad5e6SDavid S. Miller	bne,pn		%xcc, 2f
610a74ad5e6SDavid S. Miller	 mov		TLB_TAG_ACCESS, %g2
611a74ad5e6SDavid S. Miller	stxa		%g0, [%g2] ASI_DMMU
612a74ad5e6SDavid S. Miller	stxa		%g0, [%g1] ASI_DTLB_DATA_ACCESS
613a74ad5e6SDavid S. Miller	membar		#Sync
614a74ad5e6SDavid S. Miller2:	sub		%g1, 8, %g1
615a74ad5e6SDavid S. Miller	brgez,pt	%g1, 1b
61627137e52SSam Ravnborg	 nop
617a74ad5e6SDavid S. Miller	retry
61827137e52SSam Ravnborg	nop
61927137e52SSam Ravnborg	nop
62027137e52SSam Ravnborg	nop
62127137e52SSam Ravnborg	nop
62227137e52SSam Ravnborg	nop
62327137e52SSam Ravnborg	nop
624a236441bSDavid S. Miller	nop
625a236441bSDavid S. Miller	nop
626a236441bSDavid S. Miller	nop
62727137e52SSam Ravnborg
62827137e52SSam Ravnborg	/* This runs in a very controlled environment, so we do
62927137e52SSam Ravnborg	 * not need to worry about BH races etc.
63027137e52SSam Ravnborg	 */
63127137e52SSam Ravnborg	.globl		xcall_sync_tick
63227137e52SSam Ravnborgxcall_sync_tick:
63327137e52SSam Ravnborg
63427137e52SSam Ravnborg661:	rdpr		%pstate, %g2
63527137e52SSam Ravnborg	wrpr		%g2, PSTATE_IG | PSTATE_AG, %pstate
63627137e52SSam Ravnborg	.section	.sun4v_2insn_patch, "ax"
63727137e52SSam Ravnborg	.word		661b
63827137e52SSam Ravnborg	nop
63927137e52SSam Ravnborg	nop
64027137e52SSam Ravnborg	.previous
64127137e52SSam Ravnborg
64227137e52SSam Ravnborg	rdpr		%pil, %g2
643b4f4372fSDavid S. Miller	wrpr		%g0, PIL_NORMAL_MAX, %pil
64427137e52SSam Ravnborg	sethi		%hi(109f), %g7
64527137e52SSam Ravnborg	b,pt		%xcc, etrap_irq
64627137e52SSam Ravnborg109:	 or		%g7, %lo(109b), %g7
64727137e52SSam Ravnborg#ifdef CONFIG_TRACE_IRQFLAGS
64827137e52SSam Ravnborg	call		trace_hardirqs_off
64927137e52SSam Ravnborg	 nop
65027137e52SSam Ravnborg#endif
65127137e52SSam Ravnborg	call		smp_synchronize_tick_client
65227137e52SSam Ravnborg	 nop
65327137e52SSam Ravnborg	b		rtrap_xcall
65427137e52SSam Ravnborg	 ldx		[%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
65527137e52SSam Ravnborg
65627137e52SSam Ravnborg	.globl		xcall_fetch_glob_regs
65727137e52SSam Ravnborgxcall_fetch_glob_regs:
658916ca14aSDavid S. Miller	sethi		%hi(global_cpu_snapshot), %g1
659916ca14aSDavid S. Miller	or		%g1, %lo(global_cpu_snapshot), %g1
66027137e52SSam Ravnborg	__GET_CPUID(%g2)
66127137e52SSam Ravnborg	sllx		%g2, 6, %g3
66227137e52SSam Ravnborg	add		%g1, %g3, %g1
66327137e52SSam Ravnborg	rdpr		%tstate, %g7
66427137e52SSam Ravnborg	stx		%g7, [%g1 + GR_SNAP_TSTATE]
66527137e52SSam Ravnborg	rdpr		%tpc, %g7
66627137e52SSam Ravnborg	stx		%g7, [%g1 + GR_SNAP_TPC]
66727137e52SSam Ravnborg	rdpr		%tnpc, %g7
66827137e52SSam Ravnborg	stx		%g7, [%g1 + GR_SNAP_TNPC]
66927137e52SSam Ravnborg	stx		%o7, [%g1 + GR_SNAP_O7]
67027137e52SSam Ravnborg	stx		%i7, [%g1 + GR_SNAP_I7]
67127137e52SSam Ravnborg	/* Don't try this at home kids... */
672a5a737e0SDavid S. Miller	rdpr		%cwp, %g3
673a5a737e0SDavid S. Miller	sub		%g3, 1, %g7
67427137e52SSam Ravnborg	wrpr		%g7, %cwp
67527137e52SSam Ravnborg	mov		%i7, %g7
676a5a737e0SDavid S. Miller	wrpr		%g3, %cwp
67727137e52SSam Ravnborg	stx		%g7, [%g1 + GR_SNAP_RPC]
67827137e52SSam Ravnborg	sethi		%hi(trap_block), %g7
67927137e52SSam Ravnborg	or		%g7, %lo(trap_block), %g7
68027137e52SSam Ravnborg	sllx		%g2, TRAP_BLOCK_SZ_SHIFT, %g2
68127137e52SSam Ravnborg	add		%g7, %g2, %g7
68227137e52SSam Ravnborg	ldx		[%g7 + TRAP_PER_CPU_THREAD], %g3
68327137e52SSam Ravnborg	stx		%g3, [%g1 + GR_SNAP_THREAD]
68427137e52SSam Ravnborg	retry
68527137e52SSam Ravnborg
686916ca14aSDavid S. Miller	.globl		xcall_fetch_glob_pmu
687916ca14aSDavid S. Millerxcall_fetch_glob_pmu:
688916ca14aSDavid S. Miller	sethi		%hi(global_cpu_snapshot), %g1
689916ca14aSDavid S. Miller	or		%g1, %lo(global_cpu_snapshot), %g1
690916ca14aSDavid S. Miller	__GET_CPUID(%g2)
691916ca14aSDavid S. Miller	sllx		%g2, 6, %g3
692916ca14aSDavid S. Miller	add		%g1, %g3, %g1
693916ca14aSDavid S. Miller	rd		%pic, %g7
694916ca14aSDavid S. Miller	stx		%g7, [%g1 + (4 * 8)]
695916ca14aSDavid S. Miller	rd		%pcr, %g7
696916ca14aSDavid S. Miller	stx		%g7, [%g1 + (0 * 8)]
697916ca14aSDavid S. Miller	retry
698916ca14aSDavid S. Miller
699916ca14aSDavid S. Miller	.globl		xcall_fetch_glob_pmu_n4
700916ca14aSDavid S. Millerxcall_fetch_glob_pmu_n4:
701916ca14aSDavid S. Miller	sethi		%hi(global_cpu_snapshot), %g1
702916ca14aSDavid S. Miller	or		%g1, %lo(global_cpu_snapshot), %g1
703916ca14aSDavid S. Miller	__GET_CPUID(%g2)
704916ca14aSDavid S. Miller	sllx		%g2, 6, %g3
705916ca14aSDavid S. Miller	add		%g1, %g3, %g1
706916ca14aSDavid S. Miller
707916ca14aSDavid S. Miller	ldxa		[%g0] ASI_PIC, %g7
708916ca14aSDavid S. Miller	stx		%g7, [%g1 + (4 * 8)]
709916ca14aSDavid S. Miller	mov		0x08, %g3
710916ca14aSDavid S. Miller	ldxa		[%g3] ASI_PIC, %g7
711916ca14aSDavid S. Miller	stx		%g7, [%g1 + (5 * 8)]
712916ca14aSDavid S. Miller	mov		0x10, %g3
713916ca14aSDavid S. Miller	ldxa		[%g3] ASI_PIC, %g7
714916ca14aSDavid S. Miller	stx		%g7, [%g1 + (6 * 8)]
715916ca14aSDavid S. Miller	mov		0x18, %g3
716916ca14aSDavid S. Miller	ldxa		[%g3] ASI_PIC, %g7
717916ca14aSDavid S. Miller	stx		%g7, [%g1 + (7 * 8)]
718916ca14aSDavid S. Miller
719916ca14aSDavid S. Miller	mov		%o0, %g2
720916ca14aSDavid S. Miller	mov		%o1, %g3
721916ca14aSDavid S. Miller	mov		%o5, %g7
722916ca14aSDavid S. Miller
723916ca14aSDavid S. Miller	mov		HV_FAST_VT_GET_PERFREG, %o5
724916ca14aSDavid S. Miller	mov		3, %o0
725916ca14aSDavid S. Miller	ta		HV_FAST_TRAP
726916ca14aSDavid S. Miller	stx		%o1, [%g1 + (3 * 8)]
727916ca14aSDavid S. Miller	mov		HV_FAST_VT_GET_PERFREG, %o5
728916ca14aSDavid S. Miller	mov		2, %o0
729916ca14aSDavid S. Miller	ta		HV_FAST_TRAP
730916ca14aSDavid S. Miller	stx		%o1, [%g1 + (2 * 8)]
731916ca14aSDavid S. Miller	mov		HV_FAST_VT_GET_PERFREG, %o5
732916ca14aSDavid S. Miller	mov		1, %o0
733916ca14aSDavid S. Miller	ta		HV_FAST_TRAP
734916ca14aSDavid S. Miller	stx		%o1, [%g1 + (1 * 8)]
735916ca14aSDavid S. Miller	mov		HV_FAST_VT_GET_PERFREG, %o5
736916ca14aSDavid S. Miller	mov		0, %o0
737916ca14aSDavid S. Miller	ta		HV_FAST_TRAP
738916ca14aSDavid S. Miller	stx		%o1, [%g1 + (0 * 8)]
739916ca14aSDavid S. Miller
740916ca14aSDavid S. Miller	mov		%g2, %o0
741916ca14aSDavid S. Miller	mov		%g3, %o1
742916ca14aSDavid S. Miller	mov		%g7, %o5
743916ca14aSDavid S. Miller
744916ca14aSDavid S. Miller	retry
745916ca14aSDavid S. Miller
746a74ad5e6SDavid S. Miller__cheetah_xcall_flush_tlb_kernel_range:	/* 44 insns */
747a74ad5e6SDavid S. Miller	sethi		%hi(PAGE_SIZE - 1), %g2
748a74ad5e6SDavid S. Miller	or		%g2, %lo(PAGE_SIZE - 1), %g2
749a74ad5e6SDavid S. Miller	andn		%g1, %g2, %g1
750a74ad5e6SDavid S. Miller	andn		%g7, %g2, %g7
751a74ad5e6SDavid S. Miller	sub		%g7, %g1, %g3
752a74ad5e6SDavid S. Miller	srlx		%g3, 18, %g2
753a74ad5e6SDavid S. Miller	brnz,pn		%g2, 2f
754d3c976c1SJames Clarke	 sethi		%hi(PAGE_SIZE), %g2
755a74ad5e6SDavid S. Miller	sub		%g3, %g2, %g3
756a74ad5e6SDavid S. Miller	or		%g1, 0x20, %g1		! Nucleus
757a74ad5e6SDavid S. Miller1:	stxa		%g0, [%g1 + %g3] ASI_DMMU_DEMAP
758a74ad5e6SDavid S. Miller	stxa		%g0, [%g1 + %g3] ASI_IMMU_DEMAP
759a74ad5e6SDavid S. Miller	membar		#Sync
760a74ad5e6SDavid S. Miller	brnz,pt		%g3, 1b
761a74ad5e6SDavid S. Miller	 sub		%g3, %g2, %g3
762a74ad5e6SDavid S. Miller	retry
763a74ad5e6SDavid S. Miller2:	mov		0x80, %g2
764a74ad5e6SDavid S. Miller	stxa		%g0, [%g2] ASI_DMMU_DEMAP
765a74ad5e6SDavid S. Miller	membar		#Sync
766a74ad5e6SDavid S. Miller	stxa		%g0, [%g2] ASI_IMMU_DEMAP
767a74ad5e6SDavid S. Miller	membar		#Sync
768a74ad5e6SDavid S. Miller	retry
769a74ad5e6SDavid S. Miller	nop
770a74ad5e6SDavid S. Miller	nop
771a74ad5e6SDavid S. Miller	nop
772a74ad5e6SDavid S. Miller	nop
773a74ad5e6SDavid S. Miller	nop
774a74ad5e6SDavid S. Miller	nop
775a74ad5e6SDavid S. Miller	nop
776a74ad5e6SDavid S. Miller	nop
777a74ad5e6SDavid S. Miller	nop
778a74ad5e6SDavid S. Miller	nop
779a74ad5e6SDavid S. Miller	nop
780a74ad5e6SDavid S. Miller	nop
781a74ad5e6SDavid S. Miller	nop
782a74ad5e6SDavid S. Miller	nop
783a74ad5e6SDavid S. Miller	nop
784a74ad5e6SDavid S. Miller	nop
785a74ad5e6SDavid S. Miller	nop
786a74ad5e6SDavid S. Miller	nop
787a74ad5e6SDavid S. Miller	nop
788a74ad5e6SDavid S. Miller	nop
789a74ad5e6SDavid S. Miller	nop
790a74ad5e6SDavid S. Miller	nop
791a74ad5e6SDavid S. Miller
79227137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE
79327137e52SSam Ravnborg	.align		32
79427137e52SSam Ravnborg	.globl		xcall_flush_dcache_page_cheetah
79527137e52SSam Ravnborgxcall_flush_dcache_page_cheetah: /* %g1 == physical page address */
79627137e52SSam Ravnborg	sethi		%hi(PAGE_SIZE), %g3
79727137e52SSam Ravnborg1:	subcc		%g3, (1 << 5), %g3
79827137e52SSam Ravnborg	stxa		%g0, [%g1 + %g3] ASI_DCACHE_INVALIDATE
79927137e52SSam Ravnborg	membar		#Sync
80027137e52SSam Ravnborg	bne,pt		%icc, 1b
80127137e52SSam Ravnborg	 nop
80227137e52SSam Ravnborg	retry
80327137e52SSam Ravnborg	nop
80427137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */
80527137e52SSam Ravnborg
80627137e52SSam Ravnborg	.globl		xcall_flush_dcache_page_spitfire
80727137e52SSam Ravnborgxcall_flush_dcache_page_spitfire: /* %g1 == physical page address
80827137e52SSam Ravnborg				     %g7 == kernel page virtual address
80927137e52SSam Ravnborg				     %g5 == (page->mapping != NULL)  */
81027137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE
81127137e52SSam Ravnborg	srlx		%g1, (13 - 2), %g1	! Form tag comparitor
81227137e52SSam Ravnborg	sethi		%hi(L1DCACHE_SIZE), %g3	! D$ size == 16K
81327137e52SSam Ravnborg	sub		%g3, (1 << 5), %g3	! D$ linesize == 32
81427137e52SSam Ravnborg1:	ldxa		[%g3] ASI_DCACHE_TAG, %g2
81527137e52SSam Ravnborg	andcc		%g2, 0x3, %g0
81627137e52SSam Ravnborg	be,pn		%xcc, 2f
81727137e52SSam Ravnborg	 andn		%g2, 0x3, %g2
81827137e52SSam Ravnborg	cmp		%g2, %g1
81927137e52SSam Ravnborg
82027137e52SSam Ravnborg	bne,pt		%xcc, 2f
82127137e52SSam Ravnborg	 nop
82227137e52SSam Ravnborg	stxa		%g0, [%g3] ASI_DCACHE_TAG
82327137e52SSam Ravnborg	membar		#Sync
82427137e52SSam Ravnborg2:	cmp		%g3, 0
82527137e52SSam Ravnborg	bne,pt		%xcc, 1b
82627137e52SSam Ravnborg	 sub		%g3, (1 << 5), %g3
82727137e52SSam Ravnborg
82827137e52SSam Ravnborg	brz,pn		%g5, 2f
82927137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */
83027137e52SSam Ravnborg	 sethi		%hi(PAGE_SIZE), %g3
83127137e52SSam Ravnborg
83227137e52SSam Ravnborg1:	flush		%g7
83327137e52SSam Ravnborg	subcc		%g3, (1 << 5), %g3
83427137e52SSam Ravnborg	bne,pt		%icc, 1b
83527137e52SSam Ravnborg	 add		%g7, (1 << 5), %g7
83627137e52SSam Ravnborg
83727137e52SSam Ravnborg2:	retry
83827137e52SSam Ravnborg	nop
83927137e52SSam Ravnborg	nop
84027137e52SSam Ravnborg
84127137e52SSam Ravnborg	/* %g5:	error
84227137e52SSam Ravnborg	 * %g6:	tlb op
84327137e52SSam Ravnborg	 */
84427137e52SSam Ravnborg__hypervisor_tlb_xcall_error:
84527137e52SSam Ravnborg	mov	%g5, %g4
84627137e52SSam Ravnborg	mov	%g6, %g5
84727137e52SSam Ravnborg	ba,pt	%xcc, etrap
84827137e52SSam Ravnborg	 rd	%pc, %g7
84927137e52SSam Ravnborg	mov	%l4, %o0
85027137e52SSam Ravnborg	call	hypervisor_tlbop_error_xcall
85127137e52SSam Ravnborg	 mov	%l5, %o1
85227137e52SSam Ravnborg	ba,a,pt	%xcc, rtrap
85327137e52SSam Ravnborg
85427137e52SSam Ravnborg	.globl		__hypervisor_xcall_flush_tlb_mm
855a236441bSDavid S. Miller__hypervisor_xcall_flush_tlb_mm: /* 24 insns */
85627137e52SSam Ravnborg	/* %g5=ctx, g1,g2,g3,g4,g7=scratch, %g6=unusable */
85727137e52SSam Ravnborg	mov		%o0, %g2
85827137e52SSam Ravnborg	mov		%o1, %g3
85927137e52SSam Ravnborg	mov		%o2, %g4
86027137e52SSam Ravnborg	mov		%o3, %g1
86127137e52SSam Ravnborg	mov		%o5, %g7
86227137e52SSam Ravnborg	clr		%o0		/* ARG0: CPU lists unimplemented */
86327137e52SSam Ravnborg	clr		%o1		/* ARG1: CPU lists unimplemented */
86427137e52SSam Ravnborg	mov		%g5, %o2	/* ARG2: mmu context */
86527137e52SSam Ravnborg	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
86627137e52SSam Ravnborg	mov		HV_FAST_MMU_DEMAP_CTX, %o5
86727137e52SSam Ravnborg	ta		HV_FAST_TRAP
86827137e52SSam Ravnborg	mov		HV_FAST_MMU_DEMAP_CTX, %g6
869a236441bSDavid S. Miller	brnz,pn		%o0, 1f
87027137e52SSam Ravnborg	 mov		%o0, %g5
87127137e52SSam Ravnborg	mov		%g2, %o0
87227137e52SSam Ravnborg	mov		%g3, %o1
87327137e52SSam Ravnborg	mov		%g4, %o2
87427137e52SSam Ravnborg	mov		%g1, %o3
87527137e52SSam Ravnborg	mov		%g7, %o5
87627137e52SSam Ravnborg	membar		#Sync
87727137e52SSam Ravnborg	retry
878a236441bSDavid S. Miller1:	sethi		%hi(__hypervisor_tlb_xcall_error), %g4
879a236441bSDavid S. Miller	jmpl		%g4 + %lo(__hypervisor_tlb_xcall_error), %g0
880a236441bSDavid S. Miller	 nop
88127137e52SSam Ravnborg
882f36391d2SDavid S. Miller	.globl		__hypervisor_xcall_flush_tlb_page
883a236441bSDavid S. Miller__hypervisor_xcall_flush_tlb_page: /* 20 insns */
884f36391d2SDavid S. Miller	/* %g5=ctx, %g1=vaddr */
88527137e52SSam Ravnborg	mov		%o0, %g2
88627137e52SSam Ravnborg	mov		%o1, %g3
88727137e52SSam Ravnborg	mov		%o2, %g4
888f36391d2SDavid S. Miller	mov		%g1, %o0	        /* ARG0: virtual address */
88927137e52SSam Ravnborg	mov		%g5, %o1		/* ARG1: mmu context */
89027137e52SSam Ravnborg	mov		HV_MMU_ALL, %o2		/* ARG2: flags */
89127137e52SSam Ravnborg	srlx		%o0, PAGE_SHIFT, %o0
89227137e52SSam Ravnborg	sllx		%o0, PAGE_SHIFT, %o0
89327137e52SSam Ravnborg	ta		HV_MMU_UNMAP_ADDR_TRAP
89427137e52SSam Ravnborg	mov		HV_MMU_UNMAP_ADDR_TRAP, %g6
895a236441bSDavid S. Miller	brnz,a,pn	%o0, 1f
89627137e52SSam Ravnborg	 mov		%o0, %g5
89727137e52SSam Ravnborg	mov		%g2, %o0
89827137e52SSam Ravnborg	mov		%g3, %o1
89927137e52SSam Ravnborg	mov		%g4, %o2
90027137e52SSam Ravnborg	membar		#Sync
90127137e52SSam Ravnborg	retry
902a236441bSDavid S. Miller1:	sethi		%hi(__hypervisor_tlb_xcall_error), %g4
903a236441bSDavid S. Miller	jmpl		%g4 + %lo(__hypervisor_tlb_xcall_error), %g0
904a236441bSDavid S. Miller	 nop
90527137e52SSam Ravnborg
90627137e52SSam Ravnborg	.globl		__hypervisor_xcall_flush_tlb_kernel_range
907a74ad5e6SDavid S. Miller__hypervisor_xcall_flush_tlb_kernel_range: /* 44 insns */
90827137e52SSam Ravnborg	/* %g1=start, %g7=end, g2,g3,g4,g5,g6=scratch */
90927137e52SSam Ravnborg	sethi		%hi(PAGE_SIZE - 1), %g2
91027137e52SSam Ravnborg	or		%g2, %lo(PAGE_SIZE - 1), %g2
91127137e52SSam Ravnborg	andn		%g1, %g2, %g1
91227137e52SSam Ravnborg	andn		%g7, %g2, %g7
91327137e52SSam Ravnborg	sub		%g7, %g1, %g3
914a74ad5e6SDavid S. Miller	srlx		%g3, 18, %g7
91527137e52SSam Ravnborg	add		%g2, 1, %g2
91627137e52SSam Ravnborg	sub		%g3, %g2, %g3
91727137e52SSam Ravnborg	mov		%o0, %g2
91827137e52SSam Ravnborg	mov		%o1, %g4
919a74ad5e6SDavid S. Miller	brnz,pn		%g7, 2f
92027137e52SSam Ravnborg	 mov		%o2, %g7
92127137e52SSam Ravnborg1:	add		%g1, %g3, %o0	/* ARG0: virtual address */
92227137e52SSam Ravnborg	mov		0, %o1		/* ARG1: mmu context */
92327137e52SSam Ravnborg	mov		HV_MMU_ALL, %o2	/* ARG2: flags */
92427137e52SSam Ravnborg	ta		HV_MMU_UNMAP_ADDR_TRAP
92527137e52SSam Ravnborg	mov		HV_MMU_UNMAP_ADDR_TRAP, %g6
926a236441bSDavid S. Miller	brnz,pn		%o0, 1f
92727137e52SSam Ravnborg	 mov		%o0, %g5
92827137e52SSam Ravnborg	sethi		%hi(PAGE_SIZE), %o2
92927137e52SSam Ravnborg	brnz,pt		%g3, 1b
93027137e52SSam Ravnborg	 sub		%g3, %o2, %g3
931a74ad5e6SDavid S. Miller5:	mov		%g2, %o0
93227137e52SSam Ravnborg	mov		%g4, %o1
93327137e52SSam Ravnborg	mov		%g7, %o2
93427137e52SSam Ravnborg	membar		#Sync
93527137e52SSam Ravnborg	retry
936a236441bSDavid S. Miller1:	sethi		%hi(__hypervisor_tlb_xcall_error), %g4
937a236441bSDavid S. Miller	jmpl		%g4 + %lo(__hypervisor_tlb_xcall_error), %g0
938a236441bSDavid S. Miller	 nop
939a74ad5e6SDavid S. Miller2:	mov		%o3, %g1
940a74ad5e6SDavid S. Miller	mov		%o5, %g3
941a74ad5e6SDavid S. Miller	mov		0, %o0		/* ARG0: CPU lists unimplemented */
942a74ad5e6SDavid S. Miller	mov		0, %o1		/* ARG1: CPU lists unimplemented */
943a74ad5e6SDavid S. Miller	mov		0, %o2		/* ARG2: mmu context == nucleus */
944a74ad5e6SDavid S. Miller	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
945a74ad5e6SDavid S. Miller	mov		HV_FAST_MMU_DEMAP_CTX, %o5
946a74ad5e6SDavid S. Miller	ta		HV_FAST_TRAP
947a74ad5e6SDavid S. Miller	mov		%g1, %o3
948a74ad5e6SDavid S. Miller	brz,pt		%o0, 5b
949a74ad5e6SDavid S. Miller	 mov		%g3, %o5
950a74ad5e6SDavid S. Miller	mov		HV_FAST_MMU_DEMAP_CTX, %g6
951a74ad5e6SDavid S. Miller	ba,pt		%xcc, 1b
952a74ad5e6SDavid S. Miller	 clr		%g5
95327137e52SSam Ravnborg
95427137e52SSam Ravnborg	/* These just get rescheduled to PIL vectors. */
95527137e52SSam Ravnborg	.globl		xcall_call_function
95627137e52SSam Ravnborgxcall_call_function:
95727137e52SSam Ravnborg	wr		%g0, (1 << PIL_SMP_CALL_FUNC), %set_softint
95827137e52SSam Ravnborg	retry
95927137e52SSam Ravnborg
96027137e52SSam Ravnborg	.globl		xcall_call_function_single
96127137e52SSam Ravnborgxcall_call_function_single:
96227137e52SSam Ravnborg	wr		%g0, (1 << PIL_SMP_CALL_FUNC_SNGL), %set_softint
96327137e52SSam Ravnborg	retry
96427137e52SSam Ravnborg
96527137e52SSam Ravnborg	.globl		xcall_receive_signal
96627137e52SSam Ravnborgxcall_receive_signal:
96727137e52SSam Ravnborg	wr		%g0, (1 << PIL_SMP_RECEIVE_SIGNAL), %set_softint
96827137e52SSam Ravnborg	retry
96927137e52SSam Ravnborg
97027137e52SSam Ravnborg	.globl		xcall_capture
97127137e52SSam Ravnborgxcall_capture:
97227137e52SSam Ravnborg	wr		%g0, (1 << PIL_SMP_CAPTURE), %set_softint
97327137e52SSam Ravnborg	retry
97427137e52SSam Ravnborg
97527137e52SSam Ravnborg#ifdef CONFIG_KGDB
97627137e52SSam Ravnborg	.globl		xcall_kgdb_capture
97727137e52SSam Ravnborgxcall_kgdb_capture:
97842cc77c8SDavid S. Miller	wr		%g0, (1 << PIL_KGDB_CAPTURE), %set_softint
97942cc77c8SDavid S. Miller	retry
98027137e52SSam Ravnborg#endif
98127137e52SSam Ravnborg
98227137e52SSam Ravnborg#endif /* CONFIG_SMP */
98327137e52SSam Ravnborg
984a74ad5e6SDavid S. Miller	.globl		cheetah_patch_cachetlbops
985a74ad5e6SDavid S. Millercheetah_patch_cachetlbops:
986a74ad5e6SDavid S. Miller	save		%sp, -128, %sp
987a74ad5e6SDavid S. Miller
988a74ad5e6SDavid S. Miller	sethi		%hi(__flush_tlb_mm), %o0
989a74ad5e6SDavid S. Miller	or		%o0, %lo(__flush_tlb_mm), %o0
990a74ad5e6SDavid S. Miller	sethi		%hi(__cheetah_flush_tlb_mm), %o1
991a74ad5e6SDavid S. Miller	or		%o1, %lo(__cheetah_flush_tlb_mm), %o1
992a74ad5e6SDavid S. Miller	call		tlb_patch_one
993a74ad5e6SDavid S. Miller	 mov		19, %o2
994a74ad5e6SDavid S. Miller
995a74ad5e6SDavid S. Miller	sethi		%hi(__flush_tlb_page), %o0
996a74ad5e6SDavid S. Miller	or		%o0, %lo(__flush_tlb_page), %o0
997a74ad5e6SDavid S. Miller	sethi		%hi(__cheetah_flush_tlb_page), %o1
998a74ad5e6SDavid S. Miller	or		%o1, %lo(__cheetah_flush_tlb_page), %o1
999a74ad5e6SDavid S. Miller	call		tlb_patch_one
1000a74ad5e6SDavid S. Miller	 mov		22, %o2
1001a74ad5e6SDavid S. Miller
1002a74ad5e6SDavid S. Miller	sethi		%hi(__flush_tlb_pending), %o0
1003a74ad5e6SDavid S. Miller	or		%o0, %lo(__flush_tlb_pending), %o0
1004a74ad5e6SDavid S. Miller	sethi		%hi(__cheetah_flush_tlb_pending), %o1
1005a74ad5e6SDavid S. Miller	or		%o1, %lo(__cheetah_flush_tlb_pending), %o1
1006a74ad5e6SDavid S. Miller	call		tlb_patch_one
1007a74ad5e6SDavid S. Miller	 mov		27, %o2
1008a74ad5e6SDavid S. Miller
1009a74ad5e6SDavid S. Miller	sethi		%hi(__flush_tlb_kernel_range), %o0
1010a74ad5e6SDavid S. Miller	or		%o0, %lo(__flush_tlb_kernel_range), %o0
1011a74ad5e6SDavid S. Miller	sethi		%hi(__cheetah_flush_tlb_kernel_range), %o1
1012a74ad5e6SDavid S. Miller	or		%o1, %lo(__cheetah_flush_tlb_kernel_range), %o1
1013a74ad5e6SDavid S. Miller	call		tlb_patch_one
1014a74ad5e6SDavid S. Miller	 mov		31, %o2
1015a74ad5e6SDavid S. Miller
1016a74ad5e6SDavid S. Miller#ifdef DCACHE_ALIASING_POSSIBLE
1017a74ad5e6SDavid S. Miller	sethi		%hi(__flush_dcache_page), %o0
1018a74ad5e6SDavid S. Miller	or		%o0, %lo(__flush_dcache_page), %o0
1019a74ad5e6SDavid S. Miller	sethi		%hi(__cheetah_flush_dcache_page), %o1
1020a74ad5e6SDavid S. Miller	or		%o1, %lo(__cheetah_flush_dcache_page), %o1
1021a74ad5e6SDavid S. Miller	call		tlb_patch_one
1022a74ad5e6SDavid S. Miller	 mov		11, %o2
1023a74ad5e6SDavid S. Miller#endif /* DCACHE_ALIASING_POSSIBLE */
1024a74ad5e6SDavid S. Miller
1025a74ad5e6SDavid S. Miller#ifdef CONFIG_SMP
1026a74ad5e6SDavid S. Miller	sethi		%hi(xcall_flush_tlb_kernel_range), %o0
1027a74ad5e6SDavid S. Miller	or		%o0, %lo(xcall_flush_tlb_kernel_range), %o0
1028a74ad5e6SDavid S. Miller	sethi		%hi(__cheetah_xcall_flush_tlb_kernel_range), %o1
1029a74ad5e6SDavid S. Miller	or		%o1, %lo(__cheetah_xcall_flush_tlb_kernel_range), %o1
1030a74ad5e6SDavid S. Miller	call		tlb_patch_one
1031a74ad5e6SDavid S. Miller	 mov		44, %o2
1032a74ad5e6SDavid S. Miller#endif /* CONFIG_SMP */
1033a74ad5e6SDavid S. Miller
1034a74ad5e6SDavid S. Miller	ret
1035a74ad5e6SDavid S. Miller	 restore
103627137e52SSam Ravnborg
103727137e52SSam Ravnborg	.globl		hypervisor_patch_cachetlbops
103827137e52SSam Ravnborghypervisor_patch_cachetlbops:
103927137e52SSam Ravnborg	save		%sp, -128, %sp
104027137e52SSam Ravnborg
104127137e52SSam Ravnborg	sethi		%hi(__flush_tlb_mm), %o0
104227137e52SSam Ravnborg	or		%o0, %lo(__flush_tlb_mm), %o0
104327137e52SSam Ravnborg	sethi		%hi(__hypervisor_flush_tlb_mm), %o1
104427137e52SSam Ravnborg	or		%o1, %lo(__hypervisor_flush_tlb_mm), %o1
104527137e52SSam Ravnborg	call		tlb_patch_one
1046b429ae4dSDavid S. Miller	 mov		19, %o2
104727137e52SSam Ravnborg
1048f36391d2SDavid S. Miller	sethi		%hi(__flush_tlb_page), %o0
1049f36391d2SDavid S. Miller	or		%o0, %lo(__flush_tlb_page), %o0
1050f36391d2SDavid S. Miller	sethi		%hi(__hypervisor_flush_tlb_page), %o1
1051f36391d2SDavid S. Miller	or		%o1, %lo(__hypervisor_flush_tlb_page), %o1
1052f36391d2SDavid S. Miller	call		tlb_patch_one
1053b429ae4dSDavid S. Miller	 mov		22, %o2
1054f36391d2SDavid S. Miller
105527137e52SSam Ravnborg	sethi		%hi(__flush_tlb_pending), %o0
105627137e52SSam Ravnborg	or		%o0, %lo(__flush_tlb_pending), %o0
105727137e52SSam Ravnborg	sethi		%hi(__hypervisor_flush_tlb_pending), %o1
105827137e52SSam Ravnborg	or		%o1, %lo(__hypervisor_flush_tlb_pending), %o1
105927137e52SSam Ravnborg	call		tlb_patch_one
1060b429ae4dSDavid S. Miller	 mov		27, %o2
106127137e52SSam Ravnborg
106227137e52SSam Ravnborg	sethi		%hi(__flush_tlb_kernel_range), %o0
106327137e52SSam Ravnborg	or		%o0, %lo(__flush_tlb_kernel_range), %o0
106427137e52SSam Ravnborg	sethi		%hi(__hypervisor_flush_tlb_kernel_range), %o1
106527137e52SSam Ravnborg	or		%o1, %lo(__hypervisor_flush_tlb_kernel_range), %o1
106627137e52SSam Ravnborg	call		tlb_patch_one
1067a74ad5e6SDavid S. Miller	 mov		31, %o2
106827137e52SSam Ravnborg
106927137e52SSam Ravnborg#ifdef DCACHE_ALIASING_POSSIBLE
107027137e52SSam Ravnborg	sethi		%hi(__flush_dcache_page), %o0
107127137e52SSam Ravnborg	or		%o0, %lo(__flush_dcache_page), %o0
107227137e52SSam Ravnborg	sethi		%hi(__hypervisor_flush_dcache_page), %o1
107327137e52SSam Ravnborg	or		%o1, %lo(__hypervisor_flush_dcache_page), %o1
107427137e52SSam Ravnborg	call		tlb_patch_one
107527137e52SSam Ravnborg	 mov		2, %o2
107627137e52SSam Ravnborg#endif /* DCACHE_ALIASING_POSSIBLE */
107727137e52SSam Ravnborg
107827137e52SSam Ravnborg#ifdef CONFIG_SMP
107927137e52SSam Ravnborg	sethi		%hi(xcall_flush_tlb_mm), %o0
108027137e52SSam Ravnborg	or		%o0, %lo(xcall_flush_tlb_mm), %o0
108127137e52SSam Ravnborg	sethi		%hi(__hypervisor_xcall_flush_tlb_mm), %o1
108227137e52SSam Ravnborg	or		%o1, %lo(__hypervisor_xcall_flush_tlb_mm), %o1
108327137e52SSam Ravnborg	call		tlb_patch_one
1084a236441bSDavid S. Miller	 mov		24, %o2
108527137e52SSam Ravnborg
1086f36391d2SDavid S. Miller	sethi		%hi(xcall_flush_tlb_page), %o0
1087f36391d2SDavid S. Miller	or		%o0, %lo(xcall_flush_tlb_page), %o0
1088f36391d2SDavid S. Miller	sethi		%hi(__hypervisor_xcall_flush_tlb_page), %o1
1089f36391d2SDavid S. Miller	or		%o1, %lo(__hypervisor_xcall_flush_tlb_page), %o1
109027137e52SSam Ravnborg	call		tlb_patch_one
1091a236441bSDavid S. Miller	 mov		20, %o2
109227137e52SSam Ravnborg
109327137e52SSam Ravnborg	sethi		%hi(xcall_flush_tlb_kernel_range), %o0
109427137e52SSam Ravnborg	or		%o0, %lo(xcall_flush_tlb_kernel_range), %o0
109527137e52SSam Ravnborg	sethi		%hi(__hypervisor_xcall_flush_tlb_kernel_range), %o1
109627137e52SSam Ravnborg	or		%o1, %lo(__hypervisor_xcall_flush_tlb_kernel_range), %o1
109727137e52SSam Ravnborg	call		tlb_patch_one
1098a74ad5e6SDavid S. Miller	 mov		44, %o2
109927137e52SSam Ravnborg#endif /* CONFIG_SMP */
110027137e52SSam Ravnborg
110127137e52SSam Ravnborg	ret
110227137e52SSam Ravnborg	 restore
1103