xref: /freebsd/sys/arm/include/pte.h (revision 95ee2897e98f5d444f26ed2334cc7c439f9c16c6)
1*29629d9eSAndrew Turner /*-
2*29629d9eSAndrew Turner  * Copyright 2014 Svatopluk Kraus <onwahe@gmail.com>
3*29629d9eSAndrew Turner  * Copyright 2014 Michal Meloun <meloun@miracle.cz>
4*29629d9eSAndrew Turner  * All rights reserved.
5*29629d9eSAndrew Turner  *
6*29629d9eSAndrew Turner  * Redistribution and use in source and binary forms, with or without
7*29629d9eSAndrew Turner  * modification, are permitted provided that the following conditions
8*29629d9eSAndrew Turner  * are met:
9*29629d9eSAndrew Turner  * 1. Redistributions of source code must retain the above copyright
10*29629d9eSAndrew Turner  *    notice, this list of conditions and the following disclaimer.
11*29629d9eSAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright
12*29629d9eSAndrew Turner  *    notice, this list of conditions and the following disclaimer in the
13*29629d9eSAndrew Turner  *    documentation and/or other materials provided with the distribution.
14*29629d9eSAndrew Turner  *
15*29629d9eSAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16*29629d9eSAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17*29629d9eSAndrew Turner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18*29629d9eSAndrew Turner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19*29629d9eSAndrew Turner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20*29629d9eSAndrew Turner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21*29629d9eSAndrew Turner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22*29629d9eSAndrew Turner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23*29629d9eSAndrew Turner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*29629d9eSAndrew Turner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*29629d9eSAndrew Turner  * SUCH DAMAGE.
26*29629d9eSAndrew Turner  */
27*29629d9eSAndrew Turner 
28*29629d9eSAndrew Turner #ifndef _MACHINE_PTE_V6_H_
29*29629d9eSAndrew Turner #define _MACHINE_PTE_V6_H_
30*29629d9eSAndrew Turner 
31*29629d9eSAndrew Turner /*
32*29629d9eSAndrew Turner  * Domain Types	for the	Domain Access Control Register.
33*29629d9eSAndrew Turner  */
34*29629d9eSAndrew Turner #define	DOMAIN_FAULT	0x00	/* no access */
35*29629d9eSAndrew Turner #define	DOMAIN_CLIENT	0x01	/* client */
36*29629d9eSAndrew Turner #define	DOMAIN_RESERVED	0x02	/* reserved */
37*29629d9eSAndrew Turner #define	DOMAIN_MANAGER	0x03	/* manager */
38*29629d9eSAndrew Turner 
39*29629d9eSAndrew Turner /*
40*29629d9eSAndrew Turner  * TEX remap registers attributes
41*29629d9eSAndrew Turner  */
42*29629d9eSAndrew Turner #define	PRRR_SO		0	/* Strongly ordered memory */
43*29629d9eSAndrew Turner #define	PRRR_DEV	1	/* Device memory */
44*29629d9eSAndrew Turner #define	PRRR_MEM	2	/* Normal memory */
45*29629d9eSAndrew Turner #define	PRRR_DS0	(1 << 16) /* Shared bit for Device, S = 0 */
46*29629d9eSAndrew Turner #define	PRRR_DS1	(1 << 17) /* Shared bit for Device, S = 1 */
47*29629d9eSAndrew Turner #define	PRRR_NS0	(1 << 18) /* Shared bit for Normal, S = 0 */
48*29629d9eSAndrew Turner #define	PRRR_NS1	(1 << 19) /* Shared bit for Normal, S = 1 */
49*29629d9eSAndrew Turner #define	PRRR_NOS_SHIFT	24 	/* base shif for Not Outer Shared bits */
50*29629d9eSAndrew Turner 
51*29629d9eSAndrew Turner #define	NMRR_NC		0	/* Noncachable*/
52*29629d9eSAndrew Turner #define	NMRR_WB_WA	1	/* Write Back, Write Allocate */
53*29629d9eSAndrew Turner #define	NMRR_WT		2	/* Write Through, Non-Write Allocate */
54*29629d9eSAndrew Turner #define	NMRR_WB		3	/* Write Back, Non-Write Allocate */
55*29629d9eSAndrew Turner 
56*29629d9eSAndrew Turner /*
57*29629d9eSAndrew Turner  *
58*29629d9eSAndrew Turner  * The ARM MMU is capable of mapping memory in the following chunks:
59*29629d9eSAndrew Turner  *
60*29629d9eSAndrew Turner  *	16M	Supersections (L1 table)
61*29629d9eSAndrew Turner  *
62*29629d9eSAndrew Turner  *	1M	Sections (L1 table)
63*29629d9eSAndrew Turner  *
64*29629d9eSAndrew Turner  *	64K	Large Pages (L2	table)
65*29629d9eSAndrew Turner  *
66*29629d9eSAndrew Turner  *	4K	Small Pages (L2	table)
67*29629d9eSAndrew Turner  *
68*29629d9eSAndrew Turner  *
69*29629d9eSAndrew Turner  * Coarse Tables can map Large and Small Pages.
70*29629d9eSAndrew Turner  * Coarse Tables are 1K in length.
71*29629d9eSAndrew Turner  *
72*29629d9eSAndrew Turner  * The Translation Table Base register holds the pointer to the
73*29629d9eSAndrew Turner  * L1 Table.  The L1 Table is a 16K contiguous chunk of memory
74*29629d9eSAndrew Turner  * aligned to a 16K boundary.  Each entry in the L1 Table maps
75*29629d9eSAndrew Turner  * 1M of virtual address space, either via a Section mapping or
76*29629d9eSAndrew Turner  * via an L2 Table.
77*29629d9eSAndrew Turner  *
78*29629d9eSAndrew Turner  */
79*29629d9eSAndrew Turner #define	L1_TABLE_SIZE	0x4000		/* 16K */
80*29629d9eSAndrew Turner #define	L1_ENTRIES	0x1000		/*  4K */
81*29629d9eSAndrew Turner #define	L2_TABLE_SIZE	0x0400		/*  1K */
82*29629d9eSAndrew Turner #define	L2_ENTRIES	0x0100		/* 256 */
83*29629d9eSAndrew Turner 
84*29629d9eSAndrew Turner /* ARMv6 super-sections. */
85*29629d9eSAndrew Turner #define	L1_SUP_SIZE	0x01000000	/* 16M */
86*29629d9eSAndrew Turner #define	L1_SUP_OFFSET	(L1_SUP_SIZE - 1)
87*29629d9eSAndrew Turner #define	L1_SUP_FRAME	(~L1_SUP_OFFSET)
88*29629d9eSAndrew Turner #define	L1_SUP_SHIFT	24
89*29629d9eSAndrew Turner 
90*29629d9eSAndrew Turner #define	L1_S_SIZE	0x00100000	/* 1M */
91*29629d9eSAndrew Turner #define	L1_S_OFFSET	(L1_S_SIZE - 1)
92*29629d9eSAndrew Turner #define	L1_S_FRAME	(~L1_S_OFFSET)
93*29629d9eSAndrew Turner #define	L1_S_SHIFT	20
94*29629d9eSAndrew Turner 
95*29629d9eSAndrew Turner #define	L2_L_SIZE	0x00010000	/* 64K */
96*29629d9eSAndrew Turner #define	L2_L_OFFSET	(L2_L_SIZE - 1)
97*29629d9eSAndrew Turner #define	L2_L_FRAME	(~L2_L_OFFSET)
98*29629d9eSAndrew Turner #define	L2_L_SHIFT	16
99*29629d9eSAndrew Turner 
100*29629d9eSAndrew Turner #define	L2_S_SIZE	0x00001000	/* 4K */
101*29629d9eSAndrew Turner #define	L2_S_OFFSET	(L2_S_SIZE - 1)
102*29629d9eSAndrew Turner #define	L2_S_FRAME	(~L2_S_OFFSET)
103*29629d9eSAndrew Turner #define	L2_S_SHIFT	12
104*29629d9eSAndrew Turner 
105*29629d9eSAndrew Turner /*
106*29629d9eSAndrew Turner  * ARM MMU L1 Descriptors
107*29629d9eSAndrew Turner  */
108*29629d9eSAndrew Turner #define	L1_TYPE_INV	0x00		/* Invalid (fault) */
109*29629d9eSAndrew Turner #define	L1_TYPE_C	0x01		/* Coarse L2 */
110*29629d9eSAndrew Turner #define	L1_TYPE_S	0x02		/* Section */
111*29629d9eSAndrew Turner #define	L1_TYPE_MASK	0x03		/* Mask	of type	bits */
112*29629d9eSAndrew Turner 
113*29629d9eSAndrew Turner /* L1 Section Descriptor */
114*29629d9eSAndrew Turner #define	L1_S_B		0x00000004	/* bufferable Section */
115*29629d9eSAndrew Turner #define	L1_S_C		0x00000008	/* cacheable Section */
116*29629d9eSAndrew Turner #define	L1_S_NX		0x00000010	/* not executeable */
117*29629d9eSAndrew Turner #define	L1_S_DOM(x)	((x) <<	5)	/* domain */
118*29629d9eSAndrew Turner #define	L1_S_DOM_MASK	L1_S_DOM(0xf)
119*29629d9eSAndrew Turner #define	L1_S_P		0x00000200	/* ECC enable for this section */
120*29629d9eSAndrew Turner #define	L1_S_AP(x)	((x) <<	10)	/* access permissions */
121*29629d9eSAndrew Turner #define	L1_S_AP0	0x00000400	/* access permissions bit 0 */
122*29629d9eSAndrew Turner #define	L1_S_AP1	0x00000800	/* access permissions bit 1 */
123*29629d9eSAndrew Turner #define	L1_S_TEX(x)	((x) <<	12)	/* type	extension */
124*29629d9eSAndrew Turner #define	L1_S_TEX0	0x00001000	/* type	extension bit 0	*/
125*29629d9eSAndrew Turner #define	L1_S_TEX1	0x00002000	/* type	extension bit 1	*/
126*29629d9eSAndrew Turner #define	L1_S_TEX2	0x00004000	/* type	extension bit 2	*/
127*29629d9eSAndrew Turner #define	L1_S_AP2	0x00008000	/* access permissions bit 2 */
128*29629d9eSAndrew Turner #define	L1_S_SHARED	0x00010000	/* shared */
129*29629d9eSAndrew Turner #define	L1_S_NG		0x00020000	/* not global */
130*29629d9eSAndrew Turner #define	L1_S_SUPERSEC	0x00040000	/* Section is a	super-section. */
131*29629d9eSAndrew Turner #define	L1_S_ADDR_MASK	0xfff00000	/* phys	address	of section */
132*29629d9eSAndrew Turner 
133*29629d9eSAndrew Turner /* L1 Coarse Descriptor	*/
134*29629d9eSAndrew Turner #define	L1_C_DOM(x)	((x) <<	5)	/* domain */
135*29629d9eSAndrew Turner #define	L1_C_DOM_MASK	L1_C_DOM(0xf)
136*29629d9eSAndrew Turner #define	L1_C_P		0x00000200	/* ECC enable for this section */
137*29629d9eSAndrew Turner #define	L1_C_ADDR_MASK	0xfffffc00	/* phys	address	of L2 Table */
138*29629d9eSAndrew Turner 
139*29629d9eSAndrew Turner /*
140*29629d9eSAndrew Turner  * ARM MMU L2 Descriptors
141*29629d9eSAndrew Turner  */
142*29629d9eSAndrew Turner #define	L2_TYPE_INV	0x00		/* Invalid (fault) */
143*29629d9eSAndrew Turner #define	L2_TYPE_L	0x01		/* Large Page  - 64k - not used yet*/
144*29629d9eSAndrew Turner #define	L2_TYPE_S	0x02		/* Small Page  - 4 */
145*29629d9eSAndrew Turner #define	L2_TYPE_MASK	0x03
146*29629d9eSAndrew Turner 
147*29629d9eSAndrew Turner #define	L2_NX		0x00000001	/* Not executable */
148*29629d9eSAndrew Turner #define	L2_B		0x00000004	/* Bufferable page */
149*29629d9eSAndrew Turner #define	L2_C		0x00000008	/* Cacheable page */
150*29629d9eSAndrew Turner #define	L2_CB_SHIFT		2	/* C,B bit field shift */
151*29629d9eSAndrew Turner #define	L2_AP(x)	((x) <<	4)
152*29629d9eSAndrew Turner #define	L2_AP0		0x00000010	/* access permissions bit 0*/
153*29629d9eSAndrew Turner #define	L2_AP1		0x00000020	/* access permissions bit 1*/
154*29629d9eSAndrew Turner #define	L2_TEX_SHIFT		6	/* type extension field shift */
155*29629d9eSAndrew Turner #define	L2_TEX(x)	((x) <<	L2_TEX_SHIFT)	/* type	extension */
156*29629d9eSAndrew Turner #define	L2_TEX0		0x00000040	/* type	extension bit 0	*/
157*29629d9eSAndrew Turner #define	L2_TEX1		0x00000080	/* type	extension bit 1	*/
158*29629d9eSAndrew Turner #define	L2_TEX2		0x00000100	/* type	extension bit 2	*/
159*29629d9eSAndrew Turner #define	L2_AP2		0x00000200	/* access permissions  bit 2*/
160*29629d9eSAndrew Turner #define	L2_SHARED	0x00000400	/* shared */
161*29629d9eSAndrew Turner #define	L2_NG		0x00000800	/* not global */
162*29629d9eSAndrew Turner 
163*29629d9eSAndrew Turner /*
164*29629d9eSAndrew Turner  * TEX classes encoding
165*29629d9eSAndrew Turner  */
166*29629d9eSAndrew Turner #define	TEX1_CLASS_0	 (			    0)
167*29629d9eSAndrew Turner #define	TEX1_CLASS_1	 (		       L1_S_B)
168*29629d9eSAndrew Turner #define	TEX1_CLASS_2	 (	      L1_S_C	     )
169*29629d9eSAndrew Turner #define	TEX1_CLASS_3	 (	      L1_S_C | L1_S_B)
170*29629d9eSAndrew Turner #define	TEX1_CLASS_4	 (L1_S_TEX0		     )
171*29629d9eSAndrew Turner #define	TEX1_CLASS_5	 (L1_S_TEX0 |	       L1_S_B)
172*29629d9eSAndrew Turner #define	TEX1_CLASS_6	 (L1_S_TEX0 | L1_S_C	     )	/* Reserved for	ARM11 */
173*29629d9eSAndrew Turner #define	TEX1_CLASS_7	 (L1_S_TEX0 | L1_S_C | L1_S_B)
174*29629d9eSAndrew Turner 
175*29629d9eSAndrew Turner #define	TEX2_CLASS_0	 (		      0)
176*29629d9eSAndrew Turner #define	TEX2_CLASS_1	 (		   L2_B)
177*29629d9eSAndrew Turner #define	TEX2_CLASS_2	 (	    L2_C       )
178*29629d9eSAndrew Turner #define	TEX2_CLASS_3	 (	    L2_C | L2_B)
179*29629d9eSAndrew Turner #define	TEX2_CLASS_4	 (L2_TEX0	       )
180*29629d9eSAndrew Turner #define	TEX2_CLASS_5	 (L2_TEX0 |	   L2_B)
181*29629d9eSAndrew Turner #define	TEX2_CLASS_6	 (L2_TEX0 | L2_C       )	/* Reserved for	ARM11 */
182*29629d9eSAndrew Turner #define	TEX2_CLASS_7	 (L2_TEX0 | L2_C | L2_B)
183*29629d9eSAndrew Turner 
184*29629d9eSAndrew Turner /* L1 table definitions. */
185*29629d9eSAndrew Turner #define	NB_IN_PT1	L1_TABLE_SIZE
186*29629d9eSAndrew Turner #define	NPTE1_IN_PT1	L1_ENTRIES
187*29629d9eSAndrew Turner 
188*29629d9eSAndrew Turner /* L2 table definitions. */
189*29629d9eSAndrew Turner #define	NB_IN_PT2	L2_TABLE_SIZE
190*29629d9eSAndrew Turner #define	NPTE2_IN_PT2	L2_ENTRIES
191*29629d9eSAndrew Turner 
192*29629d9eSAndrew Turner /*
193*29629d9eSAndrew Turner  * Map memory attributes to TEX	classes
194*29629d9eSAndrew Turner  */
195*29629d9eSAndrew Turner #define	PTE2_ATTR_WB_WA		TEX2_CLASS_0
196*29629d9eSAndrew Turner #define	PTE2_ATTR_NOCACHE	TEX2_CLASS_1
197*29629d9eSAndrew Turner #define	PTE2_ATTR_DEVICE	TEX2_CLASS_2
198*29629d9eSAndrew Turner #define	PTE2_ATTR_SO		TEX2_CLASS_3
199*29629d9eSAndrew Turner #define	PTE2_ATTR_WT		TEX2_CLASS_4
200*29629d9eSAndrew Turner /*
201*29629d9eSAndrew Turner  * Software defined bits for L1	descriptors
202*29629d9eSAndrew Turner  *  - L1_AP0 is	used as	page accessed bit
203*29629d9eSAndrew Turner  *  - L1_AP2 (RO / not RW) is used as page not modified	bit
204*29629d9eSAndrew Turner  *  - L1_TEX0 is used as software emulated RO bit
205*29629d9eSAndrew Turner  */
206*29629d9eSAndrew Turner #define	PTE1_V		L1_TYPE_S	/* Valid bit */
207*29629d9eSAndrew Turner #define	PTE1_A		L1_S_AP0	/* Accessed - software emulated	*/
208*29629d9eSAndrew Turner #define	PTE1_NM		L1_S_AP2	/* not modified	bit - software emulated
209*29629d9eSAndrew Turner 					 * used	as real	write enable bit */
210*29629d9eSAndrew Turner #define	PTE1_M		0		/* Modified (dummy) */
211*29629d9eSAndrew Turner #define	PTE1_S		L1_S_SHARED	/* Shared */
212*29629d9eSAndrew Turner #define	PTE1_NG		L1_S_NG		/* Not global */
213*29629d9eSAndrew Turner #define	PTE1_G		0		/* Global (dummy) */
214*29629d9eSAndrew Turner #define	PTE1_NX		L1_S_NX		/* Not executable */
215*29629d9eSAndrew Turner #define	PTE1_X		0		/* Executable (dummy) */
216*29629d9eSAndrew Turner #define	PTE1_RO		L1_S_TEX1	/* Read	Only */
217*29629d9eSAndrew Turner #define	PTE1_RW		0		/* Read-Write (dummy) */
218*29629d9eSAndrew Turner #define	PTE1_U		L1_S_AP1	/* User	*/
219*29629d9eSAndrew Turner #define	PTE1_NU		0		/* Not user (kernel only) (dummy) */
220*29629d9eSAndrew Turner #define	PTE1_W		L1_S_TEX2	/* Wired */
221*29629d9eSAndrew Turner 
222*29629d9eSAndrew Turner #define	PTE1_SHIFT	L1_S_SHIFT
223*29629d9eSAndrew Turner #define	PTE1_SIZE	L1_S_SIZE
224*29629d9eSAndrew Turner #define	PTE1_OFFSET	L1_S_OFFSET
225*29629d9eSAndrew Turner #define	PTE1_FRAME	L1_S_FRAME
226*29629d9eSAndrew Turner 
227*29629d9eSAndrew Turner #define	PTE1_ATTR_MASK	(L1_S_TEX0 | L1_S_C | L1_S_B)
228*29629d9eSAndrew Turner 
229*29629d9eSAndrew Turner #define	PTE1_AP_KR	(PTE1_RO | PTE1_NM)
230*29629d9eSAndrew Turner #define	PTE1_AP_KRW	0
231*29629d9eSAndrew Turner #define	PTE1_AP_KRUR	(PTE1_RO | PTE1_NM | PTE1_U)
232*29629d9eSAndrew Turner #define	PTE1_AP_KRWURW	PTE1_U
233*29629d9eSAndrew Turner 
234*29629d9eSAndrew Turner /*
235*29629d9eSAndrew Turner  * PTE1	descriptors creation macros.
236*29629d9eSAndrew Turner  */
237*29629d9eSAndrew Turner #define	PTE1_PA(pa)	((pa) &	PTE1_FRAME)
238*29629d9eSAndrew Turner #define	PTE1_AP_COMMON	(PTE1_V	| PTE1_S)
239*29629d9eSAndrew Turner 
240*29629d9eSAndrew Turner #define	PTE1(pa, ap, attr)	(PTE1_PA(pa) | (ap) | (attr) | PTE1_AP_COMMON)
241*29629d9eSAndrew Turner 
242*29629d9eSAndrew Turner #define	PTE1_KERN(pa, ap, attr)		PTE1(pa, (ap) |	PTE1_A | PTE1_G, attr)
243*29629d9eSAndrew Turner #define	PTE1_KERN_NG(pa, ap, attr)	PTE1(pa, (ap) |	PTE1_A | PTE1_NG, attr)
244*29629d9eSAndrew Turner 
245*29629d9eSAndrew Turner #define	PTE1_LINK(pa)	(((pa) & L1_C_ADDR_MASK) | L1_TYPE_C)
246*29629d9eSAndrew Turner 
247*29629d9eSAndrew Turner /*
248*29629d9eSAndrew Turner  * Software defined bits for L2	descriptors
249*29629d9eSAndrew Turner  *  - L2_AP0 is	used as	page accessed bit
250*29629d9eSAndrew Turner  *  - L2_AP2 (RO / not RW) is used as page not modified	bit
251*29629d9eSAndrew Turner  *  - L2_TEX0 is used as software emulated RO bit
252*29629d9eSAndrew Turner  */
253*29629d9eSAndrew Turner #define	PTE2_V		L2_TYPE_S	/* Valid bit */
254*29629d9eSAndrew Turner #define	PTE2_A		L2_AP0		/* Accessed - software emulated	*/
255*29629d9eSAndrew Turner #define	PTE2_NM		L2_AP2		/* not modified	bit - software emulated
256*29629d9eSAndrew Turner 					 * used	as real	write enable bit */
257*29629d9eSAndrew Turner #define	PTE2_M		0		/* Modified (dummy) */
258*29629d9eSAndrew Turner #define	PTE2_S		L2_SHARED	/* Shared */
259*29629d9eSAndrew Turner #define	PTE2_NG		L2_NG		/* Not global */
260*29629d9eSAndrew Turner #define	PTE2_G		0		/* Global (dummy) */
261*29629d9eSAndrew Turner #define	PTE2_NX		L2_NX		/* Not executable */
262*29629d9eSAndrew Turner #define	PTE2_X		0		/* Not executable (dummy) */
263*29629d9eSAndrew Turner #define	PTE2_RO		L2_TEX1		/* Read	Only */
264*29629d9eSAndrew Turner #define	PTE2_U		L2_AP1		/* User	*/
265*29629d9eSAndrew Turner #define	PTE2_NU		0		/* Not user (kernel only) (dummy) */
266*29629d9eSAndrew Turner #define	PTE2_W		L2_TEX2		/* Wired */
267*29629d9eSAndrew Turner 
268*29629d9eSAndrew Turner #define	PTE2_SHIFT	L2_S_SHIFT
269*29629d9eSAndrew Turner #define	PTE2_SIZE	L2_S_SIZE
270*29629d9eSAndrew Turner #define	PTE2_OFFSET	L2_S_OFFSET
271*29629d9eSAndrew Turner #define	PTE2_FRAME	L2_S_FRAME
272*29629d9eSAndrew Turner 
273*29629d9eSAndrew Turner #define	PTE2_ATTR_MASK		(L2_TEX0 | L2_C | L2_B)
274*29629d9eSAndrew Turner /* PTE2 attributes to TEX class index: (TEX0 C B)  */
275*29629d9eSAndrew Turner #define	PTE2_ATTR2IDX(attr)					\
276*29629d9eSAndrew Turner     ((((attr) & (L2_C | L2_B)) >> L2_CB_SHIFT) |		\
277*29629d9eSAndrew Turner     (((attr) & L2_TEX0) >> (L2_TEX_SHIFT - L2_CB_SHIFT)))
278*29629d9eSAndrew Turner 
279*29629d9eSAndrew Turner #define	PTE2_AP_KR	(PTE2_RO | PTE2_NM)
280*29629d9eSAndrew Turner #define	PTE2_AP_KRW	0
281*29629d9eSAndrew Turner #define	PTE2_AP_KRUR	(PTE2_RO | PTE2_NM | PTE2_U)
282*29629d9eSAndrew Turner #define	PTE2_AP_KRWURW	PTE2_U
283*29629d9eSAndrew Turner 
284*29629d9eSAndrew Turner /*
285*29629d9eSAndrew Turner  * PTE2	descriptors creation macros.
286*29629d9eSAndrew Turner  */
287*29629d9eSAndrew Turner #define	PTE2_PA(pa)	((pa) &	PTE2_FRAME)
288*29629d9eSAndrew Turner #define	PTE2_AP_COMMON	(PTE2_V	| PTE2_S)
289*29629d9eSAndrew Turner 
290*29629d9eSAndrew Turner #define	PTE2(pa, ap, attr)	(PTE2_PA(pa) | (ap) | (attr) | PTE2_AP_COMMON)
291*29629d9eSAndrew Turner 
292*29629d9eSAndrew Turner #define	PTE2_KERN(pa, ap, attr)		PTE2(pa, (ap) |	PTE2_A | PTE2_G, attr)
293*29629d9eSAndrew Turner #define	PTE2_KERN_NG(pa, ap, attr)	PTE2(pa, (ap) |	PTE2_A | PTE2_NG, attr)
294*29629d9eSAndrew Turner 
295*29629d9eSAndrew Turner #endif /* !_MACHINE_PTE_V6_H_ */
296