1
2
3
4
5
6
7
8
9
10
11#ifndef _ASMARM_PGTABLE_H
12#define _ASMARM_PGTABLE_H
13
14#include <asm-generic/4level-fixup.h>
15
16#include <linux/config.h>
17#include <asm/memory.h>
18
19
20
21
22
23
24
25
26
27#define __P000 PAGE_NONE
28#define __P001 PAGE_READONLY
29#define __P010 PAGE_COPY
30#define __P011 PAGE_COPY
31#define __P100 PAGE_READONLY
32#define __P101 PAGE_READONLY
33#define __P110 PAGE_COPY
34#define __P111 PAGE_COPY
35
36#define __S000 PAGE_NONE
37#define __S001 PAGE_READONLY
38#define __S010 PAGE_SHARED
39#define __S011 PAGE_SHARED
40#define __S100 PAGE_READONLY
41#define __S101 PAGE_READONLY
42#define __S110 PAGE_SHARED
43#define __S111 PAGE_SHARED
44
45
46
47
48
49#define PGD_SHIFT 25
50#define PMD_SHIFT 20
51
52#define PGD_SIZE (1UL << PGD_SHIFT)
53#define PGD_MASK (~(PGD_SIZE-1))
54#define PMD_SIZE (1UL << PMD_SHIFT)
55#define PMD_MASK (~(PMD_SIZE-1))
56
57
58#define PGDIR_SIZE PGD_SIZE
59#define PGDIR_MASK PGD_MASK
60
61#define PTRS_PER_PGD 32
62#define PTRS_PER_PMD 1
63#define PTRS_PER_PTE 32
64
65#define FIRST_USER_PGD_NR 1
66#define USER_PTRS_PER_PGD ((TASK_SIZE/PGD_SIZE) - FIRST_USER_PGD_NR)
67
68
69#define LIBRARY_TEXT_START 0x0c000000
70
71
72
73#ifndef __ASSEMBLY__
74extern void __pte_error(const char *file, int line, unsigned long val);
75extern void __pmd_error(const char *file, int line, unsigned long val);
76extern void __pgd_error(const char *file, int line, unsigned long val);
77
78#define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte_val(pte))
79#define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd_val(pmd))
80#define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd))
81
82
83
84
85
86extern struct page *empty_zero_page;
87#define ZERO_PAGE(vaddr) (empty_zero_page)
88
89#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
90#define pte_page(pte) (pfn_to_page(pte_pfn(pte)))
91#define pfn_pte(pfn,prot) (__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)))
92#define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT))
93#define mk_pte(page,prot) pfn_pte(page_to_pfn(page),prot)
94#define page_pte_prot(page,prot) mk_pte(page, prot)
95#define page_pte(page) mk_pte(page, __pgprot(0))
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137#define _PMD_PRESENT (0x01)
138
139
140#define pgd_none(pgd) (0)
141#define pgd_bad(pgd) (0)
142#define pgd_present(pgd) (1)
143#define pgd_clear(pgdp) do { } while (0)
144
145
146
147#define pmd_none(pmd) (!pmd_val(pmd))
148#define pmd_bad(pmd) ((pmd_val(pmd) & 0xfc000002))
149#define pmd_present(pmd) (pmd_val(pmd) & _PMD_PRESENT)
150#define set_pmd(pmd_ptr, pmd) ((*(pmd_ptr)) = (pmd))
151#define pmd_clear(pmdp) set_pmd(pmdp, __pmd(0))
152
153
154#define pte_none(pte) (!pte_val(pte))
155#define pte_present(pte) (pte_val(pte) & _PAGE_PRESENT)
156#define set_pte(pte_ptr, pte) ((*(pte_ptr)) = (pte))
157#define pte_clear(ptep) set_pte((ptep), __pte(0))
158
159
160#define pgd_offset(mm, addr) ((pgd_t *)(mm)->pgd + __pgd_index(addr))
161#define pmd_offset(pgd, addr) ((pmd_t *)(pgd))
162#define pte_offset(pmd, addr) ((pte_t *)pmd_page(*(pmd)) + __pte_index(addr))
163
164
165#define __pgd_index(addr) ((addr) >> PGD_SHIFT)
166#define __pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
167
168
169
170#define pgd_index(addr) __pgd_index(addr)
171#define pgd_offset_k(addr) (pgd_offset(&init_mm, addr))
172
173
174
175
176
177#define VMALLOC_START 0x01a00000
178#define VMALLOC_END 0x01c00000
179
180
181
182
183#define pmd_page(pmd) ((struct page *)(pmd_val((pmd)) & ~_PMD_PRESENT))
184#define pmd_page_kernel(pmd) ((pte_t *)(pmd_val((pmd)) & ~_PMD_PRESENT))
185
186#define pte_offset_kernel(dir,addr) (pmd_page_kernel(*(dir)) + __pte_index(addr))
187
188#define pte_offset_map(dir,addr) (pmd_page_kernel(*(dir)) + __pte_index(addr))
189#define pte_offset_map_nested(dir,addr) (pmd_page_kernel(*(dir)) + __pte_index(addr))
190#define pte_unmap(pte) do { } while (0)
191#define pte_unmap_nested(pte) do { } while (0)
192
193
194#define _PAGE_PRESENT 0x01
195#define _PAGE_READONLY 0x02
196#define _PAGE_NOT_USER 0x04
197#define _PAGE_OLD 0x08
198#define _PAGE_CLEAN 0x10
199
200
201
202
203
204#define PAGE_NONE __pgprot(_PAGE_PRESENT | _PAGE_CLEAN | _PAGE_READONLY | _PAGE_NOT_USER)
205#define PAGE_SHARED __pgprot(_PAGE_PRESENT | _PAGE_CLEAN )
206#define PAGE_COPY __pgprot(_PAGE_PRESENT | _PAGE_CLEAN | _PAGE_READONLY )
207#define PAGE_READONLY __pgprot(_PAGE_PRESENT | _PAGE_CLEAN | _PAGE_READONLY )
208#define PAGE_KERNEL __pgprot(_PAGE_PRESENT | _PAGE_NOT_USER)
209
210#define _PAGE_CHG_MASK (PAGE_MASK | _PAGE_OLD | _PAGE_CLEAN)
211
212
213
214
215
216#define pte_read(pte) (!(pte_val(pte) & _PAGE_NOT_USER))
217#define pte_write(pte) (!(pte_val(pte) & _PAGE_READONLY))
218#define pte_exec(pte) (!(pte_val(pte) & _PAGE_NOT_USER))
219#define pte_dirty(pte) (!(pte_val(pte) & _PAGE_CLEAN))
220#define pte_young(pte) (!(pte_val(pte) & _PAGE_OLD))
221
222#define pte_file(pte) (!(pte_val(pte) & _PAGE_OLD))
223
224#define PTE_BIT_FUNC(fn,op) \
225static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
226
227PTE_BIT_FUNC(wrprotect, |= _PAGE_READONLY);
228PTE_BIT_FUNC(mkwrite, &= ~_PAGE_READONLY);
229PTE_BIT_FUNC(exprotect, |= _PAGE_NOT_USER);
230PTE_BIT_FUNC(mkexec, &= ~_PAGE_NOT_USER);
231PTE_BIT_FUNC(mkclean, |= _PAGE_CLEAN);
232PTE_BIT_FUNC(mkdirty, &= ~_PAGE_CLEAN);
233PTE_BIT_FUNC(mkold, |= _PAGE_OLD);
234PTE_BIT_FUNC(mkyoung, &= ~_PAGE_OLD);
235
236
237
238
239#define pgprot_noncached(prot) (prot)
240#define pgprot_writecombine(prot) (prot)
241
242extern void pgtable_cache_init(void);
243
244
245#define pte_to_pgoff(x) (pte_val(x) >> 2)
246#define pgoff_to_pte(x) __pte(((x) << 2) & ~_PAGE_OLD)
247
248
249#define PTE_FILE_MAX_BITS 30
250
251
252static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
253{
254 pte_val(pte) = (pte_val(pte) & _PAGE_CHG_MASK) | pgprot_val(newprot);
255 return pte;
256}
257
258extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
259
260
261
262
263
264#define __swp_type(x) (((x).val >> 2) & 0x7f)
265#define __swp_offset(x) ((x).val >> 9)
266#define __swp_entry(type,offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 9) })
267#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
268#define __swp_entry_to_pte(swp) ((pte_t) { (swp).val })
269
270
271
272#define kern_addr_valid(addr) (1)
273
274
275
276
277
278static inline pte_t mk_pte_phys(unsigned long physpage, pgprot_t pgprot)
279{
280 pte_t pte;
281 pte_val(pte) = physpage | pgprot_val(pgprot);
282 return pte;
283}
284
285
286#include <asm-generic/pgtable.h>
287
288
289
290
291
292#define io_remap_page_range(vma,from,phys,size,prot) \
293 remap_pfn_range(vma, from, (phys) >> PAGE_SHIFT, size, prot)
294
295#endif
296
297#endif
298