xref: /freebsd-src/sys/arm/include/pmap_var.h (revision 1f1b2286fd5ae4cd7f8e6412723201e92d28771a)
184233ddbSIan Lepore /*-
284233ddbSIan Lepore  * Copyright 2014 Svatopluk Kraus <onwahe@gmail.com>
384233ddbSIan Lepore  * Copyright 2014 Michal Meloun <meloun@miracle.cz>
484233ddbSIan Lepore  * All rights reserved.
584233ddbSIan Lepore  *
684233ddbSIan Lepore  * Redistribution and use in source and binary forms, with or without
784233ddbSIan Lepore  * modification, are permitted provided that the following conditions
884233ddbSIan Lepore  * are met:
984233ddbSIan Lepore  * 1. Redistributions of source code must retain the above copyright
1084233ddbSIan Lepore  *    notice, this list of conditions and the following disclaimer.
1184233ddbSIan Lepore  * 2. Redistributions in binary form must reproduce the above copyright
1284233ddbSIan Lepore  *    notice, this list of conditions and the following disclaimer in the
1384233ddbSIan Lepore  *    documentation and/or other materials provided with the distribution.
1484233ddbSIan Lepore  *
1584233ddbSIan Lepore  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1684233ddbSIan Lepore  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1784233ddbSIan Lepore  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1884233ddbSIan Lepore  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1984233ddbSIan Lepore  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2084233ddbSIan Lepore  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2184233ddbSIan Lepore  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2284233ddbSIan Lepore  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2384233ddbSIan Lepore  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2484233ddbSIan Lepore  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2584233ddbSIan Lepore  * SUCH DAMAGE.
2684233ddbSIan Lepore  */
2784233ddbSIan Lepore 
2884233ddbSIan Lepore #ifndef _MACHINE_PMAP_VAR_H_
2984233ddbSIan Lepore #define _MACHINE_PMAP_VAR_H_
3084233ddbSIan Lepore 
3129629d9eSAndrew Turner #include <machine/pte.h>
3267d39872SAndrew Turner 
3384233ddbSIan Lepore /*
3484233ddbSIan Lepore  *  Various PMAP defines, exports, and inline functions
3584233ddbSIan Lepore  *  definitions also usable in other MD code.
3684233ddbSIan Lepore  */
3784233ddbSIan Lepore 
3884233ddbSIan Lepore /*  A number of pages in L1 page table. */
3984233ddbSIan Lepore #define NPG_IN_PT1	(NB_IN_PT1 / PAGE_SIZE)
4084233ddbSIan Lepore 
4184233ddbSIan Lepore /*  A number of L2 page tables in a page. */
4284233ddbSIan Lepore #define NPT2_IN_PG	(PAGE_SIZE / NB_IN_PT2)
4384233ddbSIan Lepore 
4484233ddbSIan Lepore /*  A number of L2 page table entries in a page. */
4584233ddbSIan Lepore #define NPTE2_IN_PG	(NPT2_IN_PG * NPTE2_IN_PT2)
4684233ddbSIan Lepore 
4784233ddbSIan Lepore #ifdef _KERNEL
4884233ddbSIan Lepore 
4984233ddbSIan Lepore /*
5084233ddbSIan Lepore  *  A L2 page tables page contains NPT2_IN_PG L2 page tables. Masking of
5184233ddbSIan Lepore  *  pte1_idx by PT2PG_MASK gives us an index to associated L2 page table
5284233ddbSIan Lepore  *  in a page. The PT2PG_SHIFT definition depends on NPT2_IN_PG strictly.
5384233ddbSIan Lepore  *  I.e., (1 << PT2PG_SHIFT) == NPT2_IN_PG must be fulfilled.
5484233ddbSIan Lepore  */
5584233ddbSIan Lepore #define PT2PG_SHIFT	2
5684233ddbSIan Lepore #define PT2PG_MASK	((1 << PT2PG_SHIFT) - 1)
5784233ddbSIan Lepore 
5884233ddbSIan Lepore /*
5984233ddbSIan Lepore  *  A PT2TAB holds all allocated L2 page table pages in a pmap.
6084233ddbSIan Lepore  *  Right shifting of virtual address by PT2TAB_SHIFT gives us an index
6184233ddbSIan Lepore  *  to L2 page table page in PT2TAB which holds the address mapping.
6284233ddbSIan Lepore  */
6384233ddbSIan Lepore #define PT2TAB_ENTRIES  (NPTE1_IN_PT1 / NPT2_IN_PG)
6484233ddbSIan Lepore #define PT2TAB_SHIFT	(PTE1_SHIFT + PT2PG_SHIFT)
6584233ddbSIan Lepore 
6684233ddbSIan Lepore /*
6784233ddbSIan Lepore  *  All allocated L2 page table pages in a pmap are mapped into PT2MAP space.
6884233ddbSIan Lepore  *  An virtual address right shifting by PT2MAP_SHIFT gives us an index to PTE2
6984233ddbSIan Lepore  *  which maps the address.
7084233ddbSIan Lepore  */
7184233ddbSIan Lepore #define PT2MAP_SIZE	(NPTE1_IN_PT1 * NB_IN_PT2)
7284233ddbSIan Lepore #define PT2MAP_SHIFT	PTE2_SHIFT
7384233ddbSIan Lepore 
7484233ddbSIan Lepore extern pt1_entry_t *kern_pt1;
7584233ddbSIan Lepore extern pt2_entry_t *kern_pt2tab;
7684233ddbSIan Lepore extern pt2_entry_t *PT2MAP;
7784233ddbSIan Lepore 
7884233ddbSIan Lepore /*
7984233ddbSIan Lepore  *  Virtual interface for L1 page table management.
8084233ddbSIan Lepore  */
8184233ddbSIan Lepore 
8284233ddbSIan Lepore static __inline u_int
pte1_index(vm_offset_t va)8384233ddbSIan Lepore pte1_index(vm_offset_t va)
8484233ddbSIan Lepore {
8584233ddbSIan Lepore 
8684233ddbSIan Lepore 	return (va >> PTE1_SHIFT);
8784233ddbSIan Lepore }
8884233ddbSIan Lepore 
8984233ddbSIan Lepore static __inline pt1_entry_t *
pte1_ptr(pt1_entry_t * pt1,vm_offset_t va)9084233ddbSIan Lepore pte1_ptr(pt1_entry_t *pt1, vm_offset_t va)
9184233ddbSIan Lepore {
9284233ddbSIan Lepore 
9384233ddbSIan Lepore 	return (pt1 + pte1_index(va));
9484233ddbSIan Lepore }
9584233ddbSIan Lepore 
9684233ddbSIan Lepore static __inline vm_offset_t
pte1_trunc(vm_offset_t va)9784233ddbSIan Lepore pte1_trunc(vm_offset_t va)
9884233ddbSIan Lepore {
9984233ddbSIan Lepore 
10084233ddbSIan Lepore 	return (va & PTE1_FRAME);
10184233ddbSIan Lepore }
10284233ddbSIan Lepore 
10384233ddbSIan Lepore static __inline vm_offset_t
pte1_roundup(vm_offset_t va)10484233ddbSIan Lepore pte1_roundup(vm_offset_t va)
10584233ddbSIan Lepore {
10684233ddbSIan Lepore 
10784233ddbSIan Lepore 	return ((va + PTE1_OFFSET) & PTE1_FRAME);
10884233ddbSIan Lepore }
10984233ddbSIan Lepore 
11084233ddbSIan Lepore /*
11184233ddbSIan Lepore  *  Virtual interface for L1 page table entries management.
11284233ddbSIan Lepore  *
11384233ddbSIan Lepore  *  XXX: Some of the following functions now with a synchronization barrier
11484233ddbSIan Lepore  *  are called in a loop, so it could be useful to have two versions of them.
11584233ddbSIan Lepore  *  One with the barrier and one without the barrier. In this case, pure
11684233ddbSIan Lepore  *  barrier pte1_sync() should be implemented as well.
11784233ddbSIan Lepore  */
11884233ddbSIan Lepore static __inline void
pte1_sync(pt1_entry_t * pte1p)11984233ddbSIan Lepore pte1_sync(pt1_entry_t *pte1p)
12084233ddbSIan Lepore {
12184233ddbSIan Lepore 
12284233ddbSIan Lepore 	dsb();
12384233ddbSIan Lepore #ifndef PMAP_PTE_NOCACHE
12484233ddbSIan Lepore 	if (!cpuinfo.coherent_walk)
12584233ddbSIan Lepore 		dcache_wb_pou((vm_offset_t)pte1p, sizeof(*pte1p));
12684233ddbSIan Lepore #endif
12784233ddbSIan Lepore }
12884233ddbSIan Lepore 
12984233ddbSIan Lepore static __inline void
pte1_sync_range(pt1_entry_t * pte1p,vm_size_t size)13084233ddbSIan Lepore pte1_sync_range(pt1_entry_t *pte1p, vm_size_t size)
13184233ddbSIan Lepore {
13284233ddbSIan Lepore 
13384233ddbSIan Lepore 	dsb();
13484233ddbSIan Lepore #ifndef PMAP_PTE_NOCACHE
13584233ddbSIan Lepore 	if (!cpuinfo.coherent_walk)
13684233ddbSIan Lepore 		dcache_wb_pou((vm_offset_t)pte1p, size);
13784233ddbSIan Lepore #endif
13884233ddbSIan Lepore }
13984233ddbSIan Lepore 
14084233ddbSIan Lepore static __inline void
pte1_store(pt1_entry_t * pte1p,pt1_entry_t pte1)14184233ddbSIan Lepore pte1_store(pt1_entry_t *pte1p, pt1_entry_t pte1)
14284233ddbSIan Lepore {
14384233ddbSIan Lepore 
1443d69163aSSvatopluk Kraus 	dmb();
1453d69163aSSvatopluk Kraus 	*pte1p = pte1;
14684233ddbSIan Lepore 	pte1_sync(pte1p);
14784233ddbSIan Lepore }
14884233ddbSIan Lepore 
14984233ddbSIan Lepore static __inline void
pte1_clear(pt1_entry_t * pte1p)15084233ddbSIan Lepore pte1_clear(pt1_entry_t *pte1p)
15184233ddbSIan Lepore {
15284233ddbSIan Lepore 
15384233ddbSIan Lepore 	pte1_store(pte1p, 0);
15484233ddbSIan Lepore }
15584233ddbSIan Lepore 
15684233ddbSIan Lepore static __inline void
pte1_clear_bit(pt1_entry_t * pte1p,uint32_t bit)15784233ddbSIan Lepore pte1_clear_bit(pt1_entry_t *pte1p, uint32_t bit)
15884233ddbSIan Lepore {
15984233ddbSIan Lepore 
1603d69163aSSvatopluk Kraus 	*pte1p &= ~bit;
16184233ddbSIan Lepore 	pte1_sync(pte1p);
16284233ddbSIan Lepore }
16384233ddbSIan Lepore 
164*1f1b2286SJohn Baldwin static __inline bool
pte1_is_link(pt1_entry_t pte1)16584233ddbSIan Lepore pte1_is_link(pt1_entry_t pte1)
16684233ddbSIan Lepore {
16784233ddbSIan Lepore 
16884233ddbSIan Lepore 	return ((pte1 & L1_TYPE_MASK) == L1_TYPE_C);
16984233ddbSIan Lepore }
17084233ddbSIan Lepore 
17184233ddbSIan Lepore static __inline int
pte1_is_section(pt1_entry_t pte1)17284233ddbSIan Lepore pte1_is_section(pt1_entry_t pte1)
17384233ddbSIan Lepore {
17484233ddbSIan Lepore 
17584233ddbSIan Lepore 	return ((pte1 & L1_TYPE_MASK) == L1_TYPE_S);
17684233ddbSIan Lepore }
17784233ddbSIan Lepore 
178*1f1b2286SJohn Baldwin static __inline bool
pte1_is_dirty(pt1_entry_t pte1)17984233ddbSIan Lepore pte1_is_dirty(pt1_entry_t pte1)
18084233ddbSIan Lepore {
18184233ddbSIan Lepore 
18284233ddbSIan Lepore 	return ((pte1 & (PTE1_NM | PTE1_RO)) == 0);
18384233ddbSIan Lepore }
18484233ddbSIan Lepore 
185*1f1b2286SJohn Baldwin static __inline bool
pte1_is_global(pt1_entry_t pte1)18684233ddbSIan Lepore pte1_is_global(pt1_entry_t pte1)
18784233ddbSIan Lepore {
18884233ddbSIan Lepore 
18984233ddbSIan Lepore 	return ((pte1 & PTE1_NG) == 0);
19084233ddbSIan Lepore }
19184233ddbSIan Lepore 
192*1f1b2286SJohn Baldwin static __inline bool
pte1_is_valid(pt1_entry_t pte1)19384233ddbSIan Lepore pte1_is_valid(pt1_entry_t pte1)
19484233ddbSIan Lepore {
19584233ddbSIan Lepore 	int l1_type;
19684233ddbSIan Lepore 
19784233ddbSIan Lepore 	l1_type = pte1 & L1_TYPE_MASK;
19884233ddbSIan Lepore 	return ((l1_type == L1_TYPE_C) || (l1_type == L1_TYPE_S));
19984233ddbSIan Lepore }
20084233ddbSIan Lepore 
201*1f1b2286SJohn Baldwin static __inline bool
pte1_is_wired(pt1_entry_t pte1)20284233ddbSIan Lepore pte1_is_wired(pt1_entry_t pte1)
20384233ddbSIan Lepore {
20484233ddbSIan Lepore 
20584233ddbSIan Lepore 	return (pte1 & PTE1_W);
20684233ddbSIan Lepore }
20784233ddbSIan Lepore 
20884233ddbSIan Lepore static __inline pt1_entry_t
pte1_load(pt1_entry_t * pte1p)20984233ddbSIan Lepore pte1_load(pt1_entry_t *pte1p)
21084233ddbSIan Lepore {
21184233ddbSIan Lepore 	pt1_entry_t pte1;
21284233ddbSIan Lepore 
21384233ddbSIan Lepore 	pte1 = *pte1p;
21484233ddbSIan Lepore 	return (pte1);
21584233ddbSIan Lepore }
21684233ddbSIan Lepore 
21784233ddbSIan Lepore static __inline pt1_entry_t
pte1_load_clear(pt1_entry_t * pte1p)21884233ddbSIan Lepore pte1_load_clear(pt1_entry_t *pte1p)
21984233ddbSIan Lepore {
22084233ddbSIan Lepore 	pt1_entry_t opte1;
22184233ddbSIan Lepore 
2223d69163aSSvatopluk Kraus 	opte1 = *pte1p;
2233d69163aSSvatopluk Kraus 	*pte1p = 0;
22484233ddbSIan Lepore 	pte1_sync(pte1p);
22584233ddbSIan Lepore 	return (opte1);
22684233ddbSIan Lepore }
22784233ddbSIan Lepore 
22884233ddbSIan Lepore static __inline void
pte1_set_bit(pt1_entry_t * pte1p,uint32_t bit)22984233ddbSIan Lepore pte1_set_bit(pt1_entry_t *pte1p, uint32_t bit)
23084233ddbSIan Lepore {
23184233ddbSIan Lepore 
2323d69163aSSvatopluk Kraus 	*pte1p |= bit;
23384233ddbSIan Lepore 	pte1_sync(pte1p);
23484233ddbSIan Lepore }
23584233ddbSIan Lepore 
23684233ddbSIan Lepore static __inline vm_paddr_t
pte1_pa(pt1_entry_t pte1)23784233ddbSIan Lepore pte1_pa(pt1_entry_t pte1)
23884233ddbSIan Lepore {
23984233ddbSIan Lepore 
24084233ddbSIan Lepore 	return ((vm_paddr_t)(pte1 & PTE1_FRAME));
24184233ddbSIan Lepore }
24284233ddbSIan Lepore 
24384233ddbSIan Lepore static __inline vm_paddr_t
pte1_link_pa(pt1_entry_t pte1)24484233ddbSIan Lepore pte1_link_pa(pt1_entry_t pte1)
24584233ddbSIan Lepore {
24684233ddbSIan Lepore 
24784233ddbSIan Lepore 	return ((vm_paddr_t)(pte1 & L1_C_ADDR_MASK));
24884233ddbSIan Lepore }
24984233ddbSIan Lepore 
25084233ddbSIan Lepore /*
25184233ddbSIan Lepore  *  Virtual interface for L2 page table entries management.
25284233ddbSIan Lepore  *
25384233ddbSIan Lepore  *  XXX: Some of the following functions now with a synchronization barrier
25484233ddbSIan Lepore  *  are called in a loop, so it could be useful to have two versions of them.
25584233ddbSIan Lepore  *  One with the barrier and one without the barrier.
25684233ddbSIan Lepore  */
25784233ddbSIan Lepore 
25884233ddbSIan Lepore static __inline void
pte2_sync(pt2_entry_t * pte2p)25984233ddbSIan Lepore pte2_sync(pt2_entry_t *pte2p)
26084233ddbSIan Lepore {
26184233ddbSIan Lepore 
26284233ddbSIan Lepore 	dsb();
26384233ddbSIan Lepore #ifndef PMAP_PTE_NOCACHE
26484233ddbSIan Lepore 	if (!cpuinfo.coherent_walk)
26584233ddbSIan Lepore 		dcache_wb_pou((vm_offset_t)pte2p, sizeof(*pte2p));
26684233ddbSIan Lepore #endif
26784233ddbSIan Lepore }
26884233ddbSIan Lepore 
26984233ddbSIan Lepore static __inline void
pte2_sync_range(pt2_entry_t * pte2p,vm_size_t size)27084233ddbSIan Lepore pte2_sync_range(pt2_entry_t *pte2p, vm_size_t size)
27184233ddbSIan Lepore {
27284233ddbSIan Lepore 
27384233ddbSIan Lepore 	dsb();
27484233ddbSIan Lepore #ifndef PMAP_PTE_NOCACHE
27584233ddbSIan Lepore 	if (!cpuinfo.coherent_walk)
27684233ddbSIan Lepore 		dcache_wb_pou((vm_offset_t)pte2p, size);
27784233ddbSIan Lepore #endif
27884233ddbSIan Lepore }
27984233ddbSIan Lepore 
28084233ddbSIan Lepore static __inline void
pte2_store(pt2_entry_t * pte2p,pt2_entry_t pte2)28184233ddbSIan Lepore pte2_store(pt2_entry_t *pte2p, pt2_entry_t pte2)
28284233ddbSIan Lepore {
28384233ddbSIan Lepore 
2843d69163aSSvatopluk Kraus 	dmb();
2853d69163aSSvatopluk Kraus 	*pte2p = pte2;
28684233ddbSIan Lepore 	pte2_sync(pte2p);
28784233ddbSIan Lepore }
28884233ddbSIan Lepore 
28984233ddbSIan Lepore static __inline void
pte2_clear(pt2_entry_t * pte2p)29084233ddbSIan Lepore pte2_clear(pt2_entry_t *pte2p)
29184233ddbSIan Lepore {
29284233ddbSIan Lepore 
29384233ddbSIan Lepore 	pte2_store(pte2p, 0);
29484233ddbSIan Lepore }
29584233ddbSIan Lepore 
29684233ddbSIan Lepore static __inline void
pte2_clear_bit(pt2_entry_t * pte2p,uint32_t bit)29784233ddbSIan Lepore pte2_clear_bit(pt2_entry_t *pte2p, uint32_t bit)
29884233ddbSIan Lepore {
29984233ddbSIan Lepore 
3003d69163aSSvatopluk Kraus 	*pte2p &= ~bit;
30184233ddbSIan Lepore 	pte2_sync(pte2p);
30284233ddbSIan Lepore }
30384233ddbSIan Lepore 
304*1f1b2286SJohn Baldwin static __inline bool
pte2_is_dirty(pt2_entry_t pte2)30584233ddbSIan Lepore pte2_is_dirty(pt2_entry_t pte2)
30684233ddbSIan Lepore {
30784233ddbSIan Lepore 
30884233ddbSIan Lepore 	return ((pte2 & (PTE2_NM | PTE2_RO)) == 0);
30984233ddbSIan Lepore }
31084233ddbSIan Lepore 
311*1f1b2286SJohn Baldwin static __inline bool
pte2_is_global(pt2_entry_t pte2)31284233ddbSIan Lepore pte2_is_global(pt2_entry_t pte2)
31384233ddbSIan Lepore {
31484233ddbSIan Lepore 
31584233ddbSIan Lepore 	return ((pte2 & PTE2_NG) == 0);
31684233ddbSIan Lepore }
31784233ddbSIan Lepore 
318*1f1b2286SJohn Baldwin static __inline bool
pte2_is_valid(pt2_entry_t pte2)31984233ddbSIan Lepore pte2_is_valid(pt2_entry_t pte2)
32084233ddbSIan Lepore {
32184233ddbSIan Lepore 
32284233ddbSIan Lepore 	return (pte2 & PTE2_V);
32384233ddbSIan Lepore }
32484233ddbSIan Lepore 
325*1f1b2286SJohn Baldwin static __inline bool
pte2_is_wired(pt2_entry_t pte2)32684233ddbSIan Lepore pte2_is_wired(pt2_entry_t pte2)
32784233ddbSIan Lepore {
32884233ddbSIan Lepore 
32984233ddbSIan Lepore 	return (pte2 & PTE2_W);
33084233ddbSIan Lepore }
33184233ddbSIan Lepore 
33284233ddbSIan Lepore static __inline pt2_entry_t
pte2_load(pt2_entry_t * pte2p)33384233ddbSIan Lepore pte2_load(pt2_entry_t *pte2p)
33484233ddbSIan Lepore {
33584233ddbSIan Lepore 	pt2_entry_t pte2;
33684233ddbSIan Lepore 
33784233ddbSIan Lepore 	pte2 = *pte2p;
33884233ddbSIan Lepore 	return (pte2);
33984233ddbSIan Lepore }
34084233ddbSIan Lepore 
34184233ddbSIan Lepore static __inline pt2_entry_t
pte2_load_clear(pt2_entry_t * pte2p)34284233ddbSIan Lepore pte2_load_clear(pt2_entry_t *pte2p)
34384233ddbSIan Lepore {
34484233ddbSIan Lepore 	pt2_entry_t opte2;
34584233ddbSIan Lepore 
3463d69163aSSvatopluk Kraus 	opte2 = *pte2p;
3473d69163aSSvatopluk Kraus 	*pte2p = 0;
34884233ddbSIan Lepore 	pte2_sync(pte2p);
34984233ddbSIan Lepore 	return (opte2);
35084233ddbSIan Lepore }
35184233ddbSIan Lepore 
35284233ddbSIan Lepore static __inline void
pte2_set_bit(pt2_entry_t * pte2p,uint32_t bit)35384233ddbSIan Lepore pte2_set_bit(pt2_entry_t *pte2p, uint32_t bit)
35484233ddbSIan Lepore {
35584233ddbSIan Lepore 
3563d69163aSSvatopluk Kraus 	*pte2p |= bit;
35784233ddbSIan Lepore 	pte2_sync(pte2p);
35884233ddbSIan Lepore }
35984233ddbSIan Lepore 
36084233ddbSIan Lepore static __inline void
pte2_set_wired(pt2_entry_t * pte2p,bool wired)361*1f1b2286SJohn Baldwin pte2_set_wired(pt2_entry_t *pte2p, bool wired)
36284233ddbSIan Lepore {
36384233ddbSIan Lepore 
36484233ddbSIan Lepore 	/*
36584233ddbSIan Lepore 	 * Wired bit is transparent for page table walk,
36684233ddbSIan Lepore 	 * so pte2_sync() is not needed.
36784233ddbSIan Lepore 	 */
36884233ddbSIan Lepore 	if (wired)
3693d69163aSSvatopluk Kraus 		*pte2p |= PTE2_W;
37084233ddbSIan Lepore 	else
3713d69163aSSvatopluk Kraus 		*pte2p &= ~PTE2_W;
37284233ddbSIan Lepore }
37384233ddbSIan Lepore 
37484233ddbSIan Lepore static __inline vm_paddr_t
pte2_pa(pt2_entry_t pte2)37584233ddbSIan Lepore pte2_pa(pt2_entry_t pte2)
37684233ddbSIan Lepore {
37784233ddbSIan Lepore 
37884233ddbSIan Lepore 	return ((vm_paddr_t)(pte2 & PTE2_FRAME));
37984233ddbSIan Lepore }
38084233ddbSIan Lepore 
38184233ddbSIan Lepore static __inline u_int
pte2_attr(pt2_entry_t pte2)38284233ddbSIan Lepore pte2_attr(pt2_entry_t pte2)
38384233ddbSIan Lepore {
38484233ddbSIan Lepore 
38584233ddbSIan Lepore 	return ((u_int)(pte2 & PTE2_ATTR_MASK));
38684233ddbSIan Lepore }
38784233ddbSIan Lepore 
38884233ddbSIan Lepore /*
38984233ddbSIan Lepore  *  Virtual interface for L2 page tables mapping management.
39084233ddbSIan Lepore  */
39184233ddbSIan Lepore 
39284233ddbSIan Lepore static __inline u_int
pt2tab_index(vm_offset_t va)39384233ddbSIan Lepore pt2tab_index(vm_offset_t va)
39484233ddbSIan Lepore {
39584233ddbSIan Lepore 
39684233ddbSIan Lepore 	return (va >> PT2TAB_SHIFT);
39784233ddbSIan Lepore }
39884233ddbSIan Lepore 
39984233ddbSIan Lepore static __inline pt2_entry_t *
pt2tab_entry(pt2_entry_t * pt2tab,vm_offset_t va)40084233ddbSIan Lepore pt2tab_entry(pt2_entry_t *pt2tab, vm_offset_t va)
40184233ddbSIan Lepore {
40284233ddbSIan Lepore 
40384233ddbSIan Lepore 	return (pt2tab + pt2tab_index(va));
40484233ddbSIan Lepore }
40584233ddbSIan Lepore 
40684233ddbSIan Lepore static __inline void
pt2tab_store(pt2_entry_t * pte2p,pt2_entry_t pte2)40784233ddbSIan Lepore pt2tab_store(pt2_entry_t *pte2p, pt2_entry_t pte2)
40884233ddbSIan Lepore {
40984233ddbSIan Lepore 
41084233ddbSIan Lepore 	pte2_store(pte2p,pte2);
41184233ddbSIan Lepore }
41284233ddbSIan Lepore 
41384233ddbSIan Lepore static __inline pt2_entry_t
pt2tab_load(pt2_entry_t * pte2p)41484233ddbSIan Lepore pt2tab_load(pt2_entry_t *pte2p)
41584233ddbSIan Lepore {
41684233ddbSIan Lepore 
41784233ddbSIan Lepore 	return (pte2_load(pte2p));
41884233ddbSIan Lepore }
41984233ddbSIan Lepore 
42084233ddbSIan Lepore static __inline pt2_entry_t
pt2tab_load_clear(pt2_entry_t * pte2p)42184233ddbSIan Lepore pt2tab_load_clear(pt2_entry_t *pte2p)
42284233ddbSIan Lepore {
42384233ddbSIan Lepore 
42484233ddbSIan Lepore 	return (pte2_load_clear(pte2p));
42584233ddbSIan Lepore }
42684233ddbSIan Lepore 
42784233ddbSIan Lepore static __inline u_int
pt2map_index(vm_offset_t va)42884233ddbSIan Lepore pt2map_index(vm_offset_t va)
42984233ddbSIan Lepore {
43084233ddbSIan Lepore 
43184233ddbSIan Lepore 	return (va >> PT2MAP_SHIFT);
43284233ddbSIan Lepore }
43384233ddbSIan Lepore 
43484233ddbSIan Lepore static __inline pt2_entry_t *
pt2map_entry(vm_offset_t va)43584233ddbSIan Lepore pt2map_entry(vm_offset_t va)
43684233ddbSIan Lepore {
43784233ddbSIan Lepore 
43884233ddbSIan Lepore 	return (PT2MAP + pt2map_index(va));
43984233ddbSIan Lepore }
44084233ddbSIan Lepore 
44184233ddbSIan Lepore /*
44284233ddbSIan Lepore  *  Virtual interface for pmap structure & kernel shortcuts.
44384233ddbSIan Lepore  */
44484233ddbSIan Lepore 
44584233ddbSIan Lepore static __inline pt1_entry_t *
pmap_pte1(pmap_t pmap,vm_offset_t va)44684233ddbSIan Lepore pmap_pte1(pmap_t pmap, vm_offset_t va)
44784233ddbSIan Lepore {
44884233ddbSIan Lepore 
44984233ddbSIan Lepore 	return (pte1_ptr(pmap->pm_pt1, va));
45084233ddbSIan Lepore }
45184233ddbSIan Lepore 
45284233ddbSIan Lepore static __inline pt1_entry_t *
kern_pte1(vm_offset_t va)45384233ddbSIan Lepore kern_pte1(vm_offset_t va)
45484233ddbSIan Lepore {
45584233ddbSIan Lepore 
45684233ddbSIan Lepore 	return (pte1_ptr(kern_pt1, va));
45784233ddbSIan Lepore }
45884233ddbSIan Lepore 
45984233ddbSIan Lepore static __inline pt2_entry_t *
pmap_pt2tab_entry(pmap_t pmap,vm_offset_t va)46084233ddbSIan Lepore pmap_pt2tab_entry(pmap_t pmap, vm_offset_t va)
46184233ddbSIan Lepore {
46284233ddbSIan Lepore 
46384233ddbSIan Lepore 	return (pt2tab_entry(pmap->pm_pt2tab, va));
46484233ddbSIan Lepore }
46584233ddbSIan Lepore 
46684233ddbSIan Lepore static __inline pt2_entry_t *
kern_pt2tab_entry(vm_offset_t va)46784233ddbSIan Lepore kern_pt2tab_entry(vm_offset_t va)
46884233ddbSIan Lepore {
46984233ddbSIan Lepore 
47084233ddbSIan Lepore 	return (pt2tab_entry(kern_pt2tab, va));
47184233ddbSIan Lepore }
47284233ddbSIan Lepore 
47384233ddbSIan Lepore static __inline vm_page_t
pmap_pt2_page(pmap_t pmap,vm_offset_t va)47484233ddbSIan Lepore pmap_pt2_page(pmap_t pmap, vm_offset_t va)
47584233ddbSIan Lepore {
47684233ddbSIan Lepore 	pt2_entry_t pte2;
47784233ddbSIan Lepore 
47884233ddbSIan Lepore 	pte2 = pte2_load(pmap_pt2tab_entry(pmap, va));
47984233ddbSIan Lepore 	return (PHYS_TO_VM_PAGE(pte2 & PTE2_FRAME));
48084233ddbSIan Lepore }
48184233ddbSIan Lepore 
48284233ddbSIan Lepore static __inline vm_page_t
kern_pt2_page(vm_offset_t va)48384233ddbSIan Lepore kern_pt2_page(vm_offset_t va)
48484233ddbSIan Lepore {
48584233ddbSIan Lepore 	pt2_entry_t pte2;
48684233ddbSIan Lepore 
48784233ddbSIan Lepore 	pte2 = pte2_load(kern_pt2tab_entry(va));
48884233ddbSIan Lepore 	return (PHYS_TO_VM_PAGE(pte2 & PTE2_FRAME));
48984233ddbSIan Lepore }
49084233ddbSIan Lepore 
49184233ddbSIan Lepore #endif	/* _KERNEL */
49284233ddbSIan Lepore #endif	/* !_MACHINE_PMAP_VAR_H_ */
493