xref: /illumos-gate/usr/src/uts/sun4v/vm/mach_sfmmu.h (revision 5d9d9091)
17c478bd9Sstevel@tonic-gate /*
27c478bd9Sstevel@tonic-gate  * CDDL HEADER START
37c478bd9Sstevel@tonic-gate  *
47c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
560972f37Sjb  * Common Development and Distribution License (the "License").
660972f37Sjb  * You may not use this file except in compliance with the License.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
97c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
107c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
117c478bd9Sstevel@tonic-gate  * and limitations under the License.
127c478bd9Sstevel@tonic-gate  *
137c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
147c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
157c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
167c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
177c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
187c478bd9Sstevel@tonic-gate  *
197c478bd9Sstevel@tonic-gate  * CDDL HEADER END
207c478bd9Sstevel@tonic-gate  */
217c478bd9Sstevel@tonic-gate /*
22125be069SJason Beloro  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
237c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
247c478bd9Sstevel@tonic-gate  */
257c478bd9Sstevel@tonic-gate 
267c478bd9Sstevel@tonic-gate /*
277c478bd9Sstevel@tonic-gate  * VM - Hardware Address Translation management.
287c478bd9Sstevel@tonic-gate  *
297c478bd9Sstevel@tonic-gate  * This file describes the contents of the sun reference mmu (sfmmu)
307c478bd9Sstevel@tonic-gate  * specific hat data structures and the sfmmu specific hat procedures.
317c478bd9Sstevel@tonic-gate  * The machine independent interface is described in <vm/hat.h>.
327c478bd9Sstevel@tonic-gate  */
337c478bd9Sstevel@tonic-gate 
347c478bd9Sstevel@tonic-gate #ifndef _VM_MACH_SFMMU_H
357c478bd9Sstevel@tonic-gate #define	_VM_MACH_SFMMU_H
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate #include <sys/x_call.h>
387c478bd9Sstevel@tonic-gate #include <sys/hypervisor_api.h>
397c478bd9Sstevel@tonic-gate 
407c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
417c478bd9Sstevel@tonic-gate extern "C" {
427c478bd9Sstevel@tonic-gate #endif
437c478bd9Sstevel@tonic-gate 
447c478bd9Sstevel@tonic-gate /*
457c478bd9Sstevel@tonic-gate  * Define UTSB_PHYS if user TSB is always accessed via physical address.
467c478bd9Sstevel@tonic-gate  * On sun4v platform, user TSB is accessed via physical address.
477c478bd9Sstevel@tonic-gate  */
487c478bd9Sstevel@tonic-gate #define	UTSB_PHYS	1
497c478bd9Sstevel@tonic-gate 
507c478bd9Sstevel@tonic-gate /*
517c478bd9Sstevel@tonic-gate  * Hypervisor TSB info
527c478bd9Sstevel@tonic-gate  */
5305d3dc4bSpaulsan #define	NHV_TSB_INFO	4
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate #ifndef _ASM
567c478bd9Sstevel@tonic-gate 
577c478bd9Sstevel@tonic-gate struct hv_tsb_block {
587c478bd9Sstevel@tonic-gate 	uint64_t	hv_tsb_info_pa;	/* hypervisor TSB info PA */
597c478bd9Sstevel@tonic-gate 	uint64_t	hv_tsb_info_cnt; /* hypervisor TSB info count */
607c478bd9Sstevel@tonic-gate 	hv_tsb_info_t	hv_tsb_info[NHV_TSB_INFO]; /* hypervisor TSB info */
617c478bd9Sstevel@tonic-gate };
627c478bd9Sstevel@tonic-gate 
637c478bd9Sstevel@tonic-gate #endif /* _ASM */
647c478bd9Sstevel@tonic-gate 
657c478bd9Sstevel@tonic-gate #ifdef _ASM
667c478bd9Sstevel@tonic-gate 
6705d3dc4bSpaulsan /*
6805d3dc4bSpaulsan  * This macro is used to set private/shared secondary context register in
6905d3dc4bSpaulsan  * sfmmu_alloc_ctx().
7005d3dc4bSpaulsan  * Input:
7105d3dc4bSpaulsan  * cnum     = cnum
7205d3dc4bSpaulsan  * is_shctx = sfmmu private/shared flag (0: private, 1: shared)
732f0fcb93SJason Beloro  * tmp2 is only used in the sun4u version of this macro
7405d3dc4bSpaulsan  */
751426d65aSsm #define	SET_SECCTX(cnum, is_shctx, tmp1, tmp2, label)			\
7605d3dc4bSpaulsan 	mov	MMU_SCONTEXT, tmp1;					\
7705d3dc4bSpaulsan 	movrnz	is_shctx, MMU_SCONTEXT1, tmp1;				\
7805d3dc4bSpaulsan 	stxa    cnum, [tmp1]ASI_MMU_CTX;  /* set 2nd ctx reg. */	\
792f0fcb93SJason Beloro 	membar  #Sync;							\
8005d3dc4bSpaulsan 
817c478bd9Sstevel@tonic-gate /*
827c478bd9Sstevel@tonic-gate  * This macro is used in the MMU code to check if TL should be lowered from
837c478bd9Sstevel@tonic-gate  * 2 to 1 to pop trapstat's state.  See the block comment in trapstat.c
847c478bd9Sstevel@tonic-gate  * for details.
857c478bd9Sstevel@tonic-gate  */
867c478bd9Sstevel@tonic-gate 
877c478bd9Sstevel@tonic-gate #define	TSTAT_CHECK_TL1(label, scr1, scr2)			\
887c478bd9Sstevel@tonic-gate 	rdpr	%tpc, scr1;					\
897c478bd9Sstevel@tonic-gate 	sethi	%hi(KERNELBASE), scr2;				\
907c478bd9Sstevel@tonic-gate 	or	scr2, %lo(KERNELBASE), scr2; 			\
917c478bd9Sstevel@tonic-gate 	cmp	scr1, scr2; 					\
927c478bd9Sstevel@tonic-gate 	bgeu	%xcc, 9f;					\
937c478bd9Sstevel@tonic-gate 	nop;							\
947c478bd9Sstevel@tonic-gate 	wrpr	%g0, 1, %gl;					\
957c478bd9Sstevel@tonic-gate 	ba	label;						\
967c478bd9Sstevel@tonic-gate 	wrpr	%g0, 1, %tl;					\
977c478bd9Sstevel@tonic-gate 9:
987c478bd9Sstevel@tonic-gate 
997c478bd9Sstevel@tonic-gate /*
1007c478bd9Sstevel@tonic-gate  * The following macros allow us to share majority of the
1017c478bd9Sstevel@tonic-gate  * SFMMU code between sun4u and sun4v platforms.
1027c478bd9Sstevel@tonic-gate  */
1037c478bd9Sstevel@tonic-gate 
1047c478bd9Sstevel@tonic-gate #define	SETUP_TSB_ASI(qlp, tmp)
1057c478bd9Sstevel@tonic-gate 
1067c478bd9Sstevel@tonic-gate #define	SETUP_UTSB_ATOMIC_ASI(tmp1, tmp2)
1077c478bd9Sstevel@tonic-gate 
1087c478bd9Sstevel@tonic-gate /*
1097c478bd9Sstevel@tonic-gate  * Macro to swtich to alternate global register on sun4u platforms
1107c478bd9Sstevel@tonic-gate  * (not applicable to sun4v platforms)
1117c478bd9Sstevel@tonic-gate  */
1127c478bd9Sstevel@tonic-gate #define	USE_ALTERNATE_GLOBALS(scr)
1137c478bd9Sstevel@tonic-gate 
1147c478bd9Sstevel@tonic-gate /*
1157c478bd9Sstevel@tonic-gate  * Macro to set %gl register value on sun4v platforms
1167c478bd9Sstevel@tonic-gate  * (not applicable to sun4u platforms)
1177c478bd9Sstevel@tonic-gate  */
1187c478bd9Sstevel@tonic-gate #define	SET_GL_REG(val)						\
1197c478bd9Sstevel@tonic-gate 	wrpr	%g0, val, %gl
1207c478bd9Sstevel@tonic-gate 
1217c478bd9Sstevel@tonic-gate /*
12260972f37Sjb  * Get pseudo-tagacc value and context from the MMU fault area.  Pseudo-tagacc
12360972f37Sjb  * is the faulting virtual address OR'd with 0 for KCONTEXT, INVALID_CONTEXT
12460972f37Sjb  * (1) for invalid context, and USER_CONTEXT (2) for user context.
1257c478bd9Sstevel@tonic-gate  *
1267c478bd9Sstevel@tonic-gate  * In:
12760972f37Sjb  *   tagacc, ctxtype = scratch registers
1287c478bd9Sstevel@tonic-gate  * Out:
1297c478bd9Sstevel@tonic-gate  *   tagacc = MMU data tag access register value
13060972f37Sjb  *   ctx = context type (KCONTEXT, INVALID_CONTEXT or USER_CONTEXT)
1317c478bd9Sstevel@tonic-gate  */
13260972f37Sjb #define	GET_MMU_D_PTAGACC_CTXTYPE(ptagacc, ctxtype)			\
13360972f37Sjb 	MMU_FAULT_STATUS_AREA(ctxtype);					\
13460972f37Sjb 	ldx	[ctxtype + MMFSA_D_ADDR], ptagacc;			\
13560972f37Sjb 	ldx	[ctxtype + MMFSA_D_CTX], ctxtype;			\
13660972f37Sjb 	srlx	ptagacc, MMU_PAGESHIFT, ptagacc; /* align to page boundary */ \
13760972f37Sjb 	cmp	ctxtype, USER_CONTEXT_TYPE;				\
13860972f37Sjb 	sllx	ptagacc, MMU_PAGESHIFT, ptagacc;			\
13960972f37Sjb 	movgu	%icc, USER_CONTEXT_TYPE, ctxtype;			\
14060972f37Sjb 	or	ptagacc, ctxtype, ptagacc
1417c478bd9Sstevel@tonic-gate 
1427c478bd9Sstevel@tonic-gate /*
1437c478bd9Sstevel@tonic-gate  * Synthesize/get data tag access register value from the MMU fault area
1447c478bd9Sstevel@tonic-gate  *
1457c478bd9Sstevel@tonic-gate  * In:
1467c478bd9Sstevel@tonic-gate  *   tagacc, scr1 = scratch registers
1477c478bd9Sstevel@tonic-gate  * Out:
1487c478bd9Sstevel@tonic-gate  *   tagacc = MMU data tag access register value
1497c478bd9Sstevel@tonic-gate  */
1507c478bd9Sstevel@tonic-gate #define	GET_MMU_D_TAGACC(tagacc, scr1)				\
15160972f37Sjb 	GET_MMU_D_PTAGACC_CTXTYPE(tagacc, scr1)
1527c478bd9Sstevel@tonic-gate 
1537c478bd9Sstevel@tonic-gate /*
1547c478bd9Sstevel@tonic-gate  * Synthesize/get data tag target register value from the MMU fault area
1557c478bd9Sstevel@tonic-gate  *
1567c478bd9Sstevel@tonic-gate  * In:
1577c478bd9Sstevel@tonic-gate  *   ttarget, scr1 = scratch registers
1587c478bd9Sstevel@tonic-gate  * Out:
1597c478bd9Sstevel@tonic-gate  *   ttarget = MMU data tag target register value
1607c478bd9Sstevel@tonic-gate  */
1617c478bd9Sstevel@tonic-gate #define	GET_MMU_D_TTARGET(ttarget, scr1)			\
1627c478bd9Sstevel@tonic-gate 	MMU_FAULT_STATUS_AREA(ttarget);				\
1637c478bd9Sstevel@tonic-gate 	ldx	[ttarget + MMFSA_D_CTX], scr1;			\
1647c478bd9Sstevel@tonic-gate 	sllx	scr1, TTARGET_CTX_SHIFT, scr1;			\
1657c478bd9Sstevel@tonic-gate 	ldx	[ttarget + MMFSA_D_ADDR], ttarget;		\
1667c478bd9Sstevel@tonic-gate 	srlx	ttarget, TTARGET_VA_SHIFT, ttarget;		\
1677c478bd9Sstevel@tonic-gate 	or	ttarget, scr1, ttarget
1687c478bd9Sstevel@tonic-gate 
1697c478bd9Sstevel@tonic-gate /*
17060972f37Sjb  * Synthesize/get data/instruction psuedo tag access register values
17160972f37Sjb  * from the MMU fault area (context is 0 for kernel, 1 for invalid, 2 for user)
1727c478bd9Sstevel@tonic-gate  *
1737c478bd9Sstevel@tonic-gate  * In:
1747c478bd9Sstevel@tonic-gate  *   dtagacc, itagacc, scr1, scr2 = scratch registers
1757c478bd9Sstevel@tonic-gate  * Out:
17660972f37Sjb  *   dtagacc = MMU data tag access register value w/psuedo-context
17760972f37Sjb  *   itagacc = MMU instruction tag access register value w/pseudo-context
1787c478bd9Sstevel@tonic-gate  */
1797c478bd9Sstevel@tonic-gate #define	GET_MMU_BOTH_TAGACC(dtagacc, itagacc, scr1, scr2)	\
1807c478bd9Sstevel@tonic-gate 	MMU_FAULT_STATUS_AREA(scr1);				\
1817c478bd9Sstevel@tonic-gate 	ldx	[scr1 + MMFSA_D_ADDR], scr2;			\
1827c478bd9Sstevel@tonic-gate 	ldx	[scr1 + MMFSA_D_CTX], dtagacc;			\
18360972f37Sjb 	srlx	scr2, MMU_PAGESHIFT, scr2;	/* align to page boundary */ \
18460972f37Sjb 	cmp	dtagacc, USER_CONTEXT_TYPE;			\
1857c478bd9Sstevel@tonic-gate 	sllx	scr2, MMU_PAGESHIFT, scr2;			\
18660972f37Sjb 	movgu	%icc, USER_CONTEXT_TYPE, dtagacc;		\
1877c478bd9Sstevel@tonic-gate 	or	scr2, dtagacc, dtagacc;				\
1887c478bd9Sstevel@tonic-gate 	ldx	[scr1 + MMFSA_I_ADDR], scr2;			\
1897c478bd9Sstevel@tonic-gate 	ldx	[scr1 + MMFSA_I_CTX], itagacc;			\
1907c478bd9Sstevel@tonic-gate 	srlx	scr2, MMU_PAGESHIFT, scr2;	/* align to page boundry */ \
19160972f37Sjb 	cmp	itagacc, USER_CONTEXT_TYPE;			\
1927c478bd9Sstevel@tonic-gate 	sllx	scr2, MMU_PAGESHIFT, scr2;			\
19360972f37Sjb 	movgu	%icc, USER_CONTEXT_TYPE, itagacc;		\
1947c478bd9Sstevel@tonic-gate 	or	scr2, itagacc, itagacc
1957c478bd9Sstevel@tonic-gate 
1967c478bd9Sstevel@tonic-gate /*
1977c478bd9Sstevel@tonic-gate  * Synthesize/get MMU data fault address from the MMU fault area
1987c478bd9Sstevel@tonic-gate  *
1997c478bd9Sstevel@tonic-gate  * In:
2007c478bd9Sstevel@tonic-gate  *   daddr, scr1 = scratch registers
2017c478bd9Sstevel@tonic-gate  * Out:
2027c478bd9Sstevel@tonic-gate  *   daddr = MMU data fault address
2037c478bd9Sstevel@tonic-gate  */
2047c478bd9Sstevel@tonic-gate #define	GET_MMU_D_ADDR(daddr, scr1)				\
2057c478bd9Sstevel@tonic-gate 	MMU_FAULT_STATUS_AREA(scr1);				\
2067c478bd9Sstevel@tonic-gate 	ldx	[scr1 + MMFSA_D_ADDR], daddr
2077c478bd9Sstevel@tonic-gate 
20860972f37Sjb /*
20960972f37Sjb  * Get pseudo-tagacc value and context from the MMU fault area.  Pseudo-tagacc
21060972f37Sjb  * is the faulting virtual address OR'd with 0 for KCONTEXT, INVALID_CONTEXT
21160972f37Sjb  * (1) for invalid context, and USER_CONTEXT (2) for user context.
21260972f37Sjb  *
21360972f37Sjb  * In:
21460972f37Sjb  *   tagacc, ctxtype = scratch registers
21560972f37Sjb  * Out:
21660972f37Sjb  *   tagacc = MMU instruction tag access register value
21760972f37Sjb  *   ctxtype = context type (KCONTEXT, INVALID_CONTEXT or USER_CONTEXT)
21860972f37Sjb  */
21960972f37Sjb #define	GET_MMU_I_PTAGACC_CTXTYPE(ptagacc, ctxtype)			\
22060972f37Sjb 	MMU_FAULT_STATUS_AREA(ctxtype);					\
22160972f37Sjb 	ldx	[ctxtype + MMFSA_I_ADDR], ptagacc;			\
22260972f37Sjb 	ldx	[ctxtype + MMFSA_I_CTX], ctxtype;			\
22360972f37Sjb 	srlx	ptagacc, MMU_PAGESHIFT, ptagacc; /* align to page boundary */ \
22460972f37Sjb 	cmp	ctxtype, USER_CONTEXT_TYPE;				\
22560972f37Sjb 	sllx	ptagacc, MMU_PAGESHIFT, ptagacc;			\
22660972f37Sjb 	movgu	%icc, USER_CONTEXT_TYPE, ctxtype;			\
22760972f37Sjb 	or	ptagacc, ctxtype, ptagacc
22860972f37Sjb 
2297c478bd9Sstevel@tonic-gate /*
2307c478bd9Sstevel@tonic-gate  * Load ITLB entry
2317c478bd9Sstevel@tonic-gate  *
2327c478bd9Sstevel@tonic-gate  * In:
2337c478bd9Sstevel@tonic-gate  *   tte = reg containing tte
2347c478bd9Sstevel@tonic-gate  *   scr1, scr2, scr3, scr4 = scratch registers
2357c478bd9Sstevel@tonic-gate  */
2367c478bd9Sstevel@tonic-gate #define	ITLB_STUFF(tte, scr1, scr2, scr3, scr4)		\
2377c478bd9Sstevel@tonic-gate 	mov	%o0, scr1;				\
2387c478bd9Sstevel@tonic-gate 	mov	%o1, scr2;				\
2397c478bd9Sstevel@tonic-gate 	mov	%o2, scr3;				\
2407c478bd9Sstevel@tonic-gate 	mov	%o3, scr4;				\
2417c478bd9Sstevel@tonic-gate 	MMU_FAULT_STATUS_AREA(%o2);			\
2427c478bd9Sstevel@tonic-gate 	ldx	[%o2 + MMFSA_I_ADDR], %o0;		\
2437c478bd9Sstevel@tonic-gate 	ldx	[%o2 + MMFSA_I_CTX], %o1;		\
2447c478bd9Sstevel@tonic-gate 	mov	tte, %o2;				\
2457c478bd9Sstevel@tonic-gate 	mov	MAP_ITLB, %o3;				\
2467c478bd9Sstevel@tonic-gate 	ta	MMU_MAP_ADDR;				\
2477c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */				\
2487c478bd9Sstevel@tonic-gate 	brnz,a,pn %o0, ptl1_panic;			\
2497c478bd9Sstevel@tonic-gate 	  mov	PTL1_BAD_HCALL, %g1;			\
2507c478bd9Sstevel@tonic-gate 	/* END CSTYLED */				\
2517c478bd9Sstevel@tonic-gate 	mov	scr1, %o0;				\
2527c478bd9Sstevel@tonic-gate 	mov	scr2, %o1;				\
2537c478bd9Sstevel@tonic-gate 	mov	scr3, %o2;				\
2547c478bd9Sstevel@tonic-gate 	mov	scr4, %o3
2557c478bd9Sstevel@tonic-gate 
2567c478bd9Sstevel@tonic-gate /*
2577c478bd9Sstevel@tonic-gate  * Load DTLB entry
2587c478bd9Sstevel@tonic-gate  *
2597c478bd9Sstevel@tonic-gate  * In:
2607c478bd9Sstevel@tonic-gate  *   tte = reg containing tte
2617c478bd9Sstevel@tonic-gate  *   scr1, scr2, scr3, scr4 = scratch registers
2627c478bd9Sstevel@tonic-gate  */
2637c478bd9Sstevel@tonic-gate #define	DTLB_STUFF(tte, scr1, scr2, scr3, scr4)		\
2647c478bd9Sstevel@tonic-gate 	mov	%o0, scr1;				\
2657c478bd9Sstevel@tonic-gate 	mov	%o1, scr2;				\
2667c478bd9Sstevel@tonic-gate 	mov	%o2, scr3;				\
2677c478bd9Sstevel@tonic-gate 	mov	%o3, scr4;				\
2687c478bd9Sstevel@tonic-gate 	MMU_FAULT_STATUS_AREA(%o2);			\
2697c478bd9Sstevel@tonic-gate 	ldx	[%o2 + MMFSA_D_ADDR], %o0;		\
2707c478bd9Sstevel@tonic-gate 	ldx	[%o2 + MMFSA_D_CTX], %o1;		\
2717c478bd9Sstevel@tonic-gate 	mov	tte, %o2;				\
2727c478bd9Sstevel@tonic-gate 	mov	MAP_DTLB, %o3;				\
2737c478bd9Sstevel@tonic-gate 	ta	MMU_MAP_ADDR;				\
2747c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */				\
2757c478bd9Sstevel@tonic-gate 	brnz,a,pn %o0, ptl1_panic;			\
2767c478bd9Sstevel@tonic-gate 	  mov	PTL1_BAD_HCALL, %g1;			\
2777c478bd9Sstevel@tonic-gate 	/* END CSTYLED */				\
2787c478bd9Sstevel@tonic-gate 	mov	scr1, %o0;				\
2797c478bd9Sstevel@tonic-gate 	mov	scr2, %o1;				\
2807c478bd9Sstevel@tonic-gate 	mov	scr3, %o2;				\
2817c478bd9Sstevel@tonic-gate 	mov	scr4, %o3
2827c478bd9Sstevel@tonic-gate 
2837c478bd9Sstevel@tonic-gate /*
2847c478bd9Sstevel@tonic-gate  * Returns PFN given the TTE and vaddr
2857c478bd9Sstevel@tonic-gate  *
2867c478bd9Sstevel@tonic-gate  * In:
2877c478bd9Sstevel@tonic-gate  *   tte = reg containing tte
2887c478bd9Sstevel@tonic-gate  *   vaddr = reg containing vaddr
2897c478bd9Sstevel@tonic-gate  *   scr1, scr2, scr3 = scratch registers
2907c478bd9Sstevel@tonic-gate  * Out:
2917c478bd9Sstevel@tonic-gate  *   tte = PFN value
2927c478bd9Sstevel@tonic-gate  */
2937c478bd9Sstevel@tonic-gate #define	TTETOPFN(tte, vaddr, label, scr1, scr2, scr3)			\
2947c478bd9Sstevel@tonic-gate 	and	tte, TTE_SZ_BITS, scr1;		/* scr1 = ttesz */	\
2957c478bd9Sstevel@tonic-gate 	sllx	tte, TTE_PA_LSHIFT, tte;				\
2967c478bd9Sstevel@tonic-gate 	sllx	scr1, 1, scr2;						\
2977c478bd9Sstevel@tonic-gate 	add	scr2, scr1, scr2;		/* mulx 3 */		\
2987c478bd9Sstevel@tonic-gate 	add	scr2, MMU_PAGESHIFT + TTE_PA_LSHIFT, scr3;		\
2997c478bd9Sstevel@tonic-gate 	/* CSTYLED */							\
300*5d9d9091SRichard Lowe 	brz,pt	scr2, label##1;					\
3017c478bd9Sstevel@tonic-gate 	srlx	tte, scr3, tte;						\
3027c478bd9Sstevel@tonic-gate 	sllx	tte, scr2, tte;						\
3037c478bd9Sstevel@tonic-gate 	set	1, scr1;						\
3047c478bd9Sstevel@tonic-gate 	add	scr2, MMU_PAGESHIFT, scr3;				\
3057c478bd9Sstevel@tonic-gate 	sllx	scr1, scr3, scr1;					\
3067c478bd9Sstevel@tonic-gate 	sub	scr1, 1, scr1;	/* scr1=TTE_PAGE_OFFSET(ttesz) */	\
3077c478bd9Sstevel@tonic-gate 	and	vaddr, scr1, scr2;					\
3087c478bd9Sstevel@tonic-gate 	srln	scr2, MMU_PAGESHIFT, scr2;				\
3097c478bd9Sstevel@tonic-gate 	or	tte, scr2, tte;						\
3107c478bd9Sstevel@tonic-gate 	/* CSTYLED */							\
311*5d9d9091SRichard Lowe label##1:
3127c478bd9Sstevel@tonic-gate 
3137c478bd9Sstevel@tonic-gate /*
3147c478bd9Sstevel@tonic-gate  * TTE_SET_REF_ML is a macro that updates the reference bit if it is
3157c478bd9Sstevel@tonic-gate  * not already set.
3167c478bd9Sstevel@tonic-gate  *
3177c478bd9Sstevel@tonic-gate  * Parameters:
3187c478bd9Sstevel@tonic-gate  * tte      = reg containing tte
3197c478bd9Sstevel@tonic-gate  * ttepa    = physical pointer to tte
3207c478bd9Sstevel@tonic-gate  * tsbarea  = tsb miss area
3217c478bd9Sstevel@tonic-gate  * tmp1     = tmp reg
3220a90a7fdSAmritpal Sandhu  * tmp2     = tmp reg
3237c478bd9Sstevel@tonic-gate  * label    = temporary label
3247c478bd9Sstevel@tonic-gate  */
3257c478bd9Sstevel@tonic-gate 
3260a90a7fdSAmritpal Sandhu #define	TTE_SET_REF_ML(tte, ttepa, tsbarea, tmp1, tmp2, label)		\
3277c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
3287c478bd9Sstevel@tonic-gate 	/* check reference bit */					\
3297c478bd9Sstevel@tonic-gate 	btst	TTE_REF_INT, tte;					\
330*5d9d9091SRichard Lowe 	bnz,pt	%xcc, label##2;	/* if ref bit set-skip ahead */	\
3317c478bd9Sstevel@tonic-gate 	nop;								\
3327c478bd9Sstevel@tonic-gate 	/* update reference bit */					\
333*5d9d9091SRichard Lowe label##1:								\
3347c478bd9Sstevel@tonic-gate 	or	tte, TTE_REF_INT, tmp1;					\
3357c478bd9Sstevel@tonic-gate 	casxa	[ttepa]ASI_MEM, tte, tmp1; 	/* update ref bit */	\
3367c478bd9Sstevel@tonic-gate 	cmp	tte, tmp1;						\
337*5d9d9091SRichard Lowe 	bne,a,pn %xcc, label##1;					\
3387c478bd9Sstevel@tonic-gate 	ldxa	[ttepa]ASI_MEM, tte;	/* MMU_READTTE through pa */	\
3397c478bd9Sstevel@tonic-gate 	or	tte, TTE_REF_INT, tte;					\
340*5d9d9091SRichard Lowe label##2:								\
3417c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
3427c478bd9Sstevel@tonic-gate 
3437c478bd9Sstevel@tonic-gate 
3447c478bd9Sstevel@tonic-gate /*
3457c478bd9Sstevel@tonic-gate  * TTE_SET_REFMOD_ML is a macro that updates the reference and modify bits
3467c478bd9Sstevel@tonic-gate  * if not already set.
3477c478bd9Sstevel@tonic-gate  *
3487c478bd9Sstevel@tonic-gate  * Parameters:
3497c478bd9Sstevel@tonic-gate  * tte      = reg containing tte
3507c478bd9Sstevel@tonic-gate  * ttepa    = physical pointer to tte
3517c478bd9Sstevel@tonic-gate  * tsbarea  = tsb miss area
3527c478bd9Sstevel@tonic-gate  * tmp1     = tmp reg
3530a90a7fdSAmritpal Sandhu  * tmp2     = tmp reg
3547c478bd9Sstevel@tonic-gate  * label    = temporary label
3557c478bd9Sstevel@tonic-gate  * exitlabel = label where to jump to if write perm bit not set.
3567c478bd9Sstevel@tonic-gate  */
3577c478bd9Sstevel@tonic-gate 
3580a90a7fdSAmritpal Sandhu #define	TTE_SET_REFMOD_ML(tte, ttepa, tsbarea, tmp1, tmp2, label,	\
3597c478bd9Sstevel@tonic-gate 	exitlabel)							\
3607c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
3617c478bd9Sstevel@tonic-gate 	/* check reference bit */					\
3627c478bd9Sstevel@tonic-gate 	btst	TTE_WRPRM_INT, tte;					\
3637c478bd9Sstevel@tonic-gate 	bz,pn	%xcc, exitlabel;	/* exit if wr_perm no set */	\
3647c478bd9Sstevel@tonic-gate 	  btst	TTE_HWWR_INT, tte;					\
365*5d9d9091SRichard Lowe 	bnz,pn	%xcc, label##2;	/* nothing to do */		\
3667c478bd9Sstevel@tonic-gate 	  nop;								\
3677c478bd9Sstevel@tonic-gate 	/* update reference bit */					\
368*5d9d9091SRichard Lowe label##1:								\
3697c478bd9Sstevel@tonic-gate 	or	tte, TTE_HWWR_INT | TTE_REF_INT, tmp1;			\
3707c478bd9Sstevel@tonic-gate 	casxa	[ttepa]ASI_MEM, tte, tmp1; /* update ref/mod bit */	\
3717c478bd9Sstevel@tonic-gate 	cmp	tte, tmp1;						\
372*5d9d9091SRichard Lowe 	bne,a,pn %xcc, label##1;					\
3737c478bd9Sstevel@tonic-gate 	  ldxa	[ttepa]ASI_MEM, tte;	/* MMU_READTTE through pa */	\
3747c478bd9Sstevel@tonic-gate 	or	tte, TTE_HWWR_INT | TTE_REF_INT, tte;			\
375*5d9d9091SRichard Lowe label##2:								\
3767c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
37705d3dc4bSpaulsan /*
37805d3dc4bSpaulsan  * Get TSB base register from the scratchpad for
37905d3dc4bSpaulsan  * shared contexts
38005d3dc4bSpaulsan  *
38105d3dc4bSpaulsan  * In:
38205d3dc4bSpaulsan  *   tsbmiss = pointer to tsbmiss area
38305d3dc4bSpaulsan  *   tsbmissoffset = offset to right tsb pointer
38405d3dc4bSpaulsan  *   tsbreg = scratch
38505d3dc4bSpaulsan  * Out:
38605d3dc4bSpaulsan  *   tsbreg = tsbreg from the specified scratchpad register
38705d3dc4bSpaulsan  */
38805d3dc4bSpaulsan #define	GET_UTSBREG_SHCTX(tsbmiss, tsbmissoffset, tsbreg)		\
38905d3dc4bSpaulsan 	ldx	[tsbmiss + tsbmissoffset], tsbreg
39005d3dc4bSpaulsan 
3917c478bd9Sstevel@tonic-gate 
3927c478bd9Sstevel@tonic-gate /*
3937c478bd9Sstevel@tonic-gate  * Get the location of the TSB entry in the first TSB to probe
3947c478bd9Sstevel@tonic-gate  *
3957c478bd9Sstevel@tonic-gate  * In:
3967c478bd9Sstevel@tonic-gate  *   tagacc = tag access register (not clobbered)
3977c478bd9Sstevel@tonic-gate  *   tsbe, tmp1, tmp2 = scratch registers
3987c478bd9Sstevel@tonic-gate  * Out:
3997c478bd9Sstevel@tonic-gate  *   tsbe = pointer to the tsbe in the 1st TSB
4007c478bd9Sstevel@tonic-gate  */
4017c478bd9Sstevel@tonic-gate 
4027c478bd9Sstevel@tonic-gate #define	GET_1ST_TSBE_PTR(tagacc, tsbe, tmp1, tmp2)			\
4037c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
4047c478bd9Sstevel@tonic-gate 	mov	SCRATCHPAD_UTSBREG1, tmp1				;\
4057c478bd9Sstevel@tonic-gate 	ldxa	[tmp1]ASI_SCRATCHPAD, tsbe	/* get tsbreg */	;\
4067c478bd9Sstevel@tonic-gate 	and	tsbe, TSB_SOFTSZ_MASK, tmp2	/* tmp2=szc */		;\
4077c478bd9Sstevel@tonic-gate 	andn	tsbe, TSB_SOFTSZ_MASK, tsbe	/* tsbbase */		;\
4087c478bd9Sstevel@tonic-gate 	mov	TSB_ENTRIES(0), tmp1	/* nentries in TSB size 0 */	;\
4097c478bd9Sstevel@tonic-gate 	sllx	tmp1, tmp2, tmp1	/* tmp1 = nentries in TSB */	;\
4107c478bd9Sstevel@tonic-gate 	sub	tmp1, 1, tmp1		/* mask = nentries - 1 */	;\
4117c478bd9Sstevel@tonic-gate 	srlx	tagacc, MMU_PAGESHIFT, tmp2 				;\
4127c478bd9Sstevel@tonic-gate 	and	tmp2, tmp1, tmp1	/* tsbent = virtpage & mask */	;\
4137c478bd9Sstevel@tonic-gate 	sllx	tmp1, TSB_ENTRY_SHIFT, tmp1	/* entry num --> ptr */	;\
4147c478bd9Sstevel@tonic-gate 	add	tsbe, tmp1, tsbe	/* add entry offset to TSB base */ ;\
4157c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
4167c478bd9Sstevel@tonic-gate 
4177c478bd9Sstevel@tonic-gate 
4187c478bd9Sstevel@tonic-gate /*
4197c478bd9Sstevel@tonic-gate  * Will probe the first TSB, and if it finds a match, will insert it
4207c478bd9Sstevel@tonic-gate  * into the TLB and retry.
4217c478bd9Sstevel@tonic-gate  *
4227c478bd9Sstevel@tonic-gate  * tsbe_ptr = precomputed first TSB entry pointer (in, ro)
4237c478bd9Sstevel@tonic-gate  * vpg_4m = 4M virtual page number for tag matching  (in, ro)
4247c478bd9Sstevel@tonic-gate  * label = where to branch to if this is a miss (text)
4257c478bd9Sstevel@tonic-gate  * %asi = atomic ASI to use for the TSB access
4267c478bd9Sstevel@tonic-gate  *
4277c478bd9Sstevel@tonic-gate  * For trapstat, we have to explicily use these registers.
4287c478bd9Sstevel@tonic-gate  * g4 = location tag will be retrieved into from TSB (out)
4297c478bd9Sstevel@tonic-gate  * g5 = location data(tte) will be retrieved into from TSB (out)
4307c478bd9Sstevel@tonic-gate  */
4317c478bd9Sstevel@tonic-gate #define	PROBE_1ST_DTSB(tsbe_ptr, vpg_4m, label)	/* g4/g5 clobbered */	\
4327c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
4337c478bd9Sstevel@tonic-gate 	ldda	[tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\
4347c478bd9Sstevel@tonic-gate 	cmp	%g4, vpg_4m		/* compare tag w/ TSB */	;\
435*5d9d9091SRichard Lowe 	bne,pn	%xcc, label##1	/* branch if !match */		;\
4367c478bd9Sstevel@tonic-gate 	  nop								;\
437*5d9d9091SRichard Lowe 	brgez,pn %g5, label##1					;\
4387c478bd9Sstevel@tonic-gate 	  nop								;\
4397c478bd9Sstevel@tonic-gate 	TT_TRACE(trace_tsbhit)						;\
4407c478bd9Sstevel@tonic-gate 	DTLB_STUFF(%g5, %g1, %g2, %g3, %g4)				;\
4417c478bd9Sstevel@tonic-gate 	/* trapstat expects tte in %g5 */				;\
4427c478bd9Sstevel@tonic-gate 	retry				/* retry faulted instruction */	;\
443*5d9d9091SRichard Lowe label##1:								\
4447c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
4457c478bd9Sstevel@tonic-gate 
4467c478bd9Sstevel@tonic-gate 
4477c478bd9Sstevel@tonic-gate /*
4487c478bd9Sstevel@tonic-gate  * Same as above, only if the TTE doesn't have the execute
4497c478bd9Sstevel@tonic-gate  * bit set, will branch to exec_fault directly.
4507c478bd9Sstevel@tonic-gate  */
4517c478bd9Sstevel@tonic-gate #define	PROBE_1ST_ITSB(tsbe_ptr, vpg_4m, label)				\
4527c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
4537c478bd9Sstevel@tonic-gate 	ldda	[tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\
4547c478bd9Sstevel@tonic-gate 	cmp	%g4, vpg_4m		/* compare tag w/ TSB */	;\
455*5d9d9091SRichard Lowe 	bne,pn	%xcc, label##1	/* branch if !match */		;\
4567c478bd9Sstevel@tonic-gate 	  nop								;\
457*5d9d9091SRichard Lowe 	brgez,pn %g5, label##1					;\
4587c478bd9Sstevel@tonic-gate 	  nop								;\
4597c478bd9Sstevel@tonic-gate 	andcc	%g5, TTE_EXECPRM_INT, %g0  /* check execute bit */	;\
4607c478bd9Sstevel@tonic-gate 	bz,pn	%icc, exec_fault					;\
4617c478bd9Sstevel@tonic-gate 	  nop								;\
4627c478bd9Sstevel@tonic-gate 	TT_TRACE(trace_tsbhit)						;\
4637c478bd9Sstevel@tonic-gate 	ITLB_STUFF(%g5, %g1, %g2, %g3, %g4)				;\
4647c478bd9Sstevel@tonic-gate 	retry				/* retry faulted instruction */	;\
465*5d9d9091SRichard Lowe label##1:								\
4667c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
4677c478bd9Sstevel@tonic-gate 
4687c478bd9Sstevel@tonic-gate /*
4697c478bd9Sstevel@tonic-gate  * vpg_4m = 4M virtual page number for tag matching (in)
4707c478bd9Sstevel@tonic-gate  * tsbe_ptr = precomputed second TSB entry pointer (in)
4717c478bd9Sstevel@tonic-gate  * label = label to use to make branch targets unique (text)
4727c478bd9Sstevel@tonic-gate  *
4737c478bd9Sstevel@tonic-gate  * For trapstat, we have to explicity use these registers.
4747c478bd9Sstevel@tonic-gate  * g4 = tag portion of TSBE (out)
4757c478bd9Sstevel@tonic-gate  * g5 = data portion of TSBE (out)
4767c478bd9Sstevel@tonic-gate  */
4777c478bd9Sstevel@tonic-gate #define	PROBE_2ND_DTSB(tsbe_ptr, vpg_4m, label)				\
4787c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
4797c478bd9Sstevel@tonic-gate 	ldda	[tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4  /* g4 = tag, g5 = data */ ;\
4807c478bd9Sstevel@tonic-gate 	/* since we are looking at 2nd tsb, if it's valid, it must be 4M */ ;\
4817c478bd9Sstevel@tonic-gate 	cmp	%g4, vpg_4m						;\
482*5d9d9091SRichard Lowe 	bne,pn	%xcc, label##1					;\
4837c478bd9Sstevel@tonic-gate 	  nop								;\
484*5d9d9091SRichard Lowe 	brgez,pn %g5, label##1					;\
4857c478bd9Sstevel@tonic-gate 	  nop								;\
4867c478bd9Sstevel@tonic-gate 	mov	tsbe_ptr, %g1		/* trace_tsbhit wants ptr in %g1 */ ;\
4877c478bd9Sstevel@tonic-gate 	TT_TRACE(trace_tsbhit)						;\
4887c478bd9Sstevel@tonic-gate 	DTLB_STUFF(%g5, %g1, %g2, %g3, %g4)				;\
4897c478bd9Sstevel@tonic-gate 	/* trapstat expects tte in %g5 */				;\
4907c478bd9Sstevel@tonic-gate 	retry				/* retry faulted instruction */	;\
491*5d9d9091SRichard Lowe label##1:								\
4927c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
4937c478bd9Sstevel@tonic-gate 
4947c478bd9Sstevel@tonic-gate 
4957c478bd9Sstevel@tonic-gate /*
4967c478bd9Sstevel@tonic-gate  * Same as above, with the following additions:
4977c478bd9Sstevel@tonic-gate  * If the TTE found is not executable, branch directly
4987c478bd9Sstevel@tonic-gate  * to exec_fault.  If a TSB miss, branch to TSB miss handler.
4997c478bd9Sstevel@tonic-gate  */
5007c478bd9Sstevel@tonic-gate #define	PROBE_2ND_ITSB(tsbe_ptr, vpg_4m)				\
5017c478bd9Sstevel@tonic-gate 	/* BEGIN CSTYLED */						\
5027c478bd9Sstevel@tonic-gate 	ldda	[tsbe_ptr]ASI_QUAD_LDD_PHYS, %g4 /* g4 = tag, g5 = data */ ;\
5037c478bd9Sstevel@tonic-gate 	cmp	%g4, vpg_4m		/* compare tag w/ TSB */	;\
5047c478bd9Sstevel@tonic-gate 	bne,pn	%xcc, sfmmu_tsb_miss_tt	/* branch if !match */		;\
5057c478bd9Sstevel@tonic-gate 	  nop								;\
5067c478bd9Sstevel@tonic-gate 	brgez,pn %g5, sfmmu_tsb_miss_tt					;\
5077c478bd9Sstevel@tonic-gate 	  nop								;\
5087c478bd9Sstevel@tonic-gate 	andcc	%g5, TTE_EXECPRM_INT, %g0  /* check execute bit */	;\
5097c478bd9Sstevel@tonic-gate 	bz,pn	%icc, exec_fault					;\
5107c478bd9Sstevel@tonic-gate 	  mov	tsbe_ptr, %g1		/* trap trace wants ptr in %g1 */ ;\
5117c478bd9Sstevel@tonic-gate 	TT_TRACE(trace_tsbhit)						;\
5127c478bd9Sstevel@tonic-gate 	ITLB_STUFF(%g5, %g1, %g2, %g3, %g4)				;\
5137c478bd9Sstevel@tonic-gate 	retry				/* retry faulted instruction */	\
5147c478bd9Sstevel@tonic-gate 	/* END CSTYLED */
5157c478bd9Sstevel@tonic-gate 
51605d3dc4bSpaulsan /*
51705d3dc4bSpaulsan  * 1. Get ctx1. The traptype is supplied by caller.
51805d3dc4bSpaulsan  * 2. If iTSB miss, store in MMFSA_I_CTX
51905d3dc4bSpaulsan  * 3. if dTSB miss, store in MMFSA_D_CTX
52005d3dc4bSpaulsan  * 4. Thus the [D|I]TLB_STUFF will work as expected.
52105d3dc4bSpaulsan  */
52205d3dc4bSpaulsan #define	SAVE_CTX1(traptype, ctx1, tmp, label)				\
52305d3dc4bSpaulsan 	/* BEGIN CSTYLED */						\
52405d3dc4bSpaulsan 	mov	MMU_SCONTEXT1, tmp					;\
52505d3dc4bSpaulsan 	ldxa	[tmp]ASI_MMU_CTX, ctx1					;\
52605d3dc4bSpaulsan 	MMU_FAULT_STATUS_AREA(tmp)					;\
52705d3dc4bSpaulsan 	cmp     traptype, FAST_IMMU_MISS_TT				;\
52805d3dc4bSpaulsan 	be,a,pn %icc, label						;\
52905d3dc4bSpaulsan 	  stx	ctx1, [tmp + MMFSA_I_CTX] 				;\
53005d3dc4bSpaulsan 	cmp     traptype, T_INSTR_MMU_MISS				;\
53105d3dc4bSpaulsan 	be,a,pn %icc, label						;\
53205d3dc4bSpaulsan 	  stx	ctx1, [tmp + MMFSA_I_CTX]				;\
53305d3dc4bSpaulsan 	stx	ctx1, [tmp + MMFSA_D_CTX]				;\
53405d3dc4bSpaulsan label:
53505d3dc4bSpaulsan 	/* END CSTYLED */
53605d3dc4bSpaulsan 
5377c478bd9Sstevel@tonic-gate #endif /* _ASM */
5387c478bd9Sstevel@tonic-gate 
5397c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
5407c478bd9Sstevel@tonic-gate }
5417c478bd9Sstevel@tonic-gate #endif
5427c478bd9Sstevel@tonic-gate 
5437c478bd9Sstevel@tonic-gate #endif	/* _VM_MACH_SFMMU_H */
544