xref: /titanic_53/usr/src/uts/sun4u/sys/mmu.h (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate #ifndef	_SYS_MMU_H
28*7c478bd9Sstevel@tonic-gate #define	_SYS_MMU_H
29*7c478bd9Sstevel@tonic-gate 
30*7c478bd9Sstevel@tonic-gate #pragma ident	"%Z%%M%	%I%	%E% SMI"
31*7c478bd9Sstevel@tonic-gate 
32*7c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
33*7c478bd9Sstevel@tonic-gate extern "C" {
34*7c478bd9Sstevel@tonic-gate #endif
35*7c478bd9Sstevel@tonic-gate 
36*7c478bd9Sstevel@tonic-gate /*
37*7c478bd9Sstevel@tonic-gate  * Definitions for the SOFT MMU
38*7c478bd9Sstevel@tonic-gate  */
39*7c478bd9Sstevel@tonic-gate 
40*7c478bd9Sstevel@tonic-gate #define	FAST_IMMU_MISS_TT	0x64
41*7c478bd9Sstevel@tonic-gate #define	FAST_DMMU_MISS_TT	0x68
42*7c478bd9Sstevel@tonic-gate #define	FAST_PROT_TT		0x6c
43*7c478bd9Sstevel@tonic-gate 
44*7c478bd9Sstevel@tonic-gate /*
45*7c478bd9Sstevel@tonic-gate  * Constants defining alternate spaces
46*7c478bd9Sstevel@tonic-gate  * and register layouts within them,
47*7c478bd9Sstevel@tonic-gate  * and a few other interesting assembly constants.
48*7c478bd9Sstevel@tonic-gate  */
49*7c478bd9Sstevel@tonic-gate 
50*7c478bd9Sstevel@tonic-gate /*
51*7c478bd9Sstevel@tonic-gate  * vaddr offsets of various registers
52*7c478bd9Sstevel@tonic-gate  */
53*7c478bd9Sstevel@tonic-gate #define	MMU_TTARGET		0x00 /* TSB tag target */
54*7c478bd9Sstevel@tonic-gate #define	MMU_PCONTEXT		0x08 /* primary context number */
55*7c478bd9Sstevel@tonic-gate #define	MMU_SCONTEXT		0x10 /* secondary context number */
56*7c478bd9Sstevel@tonic-gate #define	MMU_SFSR		0x18 /* sync fault status reg */
57*7c478bd9Sstevel@tonic-gate #define	MMU_SFAR		0x20 /* sync fault addr reg */
58*7c478bd9Sstevel@tonic-gate #define	MMU_TSB			0x28 /* tsb base and config */
59*7c478bd9Sstevel@tonic-gate #define	MMU_TAG_ACCESS		0x30 /* tlb tag access */
60*7c478bd9Sstevel@tonic-gate #define	MMU_VAW			0x38 /* virtual watchpoint */
61*7c478bd9Sstevel@tonic-gate #define	MMU_PAW			0x40 /* physical watchpoint */
62*7c478bd9Sstevel@tonic-gate #define	MMU_TSB_PX		0x48 /* i/d tsb primary extension reg */
63*7c478bd9Sstevel@tonic-gate #define	MMU_TSB_SX		0x50 /* d tsb secondary extension reg */
64*7c478bd9Sstevel@tonic-gate #define	MMU_TSB_NX		0x58 /* i/d tsb nucleus extension reg */
65*7c478bd9Sstevel@tonic-gate #define	MMU_TAG_ACCESS_EXT	0x60 /* tlb tag access extension reg */
66*7c478bd9Sstevel@tonic-gate 
67*7c478bd9Sstevel@tonic-gate 
68*7c478bd9Sstevel@tonic-gate 
69*7c478bd9Sstevel@tonic-gate /*
70*7c478bd9Sstevel@tonic-gate  * Synchronous Fault Status Register Layout
71*7c478bd9Sstevel@tonic-gate  *
72*7c478bd9Sstevel@tonic-gate  * IMMU and DMMU maintain their own SFSR Register
73*7c478bd9Sstevel@tonic-gate  * ______________________________________________________________________
74*7c478bd9Sstevel@tonic-gate  * |   Reserved   |  ASI | Reserved | FT | E | Cntx | PRIV | W | OW | FV|
75*7c478bd9Sstevel@tonic-gate  * |--------------|------|----------|----|---|------|------|---|----|---|
76*7c478bd9Sstevel@tonic-gate  *  63		24 23  16 15	  14 13 7  6  5	   4	3    2	  1   0
77*7c478bd9Sstevel@tonic-gate  *
78*7c478bd9Sstevel@tonic-gate  */
79*7c478bd9Sstevel@tonic-gate #define	SFSR_FV		0x00000001	/* fault valid */
80*7c478bd9Sstevel@tonic-gate #define	SFSR_OW		0x00000002	/* overwrite */
81*7c478bd9Sstevel@tonic-gate #define	SFSR_W		0x00000004	/* data write */
82*7c478bd9Sstevel@tonic-gate #define	SFSR_PR		0x00000008	/* privilege mode */
83*7c478bd9Sstevel@tonic-gate #define	SFSR_CTX	0x00000030	/* context id */
84*7c478bd9Sstevel@tonic-gate #define	SFSR_E		0x00000040	/* side-effect */
85*7c478bd9Sstevel@tonic-gate #define	SFSR_FT		0x00003F80	/* fault type mask */
86*7c478bd9Sstevel@tonic-gate #define	SFSR_ASI	0x00FF0000	/* ASI */
87*7c478bd9Sstevel@tonic-gate 
88*7c478bd9Sstevel@tonic-gate /*
89*7c478bd9Sstevel@tonic-gate  * Definition of FT (Fault Type) bit field of sfsr.
90*7c478bd9Sstevel@tonic-gate  */
91*7c478bd9Sstevel@tonic-gate #define	FT_NONE		0x00
92*7c478bd9Sstevel@tonic-gate #define	FT_PRIV		0x01		/* privilege violation */
93*7c478bd9Sstevel@tonic-gate #define	FT_SPEC_LD	0x02		/* speculative ld to e page */
94*7c478bd9Sstevel@tonic-gate #define	FT_ATOMIC_NC	0x04		/* atomic to nc page */
95*7c478bd9Sstevel@tonic-gate #define	FT_ILL_ALT	0x08		/* illegal lda/sta */
96*7c478bd9Sstevel@tonic-gate #define	FT_NFO		0x10		/* normal access to nfo page */
97*7c478bd9Sstevel@tonic-gate #define	FT_RANGE	0x20		/* dmmu or immu address out of range */
98*7c478bd9Sstevel@tonic-gate #define	FT_RANGE_REG	0x40		/* jump to reg out of range */
99*7c478bd9Sstevel@tonic-gate #define	SFSR_FT_SHIFT	7	/* amt. to shift right to get flt type */
100*7c478bd9Sstevel@tonic-gate #define	X_FAULT_TYPE(x)	(((x) & SFSR_FT) >> SFSR_FT_SHIFT)
101*7c478bd9Sstevel@tonic-gate 
102*7c478bd9Sstevel@tonic-gate /*
103*7c478bd9Sstevel@tonic-gate  * Defines for CT (ConText id) bit field of sfsr.
104*7c478bd9Sstevel@tonic-gate  */
105*7c478bd9Sstevel@tonic-gate #define	CT_PRIMARY	0x0	/* primary */
106*7c478bd9Sstevel@tonic-gate #define	CT_SECONDARY	0x1	/* secondary */
107*7c478bd9Sstevel@tonic-gate #define	CT_NUCLEUS	0x2	/* nucleus */
108*7c478bd9Sstevel@tonic-gate #define	SFSR_CT_SHIFT	4
109*7c478bd9Sstevel@tonic-gate 
110*7c478bd9Sstevel@tonic-gate #define	SFSR_ASI_SHIFT	16
111*7c478bd9Sstevel@tonic-gate 
112*7c478bd9Sstevel@tonic-gate /*
113*7c478bd9Sstevel@tonic-gate  * MMU TAG TARGET register Layout
114*7c478bd9Sstevel@tonic-gate  *
115*7c478bd9Sstevel@tonic-gate  * +-----+---------+------+-------------------------+
116*7c478bd9Sstevel@tonic-gate  * | 000 | context |  --  | virtual address [63:22] |
117*7c478bd9Sstevel@tonic-gate  * +-----+---------+------+-------------------------+
118*7c478bd9Sstevel@tonic-gate  *  63 61 60	 48 47	42 41			   0
119*7c478bd9Sstevel@tonic-gate  */
120*7c478bd9Sstevel@tonic-gate #define	TTARGET_CTX_SHIFT	48
121*7c478bd9Sstevel@tonic-gate #define	TTARGET_VA_SHIFT	22
122*7c478bd9Sstevel@tonic-gate 
123*7c478bd9Sstevel@tonic-gate /*
124*7c478bd9Sstevel@tonic-gate  * MMU TAG ACCESS register Layout
125*7c478bd9Sstevel@tonic-gate  *
126*7c478bd9Sstevel@tonic-gate  * +-------------------------+------------------+
127*7c478bd9Sstevel@tonic-gate  * | virtual address [63:13] |  context [12:0]  |
128*7c478bd9Sstevel@tonic-gate  * +-------------------------+------------------+
129*7c478bd9Sstevel@tonic-gate  *  63			  13	12		0
130*7c478bd9Sstevel@tonic-gate  */
131*7c478bd9Sstevel@tonic-gate #define	TAGACC_CTX_MASK		0x1FFF
132*7c478bd9Sstevel@tonic-gate #define	TAGACC_SHIFT		13
133*7c478bd9Sstevel@tonic-gate #define	TAGACC_VADDR_MASK	(~TAGACC_CTX_MASK)
134*7c478bd9Sstevel@tonic-gate #define	TAGACC_CTX_LSHIFT	(64 - TAGACC_SHIFT)
135*7c478bd9Sstevel@tonic-gate 
136*7c478bd9Sstevel@tonic-gate /*
137*7c478bd9Sstevel@tonic-gate  * MMU DEMAP Register Layout
138*7c478bd9Sstevel@tonic-gate  *
139*7c478bd9Sstevel@tonic-gate  * +-------------------------+------+------+---------+-----+
140*7c478bd9Sstevel@tonic-gate  * | virtual address [63:13] | rsvd | type | context |  0  |
141*7c478bd9Sstevel@tonic-gate  * +-------------------------+------+------+---------+-----+
142*7c478bd9Sstevel@tonic-gate  *  63			   13 12   8  7   6   5	    4 3   0
143*7c478bd9Sstevel@tonic-gate  */
144*7c478bd9Sstevel@tonic-gate #define	DEMAP_PRIMARY		(CT_PRIMARY << SFSR_CT_SHIFT)
145*7c478bd9Sstevel@tonic-gate #define	DEMAP_SECOND		(CT_SECONDARY << SFSR_CT_SHIFT)
146*7c478bd9Sstevel@tonic-gate #define	DEMAP_NUCLEUS		(CT_NUCLEUS << SFSR_CT_SHIFT)
147*7c478bd9Sstevel@tonic-gate #define	DEMAP_TYPE_SHIFT	6
148*7c478bd9Sstevel@tonic-gate #define	DEMAP_PAGE_TYPE		(0 << DEMAP_TYPE_SHIFT)
149*7c478bd9Sstevel@tonic-gate #define	DEMAP_CTX_TYPE		(1 << DEMAP_TYPE_SHIFT)
150*7c478bd9Sstevel@tonic-gate #define	DEMAP_ALL_TYPE		(2 << DEMAP_TYPE_SHIFT)
151*7c478bd9Sstevel@tonic-gate 
152*7c478bd9Sstevel@tonic-gate /*
153*7c478bd9Sstevel@tonic-gate  * TLB DATA ACCESS Address Layout
154*7c478bd9Sstevel@tonic-gate  *
155*7c478bd9Sstevel@tonic-gate  * +-------------+---------------+---+
156*7c478bd9Sstevel@tonic-gate  * +   Not used	 |   tlb entry	 | 0 |
157*7c478bd9Sstevel@tonic-gate  * +-------------+---------------+---+
158*7c478bd9Sstevel@tonic-gate  *  63		9 8		3 2  0
159*7c478bd9Sstevel@tonic-gate  */
160*7c478bd9Sstevel@tonic-gate #define	DTACC_SHIFT	0x3
161*7c478bd9Sstevel@tonic-gate #define	DTACC_INC	0x8
162*7c478bd9Sstevel@tonic-gate 
163*7c478bd9Sstevel@tonic-gate /*
164*7c478bd9Sstevel@tonic-gate  * TSB Register Layout
165*7c478bd9Sstevel@tonic-gate  *
166*7c478bd9Sstevel@tonic-gate  * split will always be 0.  It will not be supported by software.
167*7c478bd9Sstevel@tonic-gate  *
168*7c478bd9Sstevel@tonic-gate  * +----------------------+-------+-----+-------+
169*7c478bd9Sstevel@tonic-gate  * +  tsb_base va [63:13] | split |  -  |  size |
170*7c478bd9Sstevel@tonic-gate  * +----------------------+-------+-----+-------+
171*7c478bd9Sstevel@tonic-gate  *  63			13   12	    11 3 2	0
172*7c478bd9Sstevel@tonic-gate  */
173*7c478bd9Sstevel@tonic-gate #define	TSBBASE_SHIFT		13
174*7c478bd9Sstevel@tonic-gate #define	TSB_SZ_MASK		0x7
175*7c478bd9Sstevel@tonic-gate 
176*7c478bd9Sstevel@tonic-gate /*
177*7c478bd9Sstevel@tonic-gate  * MMU TAG READ register Layout
178*7c478bd9Sstevel@tonic-gate  *
179*7c478bd9Sstevel@tonic-gate  * +-------------------------+------------------+
180*7c478bd9Sstevel@tonic-gate  * | virtual address [63:13] |  context [12:0]  |
181*7c478bd9Sstevel@tonic-gate  * +-------------------------+------------------+
182*7c478bd9Sstevel@tonic-gate  *  63			  13	12		0
183*7c478bd9Sstevel@tonic-gate  */
184*7c478bd9Sstevel@tonic-gate #define	TAGREAD_CTX_MASK	0x1FFF
185*7c478bd9Sstevel@tonic-gate #define	TAGREAD_SHIFT		13
186*7c478bd9Sstevel@tonic-gate #define	TAGREAD_VADDR_MASK	(~TAGREAD_CTX_MASK)
187*7c478bd9Sstevel@tonic-gate 
188*7c478bd9Sstevel@tonic-gate /*
189*7c478bd9Sstevel@tonic-gate  * MMU TAG ACCESS EXTENSION register Layout
190*7c478bd9Sstevel@tonic-gate  *
191*7c478bd9Sstevel@tonic-gate  * DTLB only
192*7c478bd9Sstevel@tonic-gate  * +-----+-------+-------+-----+
193*7c478bd9Sstevel@tonic-gate  * |  -  | pgsz1 | pgsz0 |  -  |
194*7c478bd9Sstevel@tonic-gate  * +-----+-------+-------+-----+
195*7c478bd9Sstevel@tonic-gate  *  63    21   19 18   16 15  0
196*7c478bd9Sstevel@tonic-gate  */
197*7c478bd9Sstevel@tonic-gate #define	TAGACCEXT_SHIFT		16
198*7c478bd9Sstevel@tonic-gate #define	TAGACCEXT_MKSZPAIR(SZ1, SZ0)	(((SZ1) << 3) | (SZ0))
199*7c478bd9Sstevel@tonic-gate 
200*7c478bd9Sstevel@tonic-gate /*
201*7c478bd9Sstevel@tonic-gate  * MMU PRIMARY/SECONDARY CONTEXT register
202*7c478bd9Sstevel@tonic-gate  */
203*7c478bd9Sstevel@tonic-gate #define	CTXREG_CTX_MASK		0x1FFF
204*7c478bd9Sstevel@tonic-gate #define	CTXREG_EXT_SHIFT	16
205*7c478bd9Sstevel@tonic-gate #define	CTXREG_NEXT_SHIFT	58
206*7c478bd9Sstevel@tonic-gate 
207*7c478bd9Sstevel@tonic-gate /*
208*7c478bd9Sstevel@tonic-gate  * The kernel always runs in KCONTEXT, and no user mappings
209*7c478bd9Sstevel@tonic-gate  * are ever valid in it (so any user access pagefaults).
210*7c478bd9Sstevel@tonic-gate  */
211*7c478bd9Sstevel@tonic-gate #define	KCONTEXT	0
212*7c478bd9Sstevel@tonic-gate 
213*7c478bd9Sstevel@tonic-gate /*
214*7c478bd9Sstevel@tonic-gate  * FLUSH_ADDR is used in the flush instruction to guarantee stores to mmu
215*7c478bd9Sstevel@tonic-gate  * registers complete.  It is selected so it won't miss in the tlb.
216*7c478bd9Sstevel@tonic-gate  */
217*7c478bd9Sstevel@tonic-gate #define	FLUSH_ADDR	(KERNELBASE + 2 * MMU_PAGESIZE4M)
218*7c478bd9Sstevel@tonic-gate 
219*7c478bd9Sstevel@tonic-gate #ifdef	__cplusplus
220*7c478bd9Sstevel@tonic-gate }
221*7c478bd9Sstevel@tonic-gate #endif
222*7c478bd9Sstevel@tonic-gate 
223*7c478bd9Sstevel@tonic-gate #endif /* _SYS_MMU_H */
224