Go to the documentation of this file.
21 #ifndef _ASM_PGTABLE_H
22 #define _ASM_PGTABLE_H
48 #define _PAGE_READ __HVM_PTE_R
49 #define _PAGE_WRITE __HVM_PTE_W
50 #define _PAGE_EXECUTE __HVM_PTE_X
51 #define _PAGE_USER __HVM_PTE_U
60 #define _PAGE_PRESENT (1<<0)
61 #define _PAGE_DIRTY (1<<1)
62 #define _PAGE_ACCESSED (1<<2)
69 #define _PAGE_FILE _PAGE_DIRTY
76 #define _PAGE_VALID _PAGE_PRESENT
92 #define PGDIR_SHIFT 22
93 #define PTRS_PER_PGD 1024
95 #define PGDIR_SIZE (1UL << PGDIR_SHIFT)
96 #define PGDIR_MASK (~(PGDIR_SIZE-1))
98 #ifdef CONFIG_PAGE_SIZE_4KB
99 #define PTRS_PER_PTE 1024
102 #ifdef CONFIG_PAGE_SIZE_16KB
103 #define PTRS_PER_PTE 256
106 #ifdef CONFIG_PAGE_SIZE_64KB
107 #define PTRS_PER_PTE 64
110 #ifdef CONFIG_PAGE_SIZE_256KB
111 #define PTRS_PER_PTE 16
114 #ifdef CONFIG_PAGE_SIZE_1MB
115 #define PTRS_PER_PTE 4
119 #define pgd_ERROR(e) \
120 printk(KERN_ERR "%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__,\
128 #define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_USER | \
130 #define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_USER | \
131 _PAGE_READ | _PAGE_EXECUTE | _dflt_cache_att)
132 #define PAGE_COPY PAGE_READONLY
133 #define PAGE_EXEC __pgprot(_PAGE_PRESENT | _PAGE_USER | \
134 _PAGE_READ | _PAGE_EXECUTE | _dflt_cache_att)
135 #define PAGE_COPY_EXEC PAGE_EXEC
136 #define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | \
137 _PAGE_EXECUTE | _PAGE_WRITE | _dflt_cache_att)
138 #define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_READ | \
139 _PAGE_WRITE | _PAGE_EXECUTE | _dflt_cache_att)
149 #define CACHEDEF (CACHE_DEFAULT << 6)
152 #define __P000 __pgprot(_PAGE_PRESENT | _PAGE_USER | CACHEDEF)
153 #define __P001 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | CACHEDEF)
154 #define __P010 __P000
155 #define __P011 __P001
156 #define __P100 __pgprot(_PAGE_PRESENT | _PAGE_USER | \
157 _PAGE_EXECUTE | CACHEDEF)
158 #define __P101 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_EXECUTE | \
159 _PAGE_READ | CACHEDEF)
160 #define __P110 __P100
161 #define __P111 __P101
164 #define __S000 __P000
165 #define __S001 __P001
166 #define __S010 __pgprot(_PAGE_PRESENT | _PAGE_USER | \
167 _PAGE_WRITE | CACHEDEF)
168 #define __S011 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | \
169 _PAGE_WRITE | CACHEDEF)
170 #define __S100 __pgprot(_PAGE_PRESENT | _PAGE_USER | \
171 _PAGE_EXECUTE | CACHEDEF)
172 #define __S101 __P101
173 #define __S110 __pgprot(_PAGE_PRESENT | _PAGE_USER | \
174 _PAGE_EXECUTE | _PAGE_WRITE | CACHEDEF)
175 #define __S111 __pgprot(_PAGE_PRESENT | _PAGE_USER | _PAGE_READ | \
176 _PAGE_EXECUTE | _PAGE_WRITE | CACHEDEF)
181 #define FIRST_USER_ADDRESS 0
182 #define pte_special(pte) 0
183 #define pte_mkspecial(pte) (pte)
186 #ifdef CONFIG_HUGETLB_PAGE
187 #define pte_mkhuge(pte) __pte((pte_val(pte) & ~0x3) | HVM_HUGEPAGE_SIZE)
196 #define pte_present_exec_user(pte) \
197 ((pte_val(pte) & (_PAGE_EXECUTE | _PAGE_USER)) == \
198 (_PAGE_EXECUTE | _PAGE_USER))
216 #define _NULL_PMD 0x7
217 #define _NULL_PTE 0x0
233 #ifdef NEED_PMD_INDEX_DESPITE_BEING_2_LEVEL
238 #define pmd_index(address) (((address) >> PMD_SHIFT) & (PTRS_PER_PMD-1))
248 #define pgd_index(address) (((address) >> PGDIR_SHIFT) & (PTRS_PER_PGD-1))
253 #define pgd_offset(mm, addr) ((mm)->pgd + pgd_index(addr))
258 #define pgd_offset_k(address) pgd_offset(&init_mm, address)
295 #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT))
296 #define pmd_pgtable(pmd) pmd_page(pmd)
316 #define mk_pte(page, pgprot) pfn_pte(page_to_pfn(page), (pgprot))
319 #define pte_page(x) pfn_to_page(pte_pfn(x))
410 #define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
413 #define __swp_entry_to_pte(x) ((pte_t) { (x).val })
416 #define pfn_pte(pfn, pgprot) __pte((pfn << PAGE_SHIFT) | pgprot_val(pgprot))
419 #define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
420 #define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval))
428 #define set_pte_at(mm, addr, ptep, pte) set_pte(ptep, pte)
433 #define pte_unmap(pte) do { } while (0)
434 #define pte_unmap_nested(pte) do { } while (0)
440 #define pte_offset_map(dir, address) \
441 ((pte_t *)page_address(pmd_page(*(dir))) + __pte_offset(address))
443 #define pte_offset_map_nested(pmd, addr) pte_offset_map(pmd, addr)
446 #define pte_offset_kernel(dir, address) \
447 ((pte_t *) (unsigned long) __va(pmd_val(*dir) & PAGE_MASK) \
448 + __pte_offset(address))
451 #define ZERO_PAGE(vaddr) (virt_to_page(&empty_zero_page))
453 #define __pte_offset(address) (((address) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
456 #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \
457 remap_pfn_range(vma, vaddr, pfn, size, prot)
460 #define pgtable_cache_init() do { } while (0)
491 #define PTE_FILE_MAX_BITS 27
494 #define __swp_type(swp_pte) (((swp_pte).val >> 2) & 0x1f)
496 #define __swp_offset(swp_pte) \
497 ((((swp_pte).val >> 7) & 0x7) | (((swp_pte).val >> 10) & 0x003ffff8))
499 #define __swp_entry(type, offset) \
502 ((offset & 0x3ffff8) << 10) | ((offset & 0x7) << 7)) })
505 #define pte_file(pte) \
506 ((pte_val(pte) & (_PAGE_FILE | _PAGE_PRESENT)) == _PAGE_FILE)
508 #define pte_to_pgoff(pte) \
509 (((pte_val(pte) >> 2) & 0xff) | ((pte_val(pte) >> 5) & 0x07ffff00))
511 #define pgoff_to_pte(off) \
512 ((pte_t) { ((((off) & 0x7ffff00) << 5) | (((off) & 0xff) << 2)\