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