18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * ultra.S: Don't expand these all over the place...
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright (C) 1997, 2000, 2008 David S. Miller (davem@davemloft.net)
68c2ecf20Sopenharmony_ci */
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci#include <linux/pgtable.h>
98c2ecf20Sopenharmony_ci#include <asm/asi.h>
108c2ecf20Sopenharmony_ci#include <asm/page.h>
118c2ecf20Sopenharmony_ci#include <asm/spitfire.h>
128c2ecf20Sopenharmony_ci#include <asm/mmu_context.h>
138c2ecf20Sopenharmony_ci#include <asm/mmu.h>
148c2ecf20Sopenharmony_ci#include <asm/pil.h>
158c2ecf20Sopenharmony_ci#include <asm/head.h>
168c2ecf20Sopenharmony_ci#include <asm/thread_info.h>
178c2ecf20Sopenharmony_ci#include <asm/cacheflush.h>
188c2ecf20Sopenharmony_ci#include <asm/hypervisor.h>
198c2ecf20Sopenharmony_ci#include <asm/cpudata.h>
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	/* Basically, most of the Spitfire vs. Cheetah madness
228c2ecf20Sopenharmony_ci	 * has to do with the fact that Cheetah does not support
238c2ecf20Sopenharmony_ci	 * IMMU flushes out of the secondary context.  Someone needs
248c2ecf20Sopenharmony_ci	 * to throw a south lake birthday party for the folks
258c2ecf20Sopenharmony_ci	 * in Microelectronics who refused to fix this shit.
268c2ecf20Sopenharmony_ci	 */
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_ci	/* This file is meant to be read efficiently by the CPU, not humans.
298c2ecf20Sopenharmony_ci	 * Staraj sie tego nikomu nie pierdolnac...
308c2ecf20Sopenharmony_ci	 */
318c2ecf20Sopenharmony_ci	.text
328c2ecf20Sopenharmony_ci	.align		32
338c2ecf20Sopenharmony_ci	.globl		__flush_tlb_mm
348c2ecf20Sopenharmony_ci__flush_tlb_mm:		/* 19 insns */
358c2ecf20Sopenharmony_ci	/* %o0=(ctx & TAG_CONTEXT_BITS), %o1=SECONDARY_CONTEXT */
368c2ecf20Sopenharmony_ci	ldxa		[%o1] ASI_DMMU, %g2
378c2ecf20Sopenharmony_ci	cmp		%g2, %o0
388c2ecf20Sopenharmony_ci	bne,pn		%icc, __spitfire_flush_tlb_mm_slow
398c2ecf20Sopenharmony_ci	 mov		0x50, %g3
408c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_DMMU_DEMAP
418c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_IMMU_DEMAP
428c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %g3
438c2ecf20Sopenharmony_ci	flush		%g3
448c2ecf20Sopenharmony_ci	retl
458c2ecf20Sopenharmony_ci	 nop
468c2ecf20Sopenharmony_ci	nop
478c2ecf20Sopenharmony_ci	nop
488c2ecf20Sopenharmony_ci	nop
498c2ecf20Sopenharmony_ci	nop
508c2ecf20Sopenharmony_ci	nop
518c2ecf20Sopenharmony_ci	nop
528c2ecf20Sopenharmony_ci	nop
538c2ecf20Sopenharmony_ci	nop
548c2ecf20Sopenharmony_ci	nop
558c2ecf20Sopenharmony_ci
568c2ecf20Sopenharmony_ci	.align		32
578c2ecf20Sopenharmony_ci	.globl		__flush_tlb_page
588c2ecf20Sopenharmony_ci__flush_tlb_page:	/* 22 insns */
598c2ecf20Sopenharmony_ci	/* %o0 = context, %o1 = vaddr */
608c2ecf20Sopenharmony_ci	rdpr		%pstate, %g7
618c2ecf20Sopenharmony_ci	andn		%g7, PSTATE_IE, %g2
628c2ecf20Sopenharmony_ci	wrpr		%g2, %pstate
638c2ecf20Sopenharmony_ci	mov		SECONDARY_CONTEXT, %o4
648c2ecf20Sopenharmony_ci	ldxa		[%o4] ASI_DMMU, %g2
658c2ecf20Sopenharmony_ci	stxa		%o0, [%o4] ASI_DMMU
668c2ecf20Sopenharmony_ci	andcc		%o1, 1, %g0
678c2ecf20Sopenharmony_ci	andn		%o1, 1, %o3
688c2ecf20Sopenharmony_ci	be,pn		%icc, 1f
698c2ecf20Sopenharmony_ci	 or		%o3, 0x10, %o3
708c2ecf20Sopenharmony_ci	stxa		%g0, [%o3] ASI_IMMU_DEMAP
718c2ecf20Sopenharmony_ci1:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
728c2ecf20Sopenharmony_ci	membar		#Sync
738c2ecf20Sopenharmony_ci	stxa		%g2, [%o4] ASI_DMMU
748c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %o4
758c2ecf20Sopenharmony_ci	flush		%o4
768c2ecf20Sopenharmony_ci	retl
778c2ecf20Sopenharmony_ci	 wrpr		%g7, 0x0, %pstate
788c2ecf20Sopenharmony_ci	nop
798c2ecf20Sopenharmony_ci	nop
808c2ecf20Sopenharmony_ci	nop
818c2ecf20Sopenharmony_ci	nop
828c2ecf20Sopenharmony_ci
838c2ecf20Sopenharmony_ci	.align		32
848c2ecf20Sopenharmony_ci	.globl		__flush_tlb_pending
858c2ecf20Sopenharmony_ci__flush_tlb_pending:	/* 27 insns */
868c2ecf20Sopenharmony_ci	/* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
878c2ecf20Sopenharmony_ci	rdpr		%pstate, %g7
888c2ecf20Sopenharmony_ci	sllx		%o1, 3, %o1
898c2ecf20Sopenharmony_ci	andn		%g7, PSTATE_IE, %g2
908c2ecf20Sopenharmony_ci	wrpr		%g2, %pstate
918c2ecf20Sopenharmony_ci	mov		SECONDARY_CONTEXT, %o4
928c2ecf20Sopenharmony_ci	ldxa		[%o4] ASI_DMMU, %g2
938c2ecf20Sopenharmony_ci	stxa		%o0, [%o4] ASI_DMMU
948c2ecf20Sopenharmony_ci1:	sub		%o1, (1 << 3), %o1
958c2ecf20Sopenharmony_ci	ldx		[%o2 + %o1], %o3
968c2ecf20Sopenharmony_ci	andcc		%o3, 1, %g0
978c2ecf20Sopenharmony_ci	andn		%o3, 1, %o3
988c2ecf20Sopenharmony_ci	be,pn		%icc, 2f
998c2ecf20Sopenharmony_ci	 or		%o3, 0x10, %o3
1008c2ecf20Sopenharmony_ci	stxa		%g0, [%o3] ASI_IMMU_DEMAP
1018c2ecf20Sopenharmony_ci2:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
1028c2ecf20Sopenharmony_ci	membar		#Sync
1038c2ecf20Sopenharmony_ci	brnz,pt		%o1, 1b
1048c2ecf20Sopenharmony_ci	 nop
1058c2ecf20Sopenharmony_ci	stxa		%g2, [%o4] ASI_DMMU
1068c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %o4
1078c2ecf20Sopenharmony_ci	flush		%o4
1088c2ecf20Sopenharmony_ci	retl
1098c2ecf20Sopenharmony_ci	 wrpr		%g7, 0x0, %pstate
1108c2ecf20Sopenharmony_ci	nop
1118c2ecf20Sopenharmony_ci	nop
1128c2ecf20Sopenharmony_ci	nop
1138c2ecf20Sopenharmony_ci	nop
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci	.align		32
1168c2ecf20Sopenharmony_ci	.globl		__flush_tlb_kernel_range
1178c2ecf20Sopenharmony_ci__flush_tlb_kernel_range:	/* 31 insns */
1188c2ecf20Sopenharmony_ci	/* %o0=start, %o1=end */
1198c2ecf20Sopenharmony_ci	cmp		%o0, %o1
1208c2ecf20Sopenharmony_ci	be,pn		%xcc, 2f
1218c2ecf20Sopenharmony_ci	 sub		%o1, %o0, %o3
1228c2ecf20Sopenharmony_ci	srlx		%o3, 18, %o4
1238c2ecf20Sopenharmony_ci	brnz,pn		%o4, __spitfire_flush_tlb_kernel_range_slow
1248c2ecf20Sopenharmony_ci	 sethi		%hi(PAGE_SIZE), %o4
1258c2ecf20Sopenharmony_ci	sub		%o3, %o4, %o3
1268c2ecf20Sopenharmony_ci	or		%o0, 0x20, %o0		! Nucleus
1278c2ecf20Sopenharmony_ci1:	stxa		%g0, [%o0 + %o3] ASI_DMMU_DEMAP
1288c2ecf20Sopenharmony_ci	stxa		%g0, [%o0 + %o3] ASI_IMMU_DEMAP
1298c2ecf20Sopenharmony_ci	membar		#Sync
1308c2ecf20Sopenharmony_ci	brnz,pt		%o3, 1b
1318c2ecf20Sopenharmony_ci	 sub		%o3, %o4, %o3
1328c2ecf20Sopenharmony_ci2:	sethi		%hi(KERNBASE), %o3
1338c2ecf20Sopenharmony_ci	flush		%o3
1348c2ecf20Sopenharmony_ci	retl
1358c2ecf20Sopenharmony_ci	 nop
1368c2ecf20Sopenharmony_ci	nop
1378c2ecf20Sopenharmony_ci	nop
1388c2ecf20Sopenharmony_ci	nop
1398c2ecf20Sopenharmony_ci	nop
1408c2ecf20Sopenharmony_ci	nop
1418c2ecf20Sopenharmony_ci	nop
1428c2ecf20Sopenharmony_ci	nop
1438c2ecf20Sopenharmony_ci	nop
1448c2ecf20Sopenharmony_ci	nop
1458c2ecf20Sopenharmony_ci	nop
1468c2ecf20Sopenharmony_ci	nop
1478c2ecf20Sopenharmony_ci	nop
1488c2ecf20Sopenharmony_ci	nop
1498c2ecf20Sopenharmony_ci	nop
1508c2ecf20Sopenharmony_ci
1518c2ecf20Sopenharmony_ci__spitfire_flush_tlb_kernel_range_slow:
1528c2ecf20Sopenharmony_ci	mov		63 * 8, %o4
1538c2ecf20Sopenharmony_ci1:	ldxa		[%o4] ASI_ITLB_DATA_ACCESS, %o3
1548c2ecf20Sopenharmony_ci	andcc		%o3, 0x40, %g0			/* _PAGE_L_4U */
1558c2ecf20Sopenharmony_ci	bne,pn		%xcc, 2f
1568c2ecf20Sopenharmony_ci	 mov		TLB_TAG_ACCESS, %o3
1578c2ecf20Sopenharmony_ci	stxa		%g0, [%o3] ASI_IMMU
1588c2ecf20Sopenharmony_ci	stxa		%g0, [%o4] ASI_ITLB_DATA_ACCESS
1598c2ecf20Sopenharmony_ci	membar		#Sync
1608c2ecf20Sopenharmony_ci2:	ldxa		[%o4] ASI_DTLB_DATA_ACCESS, %o3
1618c2ecf20Sopenharmony_ci	andcc		%o3, 0x40, %g0
1628c2ecf20Sopenharmony_ci	bne,pn		%xcc, 2f
1638c2ecf20Sopenharmony_ci	 mov		TLB_TAG_ACCESS, %o3
1648c2ecf20Sopenharmony_ci	stxa		%g0, [%o3] ASI_DMMU
1658c2ecf20Sopenharmony_ci	stxa		%g0, [%o4] ASI_DTLB_DATA_ACCESS
1668c2ecf20Sopenharmony_ci	membar		#Sync
1678c2ecf20Sopenharmony_ci2:	sub		%o4, 8, %o4
1688c2ecf20Sopenharmony_ci	brgez,pt	%o4, 1b
1698c2ecf20Sopenharmony_ci	 nop
1708c2ecf20Sopenharmony_ci	retl
1718c2ecf20Sopenharmony_ci	 nop
1728c2ecf20Sopenharmony_ci
1738c2ecf20Sopenharmony_ci__spitfire_flush_tlb_mm_slow:
1748c2ecf20Sopenharmony_ci	rdpr		%pstate, %g1
1758c2ecf20Sopenharmony_ci	wrpr		%g1, PSTATE_IE, %pstate
1768c2ecf20Sopenharmony_ci	stxa		%o0, [%o1] ASI_DMMU
1778c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_DMMU_DEMAP
1788c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_IMMU_DEMAP
1798c2ecf20Sopenharmony_ci	flush		%g6
1808c2ecf20Sopenharmony_ci	stxa		%g2, [%o1] ASI_DMMU
1818c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %o1
1828c2ecf20Sopenharmony_ci	flush		%o1
1838c2ecf20Sopenharmony_ci	retl
1848c2ecf20Sopenharmony_ci	 wrpr		%g1, 0, %pstate
1858c2ecf20Sopenharmony_ci
1868c2ecf20Sopenharmony_ci/*
1878c2ecf20Sopenharmony_ci * The following code flushes one page_size worth.
1888c2ecf20Sopenharmony_ci */
1898c2ecf20Sopenharmony_ci	.section .kprobes.text, "ax"
1908c2ecf20Sopenharmony_ci	.align		32
1918c2ecf20Sopenharmony_ci	.globl		__flush_icache_page
1928c2ecf20Sopenharmony_ci__flush_icache_page:	/* %o0 = phys_page */
1938c2ecf20Sopenharmony_ci	srlx		%o0, PAGE_SHIFT, %o0
1948c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_OFFSET), %g1
1958c2ecf20Sopenharmony_ci	sllx		%o0, PAGE_SHIFT, %o0
1968c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE), %g2
1978c2ecf20Sopenharmony_ci	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1
1988c2ecf20Sopenharmony_ci	add		%o0, %g1, %o0
1998c2ecf20Sopenharmony_ci1:	subcc		%g2, 32, %g2
2008c2ecf20Sopenharmony_ci	bne,pt		%icc, 1b
2018c2ecf20Sopenharmony_ci	 flush		%o0 + %g2
2028c2ecf20Sopenharmony_ci	retl
2038c2ecf20Sopenharmony_ci	 nop
2048c2ecf20Sopenharmony_ci
2058c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
2068c2ecf20Sopenharmony_ci
2078c2ecf20Sopenharmony_ci#if (PAGE_SHIFT != 13)
2088c2ecf20Sopenharmony_ci#error only page shift of 13 is supported by dcache flush
2098c2ecf20Sopenharmony_ci#endif
2108c2ecf20Sopenharmony_ci
2118c2ecf20Sopenharmony_ci#define DTAG_MASK 0x3
2128c2ecf20Sopenharmony_ci
2138c2ecf20Sopenharmony_ci	/* This routine is Spitfire specific so the hardcoded
2148c2ecf20Sopenharmony_ci	 * D-cache size and line-size are OK.
2158c2ecf20Sopenharmony_ci	 */
2168c2ecf20Sopenharmony_ci	.align		64
2178c2ecf20Sopenharmony_ci	.globl		__flush_dcache_page
2188c2ecf20Sopenharmony_ci__flush_dcache_page:	/* %o0=kaddr, %o1=flush_icache */
2198c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_OFFSET), %g1
2208c2ecf20Sopenharmony_ci	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1
2218c2ecf20Sopenharmony_ci	sub		%o0, %g1, %o0			! physical address
2228c2ecf20Sopenharmony_ci	srlx		%o0, 11, %o0			! make D-cache TAG
2238c2ecf20Sopenharmony_ci	sethi		%hi(1 << 14), %o2		! D-cache size
2248c2ecf20Sopenharmony_ci	sub		%o2, (1 << 5), %o2		! D-cache line size
2258c2ecf20Sopenharmony_ci1:	ldxa		[%o2] ASI_DCACHE_TAG, %o3	! load D-cache TAG
2268c2ecf20Sopenharmony_ci	andcc		%o3, DTAG_MASK, %g0		! Valid?
2278c2ecf20Sopenharmony_ci	be,pn		%xcc, 2f			! Nope, branch
2288c2ecf20Sopenharmony_ci	 andn		%o3, DTAG_MASK, %o3		! Clear valid bits
2298c2ecf20Sopenharmony_ci	cmp		%o3, %o0			! TAG match?
2308c2ecf20Sopenharmony_ci	bne,pt		%xcc, 2f			! Nope, branch
2318c2ecf20Sopenharmony_ci	 nop
2328c2ecf20Sopenharmony_ci	stxa		%g0, [%o2] ASI_DCACHE_TAG	! Invalidate TAG
2338c2ecf20Sopenharmony_ci	membar		#Sync
2348c2ecf20Sopenharmony_ci2:	brnz,pt		%o2, 1b
2358c2ecf20Sopenharmony_ci	 sub		%o2, (1 << 5), %o2		! D-cache line size
2368c2ecf20Sopenharmony_ci
2378c2ecf20Sopenharmony_ci	/* The I-cache does not snoop local stores so we
2388c2ecf20Sopenharmony_ci	 * better flush that too when necessary.
2398c2ecf20Sopenharmony_ci	 */
2408c2ecf20Sopenharmony_ci	brnz,pt		%o1, __flush_icache_page
2418c2ecf20Sopenharmony_ci	 sllx		%o0, 11, %o0
2428c2ecf20Sopenharmony_ci	retl
2438c2ecf20Sopenharmony_ci	 nop
2448c2ecf20Sopenharmony_ci
2458c2ecf20Sopenharmony_ci#endif /* DCACHE_ALIASING_POSSIBLE */
2468c2ecf20Sopenharmony_ci
2478c2ecf20Sopenharmony_ci	.previous
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci	/* Cheetah specific versions, patched at boot time. */
2508c2ecf20Sopenharmony_ci__cheetah_flush_tlb_mm: /* 19 insns */
2518c2ecf20Sopenharmony_ci	rdpr		%pstate, %g7
2528c2ecf20Sopenharmony_ci	andn		%g7, PSTATE_IE, %g2
2538c2ecf20Sopenharmony_ci	wrpr		%g2, 0x0, %pstate
2548c2ecf20Sopenharmony_ci	wrpr		%g0, 1, %tl
2558c2ecf20Sopenharmony_ci	mov		PRIMARY_CONTEXT, %o2
2568c2ecf20Sopenharmony_ci	mov		0x40, %g3
2578c2ecf20Sopenharmony_ci	ldxa		[%o2] ASI_DMMU, %g2
2588c2ecf20Sopenharmony_ci	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %o1
2598c2ecf20Sopenharmony_ci	sllx		%o1, CTX_PGSZ1_NUC_SHIFT, %o1
2608c2ecf20Sopenharmony_ci	or		%o0, %o1, %o0	/* Preserve nucleus page size fields */
2618c2ecf20Sopenharmony_ci	stxa		%o0, [%o2] ASI_DMMU
2628c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_DMMU_DEMAP
2638c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_IMMU_DEMAP
2648c2ecf20Sopenharmony_ci	stxa		%g2, [%o2] ASI_DMMU
2658c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %o2
2668c2ecf20Sopenharmony_ci	flush		%o2
2678c2ecf20Sopenharmony_ci	wrpr		%g0, 0, %tl
2688c2ecf20Sopenharmony_ci	retl
2698c2ecf20Sopenharmony_ci	 wrpr		%g7, 0x0, %pstate
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ci__cheetah_flush_tlb_page:	/* 22 insns */
2728c2ecf20Sopenharmony_ci	/* %o0 = context, %o1 = vaddr */
2738c2ecf20Sopenharmony_ci	rdpr		%pstate, %g7
2748c2ecf20Sopenharmony_ci	andn		%g7, PSTATE_IE, %g2
2758c2ecf20Sopenharmony_ci	wrpr		%g2, 0x0, %pstate
2768c2ecf20Sopenharmony_ci	wrpr		%g0, 1, %tl
2778c2ecf20Sopenharmony_ci	mov		PRIMARY_CONTEXT, %o4
2788c2ecf20Sopenharmony_ci	ldxa		[%o4] ASI_DMMU, %g2
2798c2ecf20Sopenharmony_ci	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %o3
2808c2ecf20Sopenharmony_ci	sllx		%o3, CTX_PGSZ1_NUC_SHIFT, %o3
2818c2ecf20Sopenharmony_ci	or		%o0, %o3, %o0	/* Preserve nucleus page size fields */
2828c2ecf20Sopenharmony_ci	stxa		%o0, [%o4] ASI_DMMU
2838c2ecf20Sopenharmony_ci	andcc		%o1, 1, %g0
2848c2ecf20Sopenharmony_ci	be,pn		%icc, 1f
2858c2ecf20Sopenharmony_ci	 andn		%o1, 1, %o3
2868c2ecf20Sopenharmony_ci	stxa		%g0, [%o3] ASI_IMMU_DEMAP
2878c2ecf20Sopenharmony_ci1:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
2888c2ecf20Sopenharmony_ci	membar		#Sync
2898c2ecf20Sopenharmony_ci	stxa		%g2, [%o4] ASI_DMMU
2908c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %o4
2918c2ecf20Sopenharmony_ci	flush		%o4
2928c2ecf20Sopenharmony_ci	wrpr		%g0, 0, %tl
2938c2ecf20Sopenharmony_ci	retl
2948c2ecf20Sopenharmony_ci	 wrpr		%g7, 0x0, %pstate
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci__cheetah_flush_tlb_pending:	/* 27 insns */
2978c2ecf20Sopenharmony_ci	/* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
2988c2ecf20Sopenharmony_ci	rdpr		%pstate, %g7
2998c2ecf20Sopenharmony_ci	sllx		%o1, 3, %o1
3008c2ecf20Sopenharmony_ci	andn		%g7, PSTATE_IE, %g2
3018c2ecf20Sopenharmony_ci	wrpr		%g2, 0x0, %pstate
3028c2ecf20Sopenharmony_ci	wrpr		%g0, 1, %tl
3038c2ecf20Sopenharmony_ci	mov		PRIMARY_CONTEXT, %o4
3048c2ecf20Sopenharmony_ci	ldxa		[%o4] ASI_DMMU, %g2
3058c2ecf20Sopenharmony_ci	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %o3
3068c2ecf20Sopenharmony_ci	sllx		%o3, CTX_PGSZ1_NUC_SHIFT, %o3
3078c2ecf20Sopenharmony_ci	or		%o0, %o3, %o0	/* Preserve nucleus page size fields */
3088c2ecf20Sopenharmony_ci	stxa		%o0, [%o4] ASI_DMMU
3098c2ecf20Sopenharmony_ci1:	sub		%o1, (1 << 3), %o1
3108c2ecf20Sopenharmony_ci	ldx		[%o2 + %o1], %o3
3118c2ecf20Sopenharmony_ci	andcc		%o3, 1, %g0
3128c2ecf20Sopenharmony_ci	be,pn		%icc, 2f
3138c2ecf20Sopenharmony_ci	 andn		%o3, 1, %o3
3148c2ecf20Sopenharmony_ci	stxa		%g0, [%o3] ASI_IMMU_DEMAP
3158c2ecf20Sopenharmony_ci2:	stxa		%g0, [%o3] ASI_DMMU_DEMAP
3168c2ecf20Sopenharmony_ci	membar		#Sync
3178c2ecf20Sopenharmony_ci	brnz,pt		%o1, 1b
3188c2ecf20Sopenharmony_ci	 nop
3198c2ecf20Sopenharmony_ci	stxa		%g2, [%o4] ASI_DMMU
3208c2ecf20Sopenharmony_ci	sethi		%hi(KERNBASE), %o4
3218c2ecf20Sopenharmony_ci	flush		%o4
3228c2ecf20Sopenharmony_ci	wrpr		%g0, 0, %tl
3238c2ecf20Sopenharmony_ci	retl
3248c2ecf20Sopenharmony_ci	 wrpr		%g7, 0x0, %pstate
3258c2ecf20Sopenharmony_ci
3268c2ecf20Sopenharmony_ci__cheetah_flush_tlb_kernel_range:	/* 31 insns */
3278c2ecf20Sopenharmony_ci	/* %o0=start, %o1=end */
3288c2ecf20Sopenharmony_ci	cmp		%o0, %o1
3298c2ecf20Sopenharmony_ci	be,pn		%xcc, 2f
3308c2ecf20Sopenharmony_ci	 sub		%o1, %o0, %o3
3318c2ecf20Sopenharmony_ci	srlx		%o3, 18, %o4
3328c2ecf20Sopenharmony_ci	brnz,pn		%o4, 3f
3338c2ecf20Sopenharmony_ci	 sethi		%hi(PAGE_SIZE), %o4
3348c2ecf20Sopenharmony_ci	sub		%o3, %o4, %o3
3358c2ecf20Sopenharmony_ci	or		%o0, 0x20, %o0		! Nucleus
3368c2ecf20Sopenharmony_ci1:	stxa		%g0, [%o0 + %o3] ASI_DMMU_DEMAP
3378c2ecf20Sopenharmony_ci	stxa		%g0, [%o0 + %o3] ASI_IMMU_DEMAP
3388c2ecf20Sopenharmony_ci	membar		#Sync
3398c2ecf20Sopenharmony_ci	brnz,pt		%o3, 1b
3408c2ecf20Sopenharmony_ci	 sub		%o3, %o4, %o3
3418c2ecf20Sopenharmony_ci2:	sethi		%hi(KERNBASE), %o3
3428c2ecf20Sopenharmony_ci	flush		%o3
3438c2ecf20Sopenharmony_ci	retl
3448c2ecf20Sopenharmony_ci	 nop
3458c2ecf20Sopenharmony_ci3:	mov		0x80, %o4
3468c2ecf20Sopenharmony_ci	stxa		%g0, [%o4] ASI_DMMU_DEMAP
3478c2ecf20Sopenharmony_ci	membar		#Sync
3488c2ecf20Sopenharmony_ci	stxa		%g0, [%o4] ASI_IMMU_DEMAP
3498c2ecf20Sopenharmony_ci	membar		#Sync
3508c2ecf20Sopenharmony_ci	retl
3518c2ecf20Sopenharmony_ci	 nop
3528c2ecf20Sopenharmony_ci	nop
3538c2ecf20Sopenharmony_ci	nop
3548c2ecf20Sopenharmony_ci	nop
3558c2ecf20Sopenharmony_ci	nop
3568c2ecf20Sopenharmony_ci	nop
3578c2ecf20Sopenharmony_ci	nop
3588c2ecf20Sopenharmony_ci	nop
3598c2ecf20Sopenharmony_ci
3608c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
3618c2ecf20Sopenharmony_ci__cheetah_flush_dcache_page: /* 11 insns */
3628c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_OFFSET), %g1
3638c2ecf20Sopenharmony_ci	ldx		[%g1 + %lo(PAGE_OFFSET)], %g1
3648c2ecf20Sopenharmony_ci	sub		%o0, %g1, %o0
3658c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE), %o4
3668c2ecf20Sopenharmony_ci1:	subcc		%o4, (1 << 5), %o4
3678c2ecf20Sopenharmony_ci	stxa		%g0, [%o0 + %o4] ASI_DCACHE_INVALIDATE
3688c2ecf20Sopenharmony_ci	membar		#Sync
3698c2ecf20Sopenharmony_ci	bne,pt		%icc, 1b
3708c2ecf20Sopenharmony_ci	 nop
3718c2ecf20Sopenharmony_ci	retl		/* I-cache flush never needed on Cheetah, see callers. */
3728c2ecf20Sopenharmony_ci	 nop
3738c2ecf20Sopenharmony_ci#endif /* DCACHE_ALIASING_POSSIBLE */
3748c2ecf20Sopenharmony_ci
3758c2ecf20Sopenharmony_ci	/* Hypervisor specific versions, patched at boot time.  */
3768c2ecf20Sopenharmony_ci__hypervisor_tlb_tl0_error:
3778c2ecf20Sopenharmony_ci	save		%sp, -192, %sp
3788c2ecf20Sopenharmony_ci	mov		%i0, %o0
3798c2ecf20Sopenharmony_ci	call		hypervisor_tlbop_error
3808c2ecf20Sopenharmony_ci	 mov		%i1, %o1
3818c2ecf20Sopenharmony_ci	ret
3828c2ecf20Sopenharmony_ci	 restore
3838c2ecf20Sopenharmony_ci
3848c2ecf20Sopenharmony_ci__hypervisor_flush_tlb_mm: /* 19 insns */
3858c2ecf20Sopenharmony_ci	mov		%o0, %o2	/* ARG2: mmu context */
3868c2ecf20Sopenharmony_ci	mov		0, %o0		/* ARG0: CPU lists unimplemented */
3878c2ecf20Sopenharmony_ci	mov		0, %o1		/* ARG1: CPU lists unimplemented */
3888c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
3898c2ecf20Sopenharmony_ci	mov		HV_FAST_MMU_DEMAP_CTX, %o5
3908c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
3918c2ecf20Sopenharmony_ci	brnz,pn		%o0, 1f
3928c2ecf20Sopenharmony_ci	 mov		HV_FAST_MMU_DEMAP_CTX, %o1
3938c2ecf20Sopenharmony_ci	retl
3948c2ecf20Sopenharmony_ci	 nop
3958c2ecf20Sopenharmony_ci1:	sethi		%hi(__hypervisor_tlb_tl0_error), %o5
3968c2ecf20Sopenharmony_ci	jmpl		%o5 + %lo(__hypervisor_tlb_tl0_error), %g0
3978c2ecf20Sopenharmony_ci	 nop
3988c2ecf20Sopenharmony_ci	nop
3998c2ecf20Sopenharmony_ci	nop
4008c2ecf20Sopenharmony_ci	nop
4018c2ecf20Sopenharmony_ci	nop
4028c2ecf20Sopenharmony_ci	nop
4038c2ecf20Sopenharmony_ci	nop
4048c2ecf20Sopenharmony_ci
4058c2ecf20Sopenharmony_ci__hypervisor_flush_tlb_page: /* 22 insns */
4068c2ecf20Sopenharmony_ci	/* %o0 = context, %o1 = vaddr */
4078c2ecf20Sopenharmony_ci	mov		%o0, %g2
4088c2ecf20Sopenharmony_ci	mov		%o1, %o0              /* ARG0: vaddr + IMMU-bit */
4098c2ecf20Sopenharmony_ci	mov		%g2, %o1	      /* ARG1: mmu context */
4108c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o2	      /* ARG2: flags */
4118c2ecf20Sopenharmony_ci	srlx		%o0, PAGE_SHIFT, %o0
4128c2ecf20Sopenharmony_ci	sllx		%o0, PAGE_SHIFT, %o0
4138c2ecf20Sopenharmony_ci	ta		HV_MMU_UNMAP_ADDR_TRAP
4148c2ecf20Sopenharmony_ci	brnz,pn		%o0, 1f
4158c2ecf20Sopenharmony_ci	 mov		HV_MMU_UNMAP_ADDR_TRAP, %o1
4168c2ecf20Sopenharmony_ci	retl
4178c2ecf20Sopenharmony_ci	 nop
4188c2ecf20Sopenharmony_ci1:	sethi		%hi(__hypervisor_tlb_tl0_error), %o2
4198c2ecf20Sopenharmony_ci	jmpl		%o2 + %lo(__hypervisor_tlb_tl0_error), %g0
4208c2ecf20Sopenharmony_ci	 nop
4218c2ecf20Sopenharmony_ci	nop
4228c2ecf20Sopenharmony_ci	nop
4238c2ecf20Sopenharmony_ci	nop
4248c2ecf20Sopenharmony_ci	nop
4258c2ecf20Sopenharmony_ci	nop
4268c2ecf20Sopenharmony_ci	nop
4278c2ecf20Sopenharmony_ci	nop
4288c2ecf20Sopenharmony_ci	nop
4298c2ecf20Sopenharmony_ci
4308c2ecf20Sopenharmony_ci__hypervisor_flush_tlb_pending: /* 27 insns */
4318c2ecf20Sopenharmony_ci	/* %o0 = context, %o1 = nr, %o2 = vaddrs[] */
4328c2ecf20Sopenharmony_ci	sllx		%o1, 3, %g1
4338c2ecf20Sopenharmony_ci	mov		%o2, %g2
4348c2ecf20Sopenharmony_ci	mov		%o0, %g3
4358c2ecf20Sopenharmony_ci1:	sub		%g1, (1 << 3), %g1
4368c2ecf20Sopenharmony_ci	ldx		[%g2 + %g1], %o0      /* ARG0: vaddr + IMMU-bit */
4378c2ecf20Sopenharmony_ci	mov		%g3, %o1	      /* ARG1: mmu context */
4388c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o2	      /* ARG2: flags */
4398c2ecf20Sopenharmony_ci	srlx		%o0, PAGE_SHIFT, %o0
4408c2ecf20Sopenharmony_ci	sllx		%o0, PAGE_SHIFT, %o0
4418c2ecf20Sopenharmony_ci	ta		HV_MMU_UNMAP_ADDR_TRAP
4428c2ecf20Sopenharmony_ci	brnz,pn		%o0, 1f
4438c2ecf20Sopenharmony_ci	 mov		HV_MMU_UNMAP_ADDR_TRAP, %o1
4448c2ecf20Sopenharmony_ci	brnz,pt		%g1, 1b
4458c2ecf20Sopenharmony_ci	 nop
4468c2ecf20Sopenharmony_ci	retl
4478c2ecf20Sopenharmony_ci	 nop
4488c2ecf20Sopenharmony_ci1:	sethi		%hi(__hypervisor_tlb_tl0_error), %o2
4498c2ecf20Sopenharmony_ci	jmpl		%o2 + %lo(__hypervisor_tlb_tl0_error), %g0
4508c2ecf20Sopenharmony_ci	 nop
4518c2ecf20Sopenharmony_ci	nop
4528c2ecf20Sopenharmony_ci	nop
4538c2ecf20Sopenharmony_ci	nop
4548c2ecf20Sopenharmony_ci	nop
4558c2ecf20Sopenharmony_ci	nop
4568c2ecf20Sopenharmony_ci	nop
4578c2ecf20Sopenharmony_ci	nop
4588c2ecf20Sopenharmony_ci	nop
4598c2ecf20Sopenharmony_ci
4608c2ecf20Sopenharmony_ci__hypervisor_flush_tlb_kernel_range: /* 31 insns */
4618c2ecf20Sopenharmony_ci	/* %o0=start, %o1=end */
4628c2ecf20Sopenharmony_ci	cmp		%o0, %o1
4638c2ecf20Sopenharmony_ci	be,pn		%xcc, 2f
4648c2ecf20Sopenharmony_ci	 sub		%o1, %o0, %g2
4658c2ecf20Sopenharmony_ci	srlx		%g2, 18, %g3
4668c2ecf20Sopenharmony_ci	brnz,pn		%g3, 4f
4678c2ecf20Sopenharmony_ci	 mov		%o0, %g1
4688c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE), %g3
4698c2ecf20Sopenharmony_ci	sub		%g2, %g3, %g2
4708c2ecf20Sopenharmony_ci1:	add		%g1, %g2, %o0	/* ARG0: virtual address */
4718c2ecf20Sopenharmony_ci	mov		0, %o1		/* ARG1: mmu context */
4728c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o2	/* ARG2: flags */
4738c2ecf20Sopenharmony_ci	ta		HV_MMU_UNMAP_ADDR_TRAP
4748c2ecf20Sopenharmony_ci	brnz,pn		%o0, 3f
4758c2ecf20Sopenharmony_ci	 mov		HV_MMU_UNMAP_ADDR_TRAP, %o1
4768c2ecf20Sopenharmony_ci	brnz,pt		%g2, 1b
4778c2ecf20Sopenharmony_ci	 sub		%g2, %g3, %g2
4788c2ecf20Sopenharmony_ci2:	retl
4798c2ecf20Sopenharmony_ci	 nop
4808c2ecf20Sopenharmony_ci3:	sethi		%hi(__hypervisor_tlb_tl0_error), %o2
4818c2ecf20Sopenharmony_ci	jmpl		%o2 + %lo(__hypervisor_tlb_tl0_error), %g0
4828c2ecf20Sopenharmony_ci	 nop
4838c2ecf20Sopenharmony_ci4:	mov		0, %o0		/* ARG0: CPU lists unimplemented */
4848c2ecf20Sopenharmony_ci	mov		0, %o1		/* ARG1: CPU lists unimplemented */
4858c2ecf20Sopenharmony_ci	mov		0, %o2		/* ARG2: mmu context == nucleus */
4868c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
4878c2ecf20Sopenharmony_ci	mov		HV_FAST_MMU_DEMAP_CTX, %o5
4888c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
4898c2ecf20Sopenharmony_ci	brnz,pn		%o0, 3b
4908c2ecf20Sopenharmony_ci	 mov		HV_FAST_MMU_DEMAP_CTX, %o1
4918c2ecf20Sopenharmony_ci	retl
4928c2ecf20Sopenharmony_ci	 nop
4938c2ecf20Sopenharmony_ci
4948c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
4958c2ecf20Sopenharmony_ci	/* XXX Niagara and friends have an 8K cache, so no aliasing is
4968c2ecf20Sopenharmony_ci	 * XXX possible, but nothing explicit in the Hypervisor API
4978c2ecf20Sopenharmony_ci	 * XXX guarantees this.
4988c2ecf20Sopenharmony_ci	 */
4998c2ecf20Sopenharmony_ci__hypervisor_flush_dcache_page:	/* 2 insns */
5008c2ecf20Sopenharmony_ci	retl
5018c2ecf20Sopenharmony_ci	 nop
5028c2ecf20Sopenharmony_ci#endif
5038c2ecf20Sopenharmony_ci
5048c2ecf20Sopenharmony_citlb_patch_one:
5058c2ecf20Sopenharmony_ci1:	lduw		[%o1], %g1
5068c2ecf20Sopenharmony_ci	stw		%g1, [%o0]
5078c2ecf20Sopenharmony_ci	flush		%o0
5088c2ecf20Sopenharmony_ci	subcc		%o2, 1, %o2
5098c2ecf20Sopenharmony_ci	add		%o1, 4, %o1
5108c2ecf20Sopenharmony_ci	bne,pt		%icc, 1b
5118c2ecf20Sopenharmony_ci	 add		%o0, 4, %o0
5128c2ecf20Sopenharmony_ci	retl
5138c2ecf20Sopenharmony_ci	 nop
5148c2ecf20Sopenharmony_ci
5158c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
5168c2ecf20Sopenharmony_ci	/* These are all called by the slaves of a cross call, at
5178c2ecf20Sopenharmony_ci	 * trap level 1, with interrupts fully disabled.
5188c2ecf20Sopenharmony_ci	 *
5198c2ecf20Sopenharmony_ci	 * Register usage:
5208c2ecf20Sopenharmony_ci	 *   %g5	mm->context	(all tlb flushes)
5218c2ecf20Sopenharmony_ci	 *   %g1	address arg 1	(tlb page and range flushes)
5228c2ecf20Sopenharmony_ci	 *   %g7	address arg 2	(tlb range flush only)
5238c2ecf20Sopenharmony_ci	 *
5248c2ecf20Sopenharmony_ci	 *   %g6	scratch 1
5258c2ecf20Sopenharmony_ci	 *   %g2	scratch 2
5268c2ecf20Sopenharmony_ci	 *   %g3	scratch 3
5278c2ecf20Sopenharmony_ci	 *   %g4	scratch 4
5288c2ecf20Sopenharmony_ci	 */
5298c2ecf20Sopenharmony_ci	.align		32
5308c2ecf20Sopenharmony_ci	.globl		xcall_flush_tlb_mm
5318c2ecf20Sopenharmony_cixcall_flush_tlb_mm:	/* 24 insns */
5328c2ecf20Sopenharmony_ci	mov		PRIMARY_CONTEXT, %g2
5338c2ecf20Sopenharmony_ci	ldxa		[%g2] ASI_DMMU, %g3
5348c2ecf20Sopenharmony_ci	srlx		%g3, CTX_PGSZ1_NUC_SHIFT, %g4
5358c2ecf20Sopenharmony_ci	sllx		%g4, CTX_PGSZ1_NUC_SHIFT, %g4
5368c2ecf20Sopenharmony_ci	or		%g5, %g4, %g5	/* Preserve nucleus page size fields */
5378c2ecf20Sopenharmony_ci	stxa		%g5, [%g2] ASI_DMMU
5388c2ecf20Sopenharmony_ci	mov		0x40, %g4
5398c2ecf20Sopenharmony_ci	stxa		%g0, [%g4] ASI_DMMU_DEMAP
5408c2ecf20Sopenharmony_ci	stxa		%g0, [%g4] ASI_IMMU_DEMAP
5418c2ecf20Sopenharmony_ci	stxa		%g3, [%g2] ASI_DMMU
5428c2ecf20Sopenharmony_ci	retry
5438c2ecf20Sopenharmony_ci	nop
5448c2ecf20Sopenharmony_ci	nop
5458c2ecf20Sopenharmony_ci	nop
5468c2ecf20Sopenharmony_ci	nop
5478c2ecf20Sopenharmony_ci	nop
5488c2ecf20Sopenharmony_ci	nop
5498c2ecf20Sopenharmony_ci	nop
5508c2ecf20Sopenharmony_ci	nop
5518c2ecf20Sopenharmony_ci	nop
5528c2ecf20Sopenharmony_ci	nop
5538c2ecf20Sopenharmony_ci	nop
5548c2ecf20Sopenharmony_ci	nop
5558c2ecf20Sopenharmony_ci	nop
5568c2ecf20Sopenharmony_ci
5578c2ecf20Sopenharmony_ci	.globl		xcall_flush_tlb_page
5588c2ecf20Sopenharmony_cixcall_flush_tlb_page:	/* 20 insns */
5598c2ecf20Sopenharmony_ci	/* %g5=context, %g1=vaddr */
5608c2ecf20Sopenharmony_ci	mov		PRIMARY_CONTEXT, %g4
5618c2ecf20Sopenharmony_ci	ldxa		[%g4] ASI_DMMU, %g2
5628c2ecf20Sopenharmony_ci	srlx		%g2, CTX_PGSZ1_NUC_SHIFT, %g4
5638c2ecf20Sopenharmony_ci	sllx		%g4, CTX_PGSZ1_NUC_SHIFT, %g4
5648c2ecf20Sopenharmony_ci	or		%g5, %g4, %g5
5658c2ecf20Sopenharmony_ci	mov		PRIMARY_CONTEXT, %g4
5668c2ecf20Sopenharmony_ci	stxa		%g5, [%g4] ASI_DMMU
5678c2ecf20Sopenharmony_ci	andcc		%g1, 0x1, %g0
5688c2ecf20Sopenharmony_ci	be,pn		%icc, 2f
5698c2ecf20Sopenharmony_ci	 andn		%g1, 0x1, %g5
5708c2ecf20Sopenharmony_ci	stxa		%g0, [%g5] ASI_IMMU_DEMAP
5718c2ecf20Sopenharmony_ci2:	stxa		%g0, [%g5] ASI_DMMU_DEMAP
5728c2ecf20Sopenharmony_ci	membar		#Sync
5738c2ecf20Sopenharmony_ci	stxa		%g2, [%g4] ASI_DMMU
5748c2ecf20Sopenharmony_ci	retry
5758c2ecf20Sopenharmony_ci	nop
5768c2ecf20Sopenharmony_ci	nop
5778c2ecf20Sopenharmony_ci	nop
5788c2ecf20Sopenharmony_ci	nop
5798c2ecf20Sopenharmony_ci	nop
5808c2ecf20Sopenharmony_ci
5818c2ecf20Sopenharmony_ci	.globl		xcall_flush_tlb_kernel_range
5828c2ecf20Sopenharmony_cixcall_flush_tlb_kernel_range:	/* 44 insns */
5838c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE - 1), %g2
5848c2ecf20Sopenharmony_ci	or		%g2, %lo(PAGE_SIZE - 1), %g2
5858c2ecf20Sopenharmony_ci	andn		%g1, %g2, %g1
5868c2ecf20Sopenharmony_ci	andn		%g7, %g2, %g7
5878c2ecf20Sopenharmony_ci	sub		%g7, %g1, %g3
5888c2ecf20Sopenharmony_ci	srlx		%g3, 18, %g2
5898c2ecf20Sopenharmony_ci	brnz,pn		%g2, 2f
5908c2ecf20Sopenharmony_ci	 sethi		%hi(PAGE_SIZE), %g2
5918c2ecf20Sopenharmony_ci	sub		%g3, %g2, %g3
5928c2ecf20Sopenharmony_ci	or		%g1, 0x20, %g1		! Nucleus
5938c2ecf20Sopenharmony_ci1:	stxa		%g0, [%g1 + %g3] ASI_DMMU_DEMAP
5948c2ecf20Sopenharmony_ci	stxa		%g0, [%g1 + %g3] ASI_IMMU_DEMAP
5958c2ecf20Sopenharmony_ci	membar		#Sync
5968c2ecf20Sopenharmony_ci	brnz,pt		%g3, 1b
5978c2ecf20Sopenharmony_ci	 sub		%g3, %g2, %g3
5988c2ecf20Sopenharmony_ci	retry
5998c2ecf20Sopenharmony_ci2:	mov		63 * 8, %g1
6008c2ecf20Sopenharmony_ci1:	ldxa		[%g1] ASI_ITLB_DATA_ACCESS, %g2
6018c2ecf20Sopenharmony_ci	andcc		%g2, 0x40, %g0			/* _PAGE_L_4U */
6028c2ecf20Sopenharmony_ci	bne,pn		%xcc, 2f
6038c2ecf20Sopenharmony_ci	 mov		TLB_TAG_ACCESS, %g2
6048c2ecf20Sopenharmony_ci	stxa		%g0, [%g2] ASI_IMMU
6058c2ecf20Sopenharmony_ci	stxa		%g0, [%g1] ASI_ITLB_DATA_ACCESS
6068c2ecf20Sopenharmony_ci	membar		#Sync
6078c2ecf20Sopenharmony_ci2:	ldxa		[%g1] ASI_DTLB_DATA_ACCESS, %g2
6088c2ecf20Sopenharmony_ci	andcc		%g2, 0x40, %g0
6098c2ecf20Sopenharmony_ci	bne,pn		%xcc, 2f
6108c2ecf20Sopenharmony_ci	 mov		TLB_TAG_ACCESS, %g2
6118c2ecf20Sopenharmony_ci	stxa		%g0, [%g2] ASI_DMMU
6128c2ecf20Sopenharmony_ci	stxa		%g0, [%g1] ASI_DTLB_DATA_ACCESS
6138c2ecf20Sopenharmony_ci	membar		#Sync
6148c2ecf20Sopenharmony_ci2:	sub		%g1, 8, %g1
6158c2ecf20Sopenharmony_ci	brgez,pt	%g1, 1b
6168c2ecf20Sopenharmony_ci	 nop
6178c2ecf20Sopenharmony_ci	retry
6188c2ecf20Sopenharmony_ci	nop
6198c2ecf20Sopenharmony_ci	nop
6208c2ecf20Sopenharmony_ci	nop
6218c2ecf20Sopenharmony_ci	nop
6228c2ecf20Sopenharmony_ci	nop
6238c2ecf20Sopenharmony_ci	nop
6248c2ecf20Sopenharmony_ci	nop
6258c2ecf20Sopenharmony_ci	nop
6268c2ecf20Sopenharmony_ci	nop
6278c2ecf20Sopenharmony_ci
6288c2ecf20Sopenharmony_ci	/* This runs in a very controlled environment, so we do
6298c2ecf20Sopenharmony_ci	 * not need to worry about BH races etc.
6308c2ecf20Sopenharmony_ci	 */
6318c2ecf20Sopenharmony_ci	.globl		xcall_sync_tick
6328c2ecf20Sopenharmony_cixcall_sync_tick:
6338c2ecf20Sopenharmony_ci
6348c2ecf20Sopenharmony_ci661:	rdpr		%pstate, %g2
6358c2ecf20Sopenharmony_ci	wrpr		%g2, PSTATE_IG | PSTATE_AG, %pstate
6368c2ecf20Sopenharmony_ci	.section	.sun4v_2insn_patch, "ax"
6378c2ecf20Sopenharmony_ci	.word		661b
6388c2ecf20Sopenharmony_ci	nop
6398c2ecf20Sopenharmony_ci	nop
6408c2ecf20Sopenharmony_ci	.previous
6418c2ecf20Sopenharmony_ci
6428c2ecf20Sopenharmony_ci	rdpr		%pil, %g2
6438c2ecf20Sopenharmony_ci	wrpr		%g0, PIL_NORMAL_MAX, %pil
6448c2ecf20Sopenharmony_ci	sethi		%hi(109f), %g7
6458c2ecf20Sopenharmony_ci	b,pt		%xcc, etrap_irq
6468c2ecf20Sopenharmony_ci109:	 or		%g7, %lo(109b), %g7
6478c2ecf20Sopenharmony_ci#ifdef CONFIG_TRACE_IRQFLAGS
6488c2ecf20Sopenharmony_ci	call		trace_hardirqs_off
6498c2ecf20Sopenharmony_ci	 nop
6508c2ecf20Sopenharmony_ci#endif
6518c2ecf20Sopenharmony_ci	call		smp_synchronize_tick_client
6528c2ecf20Sopenharmony_ci	 nop
6538c2ecf20Sopenharmony_ci	b		rtrap_xcall
6548c2ecf20Sopenharmony_ci	 ldx		[%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
6558c2ecf20Sopenharmony_ci
6568c2ecf20Sopenharmony_ci	.globl		xcall_fetch_glob_regs
6578c2ecf20Sopenharmony_cixcall_fetch_glob_regs:
6588c2ecf20Sopenharmony_ci	sethi		%hi(global_cpu_snapshot), %g1
6598c2ecf20Sopenharmony_ci	or		%g1, %lo(global_cpu_snapshot), %g1
6608c2ecf20Sopenharmony_ci	__GET_CPUID(%g2)
6618c2ecf20Sopenharmony_ci	sllx		%g2, 6, %g3
6628c2ecf20Sopenharmony_ci	add		%g1, %g3, %g1
6638c2ecf20Sopenharmony_ci	rdpr		%tstate, %g7
6648c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + GR_SNAP_TSTATE]
6658c2ecf20Sopenharmony_ci	rdpr		%tpc, %g7
6668c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + GR_SNAP_TPC]
6678c2ecf20Sopenharmony_ci	rdpr		%tnpc, %g7
6688c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + GR_SNAP_TNPC]
6698c2ecf20Sopenharmony_ci	stx		%o7, [%g1 + GR_SNAP_O7]
6708c2ecf20Sopenharmony_ci	stx		%i7, [%g1 + GR_SNAP_I7]
6718c2ecf20Sopenharmony_ci	/* Don't try this at home kids... */
6728c2ecf20Sopenharmony_ci	rdpr		%cwp, %g3
6738c2ecf20Sopenharmony_ci	sub		%g3, 1, %g7
6748c2ecf20Sopenharmony_ci	wrpr		%g7, %cwp
6758c2ecf20Sopenharmony_ci	mov		%i7, %g7
6768c2ecf20Sopenharmony_ci	wrpr		%g3, %cwp
6778c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + GR_SNAP_RPC]
6788c2ecf20Sopenharmony_ci	sethi		%hi(trap_block), %g7
6798c2ecf20Sopenharmony_ci	or		%g7, %lo(trap_block), %g7
6808c2ecf20Sopenharmony_ci	sllx		%g2, TRAP_BLOCK_SZ_SHIFT, %g2
6818c2ecf20Sopenharmony_ci	add		%g7, %g2, %g7
6828c2ecf20Sopenharmony_ci	ldx		[%g7 + TRAP_PER_CPU_THREAD], %g3
6838c2ecf20Sopenharmony_ci	stx		%g3, [%g1 + GR_SNAP_THREAD]
6848c2ecf20Sopenharmony_ci	retry
6858c2ecf20Sopenharmony_ci
6868c2ecf20Sopenharmony_ci	.globl		xcall_fetch_glob_pmu
6878c2ecf20Sopenharmony_cixcall_fetch_glob_pmu:
6888c2ecf20Sopenharmony_ci	sethi		%hi(global_cpu_snapshot), %g1
6898c2ecf20Sopenharmony_ci	or		%g1, %lo(global_cpu_snapshot), %g1
6908c2ecf20Sopenharmony_ci	__GET_CPUID(%g2)
6918c2ecf20Sopenharmony_ci	sllx		%g2, 6, %g3
6928c2ecf20Sopenharmony_ci	add		%g1, %g3, %g1
6938c2ecf20Sopenharmony_ci	rd		%pic, %g7
6948c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + (4 * 8)]
6958c2ecf20Sopenharmony_ci	rd		%pcr, %g7
6968c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + (0 * 8)]
6978c2ecf20Sopenharmony_ci	retry
6988c2ecf20Sopenharmony_ci
6998c2ecf20Sopenharmony_ci	.globl		xcall_fetch_glob_pmu_n4
7008c2ecf20Sopenharmony_cixcall_fetch_glob_pmu_n4:
7018c2ecf20Sopenharmony_ci	sethi		%hi(global_cpu_snapshot), %g1
7028c2ecf20Sopenharmony_ci	or		%g1, %lo(global_cpu_snapshot), %g1
7038c2ecf20Sopenharmony_ci	__GET_CPUID(%g2)
7048c2ecf20Sopenharmony_ci	sllx		%g2, 6, %g3
7058c2ecf20Sopenharmony_ci	add		%g1, %g3, %g1
7068c2ecf20Sopenharmony_ci
7078c2ecf20Sopenharmony_ci	ldxa		[%g0] ASI_PIC, %g7
7088c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + (4 * 8)]
7098c2ecf20Sopenharmony_ci	mov		0x08, %g3
7108c2ecf20Sopenharmony_ci	ldxa		[%g3] ASI_PIC, %g7
7118c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + (5 * 8)]
7128c2ecf20Sopenharmony_ci	mov		0x10, %g3
7138c2ecf20Sopenharmony_ci	ldxa		[%g3] ASI_PIC, %g7
7148c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + (6 * 8)]
7158c2ecf20Sopenharmony_ci	mov		0x18, %g3
7168c2ecf20Sopenharmony_ci	ldxa		[%g3] ASI_PIC, %g7
7178c2ecf20Sopenharmony_ci	stx		%g7, [%g1 + (7 * 8)]
7188c2ecf20Sopenharmony_ci
7198c2ecf20Sopenharmony_ci	mov		%o0, %g2
7208c2ecf20Sopenharmony_ci	mov		%o1, %g3
7218c2ecf20Sopenharmony_ci	mov		%o5, %g7
7228c2ecf20Sopenharmony_ci
7238c2ecf20Sopenharmony_ci	mov		HV_FAST_VT_GET_PERFREG, %o5
7248c2ecf20Sopenharmony_ci	mov		3, %o0
7258c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
7268c2ecf20Sopenharmony_ci	stx		%o1, [%g1 + (3 * 8)]
7278c2ecf20Sopenharmony_ci	mov		HV_FAST_VT_GET_PERFREG, %o5
7288c2ecf20Sopenharmony_ci	mov		2, %o0
7298c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
7308c2ecf20Sopenharmony_ci	stx		%o1, [%g1 + (2 * 8)]
7318c2ecf20Sopenharmony_ci	mov		HV_FAST_VT_GET_PERFREG, %o5
7328c2ecf20Sopenharmony_ci	mov		1, %o0
7338c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
7348c2ecf20Sopenharmony_ci	stx		%o1, [%g1 + (1 * 8)]
7358c2ecf20Sopenharmony_ci	mov		HV_FAST_VT_GET_PERFREG, %o5
7368c2ecf20Sopenharmony_ci	mov		0, %o0
7378c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
7388c2ecf20Sopenharmony_ci	stx		%o1, [%g1 + (0 * 8)]
7398c2ecf20Sopenharmony_ci
7408c2ecf20Sopenharmony_ci	mov		%g2, %o0
7418c2ecf20Sopenharmony_ci	mov		%g3, %o1
7428c2ecf20Sopenharmony_ci	mov		%g7, %o5
7438c2ecf20Sopenharmony_ci
7448c2ecf20Sopenharmony_ci	retry
7458c2ecf20Sopenharmony_ci
7468c2ecf20Sopenharmony_ci__cheetah_xcall_flush_tlb_kernel_range:	/* 44 insns */
7478c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE - 1), %g2
7488c2ecf20Sopenharmony_ci	or		%g2, %lo(PAGE_SIZE - 1), %g2
7498c2ecf20Sopenharmony_ci	andn		%g1, %g2, %g1
7508c2ecf20Sopenharmony_ci	andn		%g7, %g2, %g7
7518c2ecf20Sopenharmony_ci	sub		%g7, %g1, %g3
7528c2ecf20Sopenharmony_ci	srlx		%g3, 18, %g2
7538c2ecf20Sopenharmony_ci	brnz,pn		%g2, 2f
7548c2ecf20Sopenharmony_ci	 sethi		%hi(PAGE_SIZE), %g2
7558c2ecf20Sopenharmony_ci	sub		%g3, %g2, %g3
7568c2ecf20Sopenharmony_ci	or		%g1, 0x20, %g1		! Nucleus
7578c2ecf20Sopenharmony_ci1:	stxa		%g0, [%g1 + %g3] ASI_DMMU_DEMAP
7588c2ecf20Sopenharmony_ci	stxa		%g0, [%g1 + %g3] ASI_IMMU_DEMAP
7598c2ecf20Sopenharmony_ci	membar		#Sync
7608c2ecf20Sopenharmony_ci	brnz,pt		%g3, 1b
7618c2ecf20Sopenharmony_ci	 sub		%g3, %g2, %g3
7628c2ecf20Sopenharmony_ci	retry
7638c2ecf20Sopenharmony_ci2:	mov		0x80, %g2
7648c2ecf20Sopenharmony_ci	stxa		%g0, [%g2] ASI_DMMU_DEMAP
7658c2ecf20Sopenharmony_ci	membar		#Sync
7668c2ecf20Sopenharmony_ci	stxa		%g0, [%g2] ASI_IMMU_DEMAP
7678c2ecf20Sopenharmony_ci	membar		#Sync
7688c2ecf20Sopenharmony_ci	retry
7698c2ecf20Sopenharmony_ci	nop
7708c2ecf20Sopenharmony_ci	nop
7718c2ecf20Sopenharmony_ci	nop
7728c2ecf20Sopenharmony_ci	nop
7738c2ecf20Sopenharmony_ci	nop
7748c2ecf20Sopenharmony_ci	nop
7758c2ecf20Sopenharmony_ci	nop
7768c2ecf20Sopenharmony_ci	nop
7778c2ecf20Sopenharmony_ci	nop
7788c2ecf20Sopenharmony_ci	nop
7798c2ecf20Sopenharmony_ci	nop
7808c2ecf20Sopenharmony_ci	nop
7818c2ecf20Sopenharmony_ci	nop
7828c2ecf20Sopenharmony_ci	nop
7838c2ecf20Sopenharmony_ci	nop
7848c2ecf20Sopenharmony_ci	nop
7858c2ecf20Sopenharmony_ci	nop
7868c2ecf20Sopenharmony_ci	nop
7878c2ecf20Sopenharmony_ci	nop
7888c2ecf20Sopenharmony_ci	nop
7898c2ecf20Sopenharmony_ci	nop
7908c2ecf20Sopenharmony_ci	nop
7918c2ecf20Sopenharmony_ci
7928c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
7938c2ecf20Sopenharmony_ci	.align		32
7948c2ecf20Sopenharmony_ci	.globl		xcall_flush_dcache_page_cheetah
7958c2ecf20Sopenharmony_cixcall_flush_dcache_page_cheetah: /* %g1 == physical page address */
7968c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE), %g3
7978c2ecf20Sopenharmony_ci1:	subcc		%g3, (1 << 5), %g3
7988c2ecf20Sopenharmony_ci	stxa		%g0, [%g1 + %g3] ASI_DCACHE_INVALIDATE
7998c2ecf20Sopenharmony_ci	membar		#Sync
8008c2ecf20Sopenharmony_ci	bne,pt		%icc, 1b
8018c2ecf20Sopenharmony_ci	 nop
8028c2ecf20Sopenharmony_ci	retry
8038c2ecf20Sopenharmony_ci	nop
8048c2ecf20Sopenharmony_ci#endif /* DCACHE_ALIASING_POSSIBLE */
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_ci	.globl		xcall_flush_dcache_page_spitfire
8078c2ecf20Sopenharmony_cixcall_flush_dcache_page_spitfire: /* %g1 == physical page address
8088c2ecf20Sopenharmony_ci				     %g7 == kernel page virtual address
8098c2ecf20Sopenharmony_ci				     %g5 == (page->mapping != NULL)  */
8108c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
8118c2ecf20Sopenharmony_ci	srlx		%g1, (13 - 2), %g1	! Form tag comparitor
8128c2ecf20Sopenharmony_ci	sethi		%hi(L1DCACHE_SIZE), %g3	! D$ size == 16K
8138c2ecf20Sopenharmony_ci	sub		%g3, (1 << 5), %g3	! D$ linesize == 32
8148c2ecf20Sopenharmony_ci1:	ldxa		[%g3] ASI_DCACHE_TAG, %g2
8158c2ecf20Sopenharmony_ci	andcc		%g2, 0x3, %g0
8168c2ecf20Sopenharmony_ci	be,pn		%xcc, 2f
8178c2ecf20Sopenharmony_ci	 andn		%g2, 0x3, %g2
8188c2ecf20Sopenharmony_ci	cmp		%g2, %g1
8198c2ecf20Sopenharmony_ci
8208c2ecf20Sopenharmony_ci	bne,pt		%xcc, 2f
8218c2ecf20Sopenharmony_ci	 nop
8228c2ecf20Sopenharmony_ci	stxa		%g0, [%g3] ASI_DCACHE_TAG
8238c2ecf20Sopenharmony_ci	membar		#Sync
8248c2ecf20Sopenharmony_ci2:	cmp		%g3, 0
8258c2ecf20Sopenharmony_ci	bne,pt		%xcc, 1b
8268c2ecf20Sopenharmony_ci	 sub		%g3, (1 << 5), %g3
8278c2ecf20Sopenharmony_ci
8288c2ecf20Sopenharmony_ci	brz,pn		%g5, 2f
8298c2ecf20Sopenharmony_ci#endif /* DCACHE_ALIASING_POSSIBLE */
8308c2ecf20Sopenharmony_ci	 sethi		%hi(PAGE_SIZE), %g3
8318c2ecf20Sopenharmony_ci
8328c2ecf20Sopenharmony_ci1:	flush		%g7
8338c2ecf20Sopenharmony_ci	subcc		%g3, (1 << 5), %g3
8348c2ecf20Sopenharmony_ci	bne,pt		%icc, 1b
8358c2ecf20Sopenharmony_ci	 add		%g7, (1 << 5), %g7
8368c2ecf20Sopenharmony_ci
8378c2ecf20Sopenharmony_ci2:	retry
8388c2ecf20Sopenharmony_ci	nop
8398c2ecf20Sopenharmony_ci	nop
8408c2ecf20Sopenharmony_ci
8418c2ecf20Sopenharmony_ci	/* %g5:	error
8428c2ecf20Sopenharmony_ci	 * %g6:	tlb op
8438c2ecf20Sopenharmony_ci	 */
8448c2ecf20Sopenharmony_ci__hypervisor_tlb_xcall_error:
8458c2ecf20Sopenharmony_ci	mov	%g5, %g4
8468c2ecf20Sopenharmony_ci	mov	%g6, %g5
8478c2ecf20Sopenharmony_ci	ba,pt	%xcc, etrap
8488c2ecf20Sopenharmony_ci	 rd	%pc, %g7
8498c2ecf20Sopenharmony_ci	mov	%l4, %o0
8508c2ecf20Sopenharmony_ci	call	hypervisor_tlbop_error_xcall
8518c2ecf20Sopenharmony_ci	 mov	%l5, %o1
8528c2ecf20Sopenharmony_ci	ba,a,pt	%xcc, rtrap
8538c2ecf20Sopenharmony_ci
8548c2ecf20Sopenharmony_ci	.globl		__hypervisor_xcall_flush_tlb_mm
8558c2ecf20Sopenharmony_ci__hypervisor_xcall_flush_tlb_mm: /* 24 insns */
8568c2ecf20Sopenharmony_ci	/* %g5=ctx, g1,g2,g3,g4,g7=scratch, %g6=unusable */
8578c2ecf20Sopenharmony_ci	mov		%o0, %g2
8588c2ecf20Sopenharmony_ci	mov		%o1, %g3
8598c2ecf20Sopenharmony_ci	mov		%o2, %g4
8608c2ecf20Sopenharmony_ci	mov		%o3, %g1
8618c2ecf20Sopenharmony_ci	mov		%o5, %g7
8628c2ecf20Sopenharmony_ci	clr		%o0		/* ARG0: CPU lists unimplemented */
8638c2ecf20Sopenharmony_ci	clr		%o1		/* ARG1: CPU lists unimplemented */
8648c2ecf20Sopenharmony_ci	mov		%g5, %o2	/* ARG2: mmu context */
8658c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
8668c2ecf20Sopenharmony_ci	mov		HV_FAST_MMU_DEMAP_CTX, %o5
8678c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
8688c2ecf20Sopenharmony_ci	mov		HV_FAST_MMU_DEMAP_CTX, %g6
8698c2ecf20Sopenharmony_ci	brnz,pn		%o0, 1f
8708c2ecf20Sopenharmony_ci	 mov		%o0, %g5
8718c2ecf20Sopenharmony_ci	mov		%g2, %o0
8728c2ecf20Sopenharmony_ci	mov		%g3, %o1
8738c2ecf20Sopenharmony_ci	mov		%g4, %o2
8748c2ecf20Sopenharmony_ci	mov		%g1, %o3
8758c2ecf20Sopenharmony_ci	mov		%g7, %o5
8768c2ecf20Sopenharmony_ci	membar		#Sync
8778c2ecf20Sopenharmony_ci	retry
8788c2ecf20Sopenharmony_ci1:	sethi		%hi(__hypervisor_tlb_xcall_error), %g4
8798c2ecf20Sopenharmony_ci	jmpl		%g4 + %lo(__hypervisor_tlb_xcall_error), %g0
8808c2ecf20Sopenharmony_ci	 nop
8818c2ecf20Sopenharmony_ci
8828c2ecf20Sopenharmony_ci	.globl		__hypervisor_xcall_flush_tlb_page
8838c2ecf20Sopenharmony_ci__hypervisor_xcall_flush_tlb_page: /* 20 insns */
8848c2ecf20Sopenharmony_ci	/* %g5=ctx, %g1=vaddr */
8858c2ecf20Sopenharmony_ci	mov		%o0, %g2
8868c2ecf20Sopenharmony_ci	mov		%o1, %g3
8878c2ecf20Sopenharmony_ci	mov		%o2, %g4
8888c2ecf20Sopenharmony_ci	mov		%g1, %o0	        /* ARG0: virtual address */
8898c2ecf20Sopenharmony_ci	mov		%g5, %o1		/* ARG1: mmu context */
8908c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o2		/* ARG2: flags */
8918c2ecf20Sopenharmony_ci	srlx		%o0, PAGE_SHIFT, %o0
8928c2ecf20Sopenharmony_ci	sllx		%o0, PAGE_SHIFT, %o0
8938c2ecf20Sopenharmony_ci	ta		HV_MMU_UNMAP_ADDR_TRAP
8948c2ecf20Sopenharmony_ci	mov		HV_MMU_UNMAP_ADDR_TRAP, %g6
8958c2ecf20Sopenharmony_ci	brnz,a,pn	%o0, 1f
8968c2ecf20Sopenharmony_ci	 mov		%o0, %g5
8978c2ecf20Sopenharmony_ci	mov		%g2, %o0
8988c2ecf20Sopenharmony_ci	mov		%g3, %o1
8998c2ecf20Sopenharmony_ci	mov		%g4, %o2
9008c2ecf20Sopenharmony_ci	membar		#Sync
9018c2ecf20Sopenharmony_ci	retry
9028c2ecf20Sopenharmony_ci1:	sethi		%hi(__hypervisor_tlb_xcall_error), %g4
9038c2ecf20Sopenharmony_ci	jmpl		%g4 + %lo(__hypervisor_tlb_xcall_error), %g0
9048c2ecf20Sopenharmony_ci	 nop
9058c2ecf20Sopenharmony_ci
9068c2ecf20Sopenharmony_ci	.globl		__hypervisor_xcall_flush_tlb_kernel_range
9078c2ecf20Sopenharmony_ci__hypervisor_xcall_flush_tlb_kernel_range: /* 44 insns */
9088c2ecf20Sopenharmony_ci	/* %g1=start, %g7=end, g2,g3,g4,g5,g6=scratch */
9098c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE - 1), %g2
9108c2ecf20Sopenharmony_ci	or		%g2, %lo(PAGE_SIZE - 1), %g2
9118c2ecf20Sopenharmony_ci	andn		%g1, %g2, %g1
9128c2ecf20Sopenharmony_ci	andn		%g7, %g2, %g7
9138c2ecf20Sopenharmony_ci	sub		%g7, %g1, %g3
9148c2ecf20Sopenharmony_ci	srlx		%g3, 18, %g7
9158c2ecf20Sopenharmony_ci	add		%g2, 1, %g2
9168c2ecf20Sopenharmony_ci	sub		%g3, %g2, %g3
9178c2ecf20Sopenharmony_ci	mov		%o0, %g2
9188c2ecf20Sopenharmony_ci	mov		%o1, %g4
9198c2ecf20Sopenharmony_ci	brnz,pn		%g7, 2f
9208c2ecf20Sopenharmony_ci	 mov		%o2, %g7
9218c2ecf20Sopenharmony_ci1:	add		%g1, %g3, %o0	/* ARG0: virtual address */
9228c2ecf20Sopenharmony_ci	mov		0, %o1		/* ARG1: mmu context */
9238c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o2	/* ARG2: flags */
9248c2ecf20Sopenharmony_ci	ta		HV_MMU_UNMAP_ADDR_TRAP
9258c2ecf20Sopenharmony_ci	mov		HV_MMU_UNMAP_ADDR_TRAP, %g6
9268c2ecf20Sopenharmony_ci	brnz,pn		%o0, 1f
9278c2ecf20Sopenharmony_ci	 mov		%o0, %g5
9288c2ecf20Sopenharmony_ci	sethi		%hi(PAGE_SIZE), %o2
9298c2ecf20Sopenharmony_ci	brnz,pt		%g3, 1b
9308c2ecf20Sopenharmony_ci	 sub		%g3, %o2, %g3
9318c2ecf20Sopenharmony_ci5:	mov		%g2, %o0
9328c2ecf20Sopenharmony_ci	mov		%g4, %o1
9338c2ecf20Sopenharmony_ci	mov		%g7, %o2
9348c2ecf20Sopenharmony_ci	membar		#Sync
9358c2ecf20Sopenharmony_ci	retry
9368c2ecf20Sopenharmony_ci1:	sethi		%hi(__hypervisor_tlb_xcall_error), %g4
9378c2ecf20Sopenharmony_ci	jmpl		%g4 + %lo(__hypervisor_tlb_xcall_error), %g0
9388c2ecf20Sopenharmony_ci	 nop
9398c2ecf20Sopenharmony_ci2:	mov		%o3, %g1
9408c2ecf20Sopenharmony_ci	mov		%o5, %g3
9418c2ecf20Sopenharmony_ci	mov		0, %o0		/* ARG0: CPU lists unimplemented */
9428c2ecf20Sopenharmony_ci	mov		0, %o1		/* ARG1: CPU lists unimplemented */
9438c2ecf20Sopenharmony_ci	mov		0, %o2		/* ARG2: mmu context == nucleus */
9448c2ecf20Sopenharmony_ci	mov		HV_MMU_ALL, %o3	/* ARG3: flags */
9458c2ecf20Sopenharmony_ci	mov		HV_FAST_MMU_DEMAP_CTX, %o5
9468c2ecf20Sopenharmony_ci	ta		HV_FAST_TRAP
9478c2ecf20Sopenharmony_ci	mov		%g1, %o3
9488c2ecf20Sopenharmony_ci	brz,pt		%o0, 5b
9498c2ecf20Sopenharmony_ci	 mov		%g3, %o5
9508c2ecf20Sopenharmony_ci	mov		HV_FAST_MMU_DEMAP_CTX, %g6
9518c2ecf20Sopenharmony_ci	ba,pt		%xcc, 1b
9528c2ecf20Sopenharmony_ci	 clr		%g5
9538c2ecf20Sopenharmony_ci
9548c2ecf20Sopenharmony_ci	/* These just get rescheduled to PIL vectors. */
9558c2ecf20Sopenharmony_ci	.globl		xcall_call_function
9568c2ecf20Sopenharmony_cixcall_call_function:
9578c2ecf20Sopenharmony_ci	wr		%g0, (1 << PIL_SMP_CALL_FUNC), %set_softint
9588c2ecf20Sopenharmony_ci	retry
9598c2ecf20Sopenharmony_ci
9608c2ecf20Sopenharmony_ci	.globl		xcall_call_function_single
9618c2ecf20Sopenharmony_cixcall_call_function_single:
9628c2ecf20Sopenharmony_ci	wr		%g0, (1 << PIL_SMP_CALL_FUNC_SNGL), %set_softint
9638c2ecf20Sopenharmony_ci	retry
9648c2ecf20Sopenharmony_ci
9658c2ecf20Sopenharmony_ci	.globl		xcall_receive_signal
9668c2ecf20Sopenharmony_cixcall_receive_signal:
9678c2ecf20Sopenharmony_ci	wr		%g0, (1 << PIL_SMP_RECEIVE_SIGNAL), %set_softint
9688c2ecf20Sopenharmony_ci	retry
9698c2ecf20Sopenharmony_ci
9708c2ecf20Sopenharmony_ci	.globl		xcall_capture
9718c2ecf20Sopenharmony_cixcall_capture:
9728c2ecf20Sopenharmony_ci	wr		%g0, (1 << PIL_SMP_CAPTURE), %set_softint
9738c2ecf20Sopenharmony_ci	retry
9748c2ecf20Sopenharmony_ci
9758c2ecf20Sopenharmony_ci#ifdef CONFIG_KGDB
9768c2ecf20Sopenharmony_ci	.globl		xcall_kgdb_capture
9778c2ecf20Sopenharmony_cixcall_kgdb_capture:
9788c2ecf20Sopenharmony_ci	wr		%g0, (1 << PIL_KGDB_CAPTURE), %set_softint
9798c2ecf20Sopenharmony_ci	retry
9808c2ecf20Sopenharmony_ci#endif
9818c2ecf20Sopenharmony_ci
9828c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
9838c2ecf20Sopenharmony_ci
9848c2ecf20Sopenharmony_ci	.globl		cheetah_patch_cachetlbops
9858c2ecf20Sopenharmony_cicheetah_patch_cachetlbops:
9868c2ecf20Sopenharmony_ci	save		%sp, -128, %sp
9878c2ecf20Sopenharmony_ci
9888c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_mm), %o0
9898c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_mm), %o0
9908c2ecf20Sopenharmony_ci	sethi		%hi(__cheetah_flush_tlb_mm), %o1
9918c2ecf20Sopenharmony_ci	or		%o1, %lo(__cheetah_flush_tlb_mm), %o1
9928c2ecf20Sopenharmony_ci	call		tlb_patch_one
9938c2ecf20Sopenharmony_ci	 mov		19, %o2
9948c2ecf20Sopenharmony_ci
9958c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_page), %o0
9968c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_page), %o0
9978c2ecf20Sopenharmony_ci	sethi		%hi(__cheetah_flush_tlb_page), %o1
9988c2ecf20Sopenharmony_ci	or		%o1, %lo(__cheetah_flush_tlb_page), %o1
9998c2ecf20Sopenharmony_ci	call		tlb_patch_one
10008c2ecf20Sopenharmony_ci	 mov		22, %o2
10018c2ecf20Sopenharmony_ci
10028c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_pending), %o0
10038c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_pending), %o0
10048c2ecf20Sopenharmony_ci	sethi		%hi(__cheetah_flush_tlb_pending), %o1
10058c2ecf20Sopenharmony_ci	or		%o1, %lo(__cheetah_flush_tlb_pending), %o1
10068c2ecf20Sopenharmony_ci	call		tlb_patch_one
10078c2ecf20Sopenharmony_ci	 mov		27, %o2
10088c2ecf20Sopenharmony_ci
10098c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_kernel_range), %o0
10108c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_kernel_range), %o0
10118c2ecf20Sopenharmony_ci	sethi		%hi(__cheetah_flush_tlb_kernel_range), %o1
10128c2ecf20Sopenharmony_ci	or		%o1, %lo(__cheetah_flush_tlb_kernel_range), %o1
10138c2ecf20Sopenharmony_ci	call		tlb_patch_one
10148c2ecf20Sopenharmony_ci	 mov		31, %o2
10158c2ecf20Sopenharmony_ci
10168c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
10178c2ecf20Sopenharmony_ci	sethi		%hi(__flush_dcache_page), %o0
10188c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_dcache_page), %o0
10198c2ecf20Sopenharmony_ci	sethi		%hi(__cheetah_flush_dcache_page), %o1
10208c2ecf20Sopenharmony_ci	or		%o1, %lo(__cheetah_flush_dcache_page), %o1
10218c2ecf20Sopenharmony_ci	call		tlb_patch_one
10228c2ecf20Sopenharmony_ci	 mov		11, %o2
10238c2ecf20Sopenharmony_ci#endif /* DCACHE_ALIASING_POSSIBLE */
10248c2ecf20Sopenharmony_ci
10258c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
10268c2ecf20Sopenharmony_ci	sethi		%hi(xcall_flush_tlb_kernel_range), %o0
10278c2ecf20Sopenharmony_ci	or		%o0, %lo(xcall_flush_tlb_kernel_range), %o0
10288c2ecf20Sopenharmony_ci	sethi		%hi(__cheetah_xcall_flush_tlb_kernel_range), %o1
10298c2ecf20Sopenharmony_ci	or		%o1, %lo(__cheetah_xcall_flush_tlb_kernel_range), %o1
10308c2ecf20Sopenharmony_ci	call		tlb_patch_one
10318c2ecf20Sopenharmony_ci	 mov		44, %o2
10328c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
10338c2ecf20Sopenharmony_ci
10348c2ecf20Sopenharmony_ci	ret
10358c2ecf20Sopenharmony_ci	 restore
10368c2ecf20Sopenharmony_ci
10378c2ecf20Sopenharmony_ci	.globl		hypervisor_patch_cachetlbops
10388c2ecf20Sopenharmony_cihypervisor_patch_cachetlbops:
10398c2ecf20Sopenharmony_ci	save		%sp, -128, %sp
10408c2ecf20Sopenharmony_ci
10418c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_mm), %o0
10428c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_mm), %o0
10438c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_flush_tlb_mm), %o1
10448c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_flush_tlb_mm), %o1
10458c2ecf20Sopenharmony_ci	call		tlb_patch_one
10468c2ecf20Sopenharmony_ci	 mov		19, %o2
10478c2ecf20Sopenharmony_ci
10488c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_page), %o0
10498c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_page), %o0
10508c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_flush_tlb_page), %o1
10518c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_flush_tlb_page), %o1
10528c2ecf20Sopenharmony_ci	call		tlb_patch_one
10538c2ecf20Sopenharmony_ci	 mov		22, %o2
10548c2ecf20Sopenharmony_ci
10558c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_pending), %o0
10568c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_pending), %o0
10578c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_flush_tlb_pending), %o1
10588c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_flush_tlb_pending), %o1
10598c2ecf20Sopenharmony_ci	call		tlb_patch_one
10608c2ecf20Sopenharmony_ci	 mov		27, %o2
10618c2ecf20Sopenharmony_ci
10628c2ecf20Sopenharmony_ci	sethi		%hi(__flush_tlb_kernel_range), %o0
10638c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_tlb_kernel_range), %o0
10648c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_flush_tlb_kernel_range), %o1
10658c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_flush_tlb_kernel_range), %o1
10668c2ecf20Sopenharmony_ci	call		tlb_patch_one
10678c2ecf20Sopenharmony_ci	 mov		31, %o2
10688c2ecf20Sopenharmony_ci
10698c2ecf20Sopenharmony_ci#ifdef DCACHE_ALIASING_POSSIBLE
10708c2ecf20Sopenharmony_ci	sethi		%hi(__flush_dcache_page), %o0
10718c2ecf20Sopenharmony_ci	or		%o0, %lo(__flush_dcache_page), %o0
10728c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_flush_dcache_page), %o1
10738c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_flush_dcache_page), %o1
10748c2ecf20Sopenharmony_ci	call		tlb_patch_one
10758c2ecf20Sopenharmony_ci	 mov		2, %o2
10768c2ecf20Sopenharmony_ci#endif /* DCACHE_ALIASING_POSSIBLE */
10778c2ecf20Sopenharmony_ci
10788c2ecf20Sopenharmony_ci#ifdef CONFIG_SMP
10798c2ecf20Sopenharmony_ci	sethi		%hi(xcall_flush_tlb_mm), %o0
10808c2ecf20Sopenharmony_ci	or		%o0, %lo(xcall_flush_tlb_mm), %o0
10818c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_xcall_flush_tlb_mm), %o1
10828c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_xcall_flush_tlb_mm), %o1
10838c2ecf20Sopenharmony_ci	call		tlb_patch_one
10848c2ecf20Sopenharmony_ci	 mov		24, %o2
10858c2ecf20Sopenharmony_ci
10868c2ecf20Sopenharmony_ci	sethi		%hi(xcall_flush_tlb_page), %o0
10878c2ecf20Sopenharmony_ci	or		%o0, %lo(xcall_flush_tlb_page), %o0
10888c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_xcall_flush_tlb_page), %o1
10898c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_xcall_flush_tlb_page), %o1
10908c2ecf20Sopenharmony_ci	call		tlb_patch_one
10918c2ecf20Sopenharmony_ci	 mov		20, %o2
10928c2ecf20Sopenharmony_ci
10938c2ecf20Sopenharmony_ci	sethi		%hi(xcall_flush_tlb_kernel_range), %o0
10948c2ecf20Sopenharmony_ci	or		%o0, %lo(xcall_flush_tlb_kernel_range), %o0
10958c2ecf20Sopenharmony_ci	sethi		%hi(__hypervisor_xcall_flush_tlb_kernel_range), %o1
10968c2ecf20Sopenharmony_ci	or		%o1, %lo(__hypervisor_xcall_flush_tlb_kernel_range), %o1
10978c2ecf20Sopenharmony_ci	call		tlb_patch_one
10988c2ecf20Sopenharmony_ci	 mov		44, %o2
10998c2ecf20Sopenharmony_ci#endif /* CONFIG_SMP */
11008c2ecf20Sopenharmony_ci
11018c2ecf20Sopenharmony_ci	ret
11028c2ecf20Sopenharmony_ci	 restore
1103