1
2
3
4
5
6
7
8
9
10#ifndef _ASMARM_PGTABLE_H
11#define _ASMARM_PGTABLE_H
12
13#include <asm-generic/4level-fixup.h>
14
15#include <asm/memory.h>
16#include <asm/proc-fns.h>
17#include <asm/arch/vmalloc.h>
18
19
20
21
22
23
24
25
26
27
28
29
30
31#ifndef VMALLOC_START
32#define VMALLOC_OFFSET (8*1024*1024)
33#define VMALLOC_START (((unsigned long)high_memory + VMALLOC_OFFSET) & ~(VMALLOC_OFFSET-1))
34#endif
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94#define PTRS_PER_PTE 512
95#define PTRS_PER_PMD 1
96#define PTRS_PER_PGD 2048
97
98
99
100
101
102#define PMD_SHIFT 21
103#define PGDIR_SHIFT 21
104
105#define LIBRARY_TEXT_START 0x0c000000
106
107#ifndef __ASSEMBLY__
108extern void __pte_error(const char *file, int line, unsigned long val);
109extern void __pmd_error(const char *file, int line, unsigned long val);
110extern void __pgd_error(const char *file, int line, unsigned long val);
111
112#define pte_ERROR(pte) __pte_error(__FILE__, __LINE__, pte_val(pte))
113#define pmd_ERROR(pmd) __pmd_error(__FILE__, __LINE__, pmd_val(pmd))
114#define pgd_ERROR(pgd) __pgd_error(__FILE__, __LINE__, pgd_val(pgd))
115#endif
116
117#define PMD_SIZE (1UL << PMD_SHIFT)
118#define PMD_MASK (~(PMD_SIZE-1))
119#define PGDIR_SIZE (1UL << PGDIR_SHIFT)
120#define PGDIR_MASK (~(PGDIR_SIZE-1))
121
122
123
124
125
126
127#define FIRST_USER_ADDRESS PAGE_SIZE
128
129#define FIRST_USER_PGD_NR 1
130#define USER_PTRS_PER_PGD ((TASK_SIZE/PGDIR_SIZE) - FIRST_USER_PGD_NR)
131
132
133
134
135#define SUPERSECTION_SHIFT 24
136#define SUPERSECTION_SIZE (1UL << SUPERSECTION_SHIFT)
137#define SUPERSECTION_MASK (~(SUPERSECTION_SIZE-1))
138
139
140
141
142
143
144
145#define PMD_TYPE_MASK (3 << 0)
146#define PMD_TYPE_FAULT (0 << 0)
147#define PMD_TYPE_TABLE (1 << 0)
148#define PMD_TYPE_SECT (2 << 0)
149#define PMD_BIT4 (1 << 4)
150#define PMD_DOMAIN(x) ((x) << 5)
151#define PMD_PROTECTION (1 << 9)
152
153
154
155#define PMD_SECT_BUFFERABLE (1 << 2)
156#define PMD_SECT_CACHEABLE (1 << 3)
157#define PMD_SECT_AP_WRITE (1 << 10)
158#define PMD_SECT_AP_READ (1 << 11)
159#define PMD_SECT_TEX(x) ((x) << 12)
160#define PMD_SECT_APX (1 << 15)
161#define PMD_SECT_S (1 << 16)
162#define PMD_SECT_nG (1 << 17)
163#define PMD_SECT_SUPER (1 << 18)
164
165#define PMD_SECT_UNCACHED (0)
166#define PMD_SECT_BUFFERED (PMD_SECT_BUFFERABLE)
167#define PMD_SECT_WT (PMD_SECT_CACHEABLE)
168#define PMD_SECT_WB (PMD_SECT_CACHEABLE | PMD_SECT_BUFFERABLE)
169#define PMD_SECT_MINICACHE (PMD_SECT_TEX(1) | PMD_SECT_CACHEABLE)
170#define PMD_SECT_WBWA (PMD_SECT_TEX(1) | PMD_SECT_CACHEABLE | PMD_SECT_BUFFERABLE)
171
172
173
174
175
176
177
178
179
180#define PTE_TYPE_MASK (3 << 0)
181#define PTE_TYPE_FAULT (0 << 0)
182#define PTE_TYPE_LARGE (1 << 0)
183#define PTE_TYPE_SMALL (2 << 0)
184#define PTE_TYPE_EXT (3 << 0)
185#define PTE_BUFFERABLE (1 << 2)
186#define PTE_CACHEABLE (1 << 3)
187
188
189
190
191#define PTE_EXT_AP_MASK (3 << 4)
192#define PTE_EXT_AP_UNO_SRO (0 << 4)
193#define PTE_EXT_AP_UNO_SRW (1 << 4)
194#define PTE_EXT_AP_URO_SRW (2 << 4)
195#define PTE_EXT_AP_URW_SRW (3 << 4)
196#define PTE_EXT_TEX(x) ((x) << 6)
197
198
199
200
201#define PTE_SMALL_AP_MASK (0xff << 4)
202#define PTE_SMALL_AP_UNO_SRO (0x00 << 4)
203#define PTE_SMALL_AP_UNO_SRW (0x55 << 4)
204#define PTE_SMALL_AP_URO_SRW (0xaa << 4)
205#define PTE_SMALL_AP_URW_SRW (0xff << 4)
206
207
208
209
210
211
212
213
214
215
216
217
218#define L_PTE_PRESENT (1 << 0)
219#define L_PTE_FILE (1 << 1)
220#define L_PTE_YOUNG (1 << 1)
221#define L_PTE_BUFFERABLE (1 << 2)
222#define L_PTE_CACHEABLE (1 << 3)
223#define L_PTE_USER (1 << 4)
224#define L_PTE_WRITE (1 << 5)
225#define L_PTE_EXEC (1 << 6)
226#define L_PTE_DIRTY (1 << 7)
227
228#ifndef __ASSEMBLY__
229
230#include <asm/domain.h>
231
232#define _PAGE_USER_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_USER))
233#define _PAGE_KERNEL_TABLE (PMD_TYPE_TABLE | PMD_BIT4 | PMD_DOMAIN(DOMAIN_KERNEL))
234
235
236
237
238#define _L_PTE_DEFAULT L_PTE_PRESENT | L_PTE_YOUNG | L_PTE_CACHEABLE | L_PTE_BUFFERABLE
239#define _L_PTE_READ L_PTE_USER | L_PTE_EXEC
240
241extern pgprot_t pgprot_kernel;
242
243#define PAGE_NONE __pgprot(_L_PTE_DEFAULT)
244#define PAGE_COPY __pgprot(_L_PTE_DEFAULT | _L_PTE_READ)
245#define PAGE_SHARED __pgprot(_L_PTE_DEFAULT | _L_PTE_READ | L_PTE_WRITE)
246#define PAGE_READONLY __pgprot(_L_PTE_DEFAULT | _L_PTE_READ)
247#define PAGE_KERNEL pgprot_kernel
248
249#endif
250
251
252
253
254
255
256
257
258
259#define __P000 PAGE_NONE
260#define __P001 PAGE_READONLY
261#define __P010 PAGE_COPY
262#define __P011 PAGE_COPY
263#define __P100 PAGE_READONLY
264#define __P101 PAGE_READONLY
265#define __P110 PAGE_COPY
266#define __P111 PAGE_COPY
267
268#define __S000 PAGE_NONE
269#define __S001 PAGE_READONLY
270#define __S010 PAGE_SHARED
271#define __S011 PAGE_SHARED
272#define __S100 PAGE_READONLY
273#define __S101 PAGE_READONLY
274#define __S110 PAGE_SHARED
275#define __S111 PAGE_SHARED
276
277#ifndef __ASSEMBLY__
278
279
280
281
282extern struct page *empty_zero_page;
283#define ZERO_PAGE(vaddr) (empty_zero_page)
284
285#define pte_pfn(pte) (pte_val(pte) >> PAGE_SHIFT)
286#define pfn_pte(pfn,prot) (__pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)))
287
288#define pte_none(pte) (!pte_val(pte))
289#define pte_clear(mm,addr,ptep) set_pte_at((mm),(addr),(ptep), __pte(0))
290#define pte_page(pte) (pfn_to_page(pte_pfn(pte)))
291#define pte_offset_kernel(dir,addr) (pmd_page_kernel(*(dir)) + __pte_index(addr))
292#define pte_offset_map(dir,addr) (pmd_page_kernel(*(dir)) + __pte_index(addr))
293#define pte_offset_map_nested(dir,addr) (pmd_page_kernel(*(dir)) + __pte_index(addr))
294#define pte_unmap(pte) do { } while (0)
295#define pte_unmap_nested(pte) do { } while (0)
296
297#define set_pte(ptep, pte) cpu_set_pte(ptep,pte)
298#define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval)
299
300
301
302
303
304#define pte_present(pte) (pte_val(pte) & L_PTE_PRESENT)
305#define pte_read(pte) (pte_val(pte) & L_PTE_USER)
306#define pte_write(pte) (pte_val(pte) & L_PTE_WRITE)
307#define pte_exec(pte) (pte_val(pte) & L_PTE_EXEC)
308#define pte_dirty(pte) (pte_val(pte) & L_PTE_DIRTY)
309#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
310
311
312
313
314#define pte_file(pte) (pte_val(pte) & L_PTE_FILE)
315#define pte_to_pgoff(x) (pte_val(x) >> 2)
316#define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE)
317
318#define PTE_FILE_MAX_BITS 30
319
320#define PTE_BIT_FUNC(fn,op) \
321static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
322
323
324
325PTE_BIT_FUNC(wrprotect, &= ~L_PTE_WRITE);
326PTE_BIT_FUNC(mkwrite, |= L_PTE_WRITE);
327PTE_BIT_FUNC(exprotect, &= ~L_PTE_EXEC);
328PTE_BIT_FUNC(mkexec, |= L_PTE_EXEC);
329PTE_BIT_FUNC(mkclean, &= ~L_PTE_DIRTY);
330PTE_BIT_FUNC(mkdirty, |= L_PTE_DIRTY);
331PTE_BIT_FUNC(mkold, &= ~L_PTE_YOUNG);
332PTE_BIT_FUNC(mkyoung, |= L_PTE_YOUNG);
333
334
335
336
337#define pgprot_noncached(prot) __pgprot(pgprot_val(prot) & ~(L_PTE_CACHEABLE | L_PTE_BUFFERABLE))
338#define pgprot_writecombine(prot) __pgprot(pgprot_val(prot) & ~L_PTE_CACHEABLE)
339
340#define pmd_none(pmd) (!pmd_val(pmd))
341#define pmd_present(pmd) (pmd_val(pmd))
342#define pmd_bad(pmd) (pmd_val(pmd) & 2)
343
344#define copy_pmd(pmdpd,pmdps) \
345 do { \
346 pmdpd[0] = pmdps[0]; \
347 pmdpd[1] = pmdps[1]; \
348 flush_pmd_entry(pmdpd); \
349 } while (0)
350
351#define pmd_clear(pmdp) \
352 do { \
353 pmdp[0] = __pmd(0); \
354 pmdp[1] = __pmd(0); \
355 clean_pmd_entry(pmdp); \
356 } while (0)
357
358static inline pte_t *pmd_page_kernel(pmd_t pmd)
359{
360 unsigned long ptr;
361
362 ptr = pmd_val(pmd) & ~(PTRS_PER_PTE * sizeof(void *) - 1);
363 ptr += PTRS_PER_PTE * sizeof(void *);
364
365 return __va(ptr);
366}
367
368#define pmd_page(pmd) virt_to_page(__va(pmd_val(pmd)))
369
370
371
372
373#define pages_to_mb(x) ((x) >> (20 - PAGE_SHIFT))
374
375
376
377
378
379#define mk_pte(page,prot) pfn_pte(page_to_pfn(page),prot)
380
381
382
383
384
385
386#define pgd_none(pgd) (0)
387#define pgd_bad(pgd) (0)
388#define pgd_present(pgd) (1)
389#define pgd_clear(pgdp) do { } while (0)
390#define set_pgd(pgd,pgdp) do { } while (0)
391
392#define page_pte_prot(page,prot) mk_pte(page, prot)
393#define page_pte(page) mk_pte(page, __pgprot(0))
394
395
396#define pgd_index(addr) ((addr) >> PGDIR_SHIFT)
397
398#define pgd_offset(mm, addr) ((mm)->pgd+pgd_index(addr))
399
400
401#define pgd_offset_k(addr) pgd_offset(&init_mm, addr)
402
403
404#define pmd_offset(dir, addr) ((pmd_t *)(dir))
405
406
407#define __pte_index(addr) (((addr) >> PAGE_SHIFT) & (PTRS_PER_PTE - 1))
408
409static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
410{
411 const unsigned long mask = L_PTE_EXEC | L_PTE_WRITE | L_PTE_USER;
412 pte_val(pte) = (pte_val(pte) & ~mask) | (pgprot_val(newprot) & mask);
413 return pte;
414}
415
416extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
417
418
419
420
421
422#define __swp_type(x) (((x).val >> 2) & 0x7f)
423#define __swp_offset(x) ((x).val >> 9)
424#define __swp_entry(type,offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 9) })
425#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
426#define __swp_entry_to_pte(swp) ((pte_t) { (swp).val })
427
428
429
430#define kern_addr_valid(addr) (1)
431
432#include <asm-generic/pgtable.h>
433
434
435
436
437#define HAVE_ARCH_UNMAPPED_AREA
438
439
440
441
442
443#define io_remap_page_range(vma,from,phys,size,prot) \
444 remap_pfn_range(vma, from, (phys) >> PAGE_SHIFT, size, prot)
445
446#define io_remap_pfn_range(vma,from,pfn,size,prot) \
447 remap_pfn_range(vma, from, pfn, size, prot)
448
449#define MK_IOSPACE_PFN(space, pfn) (pfn)
450#define GET_IOSPACE(pfn) 0
451#define GET_PFN(pfn) (pfn)
452
453#define pgtable_cache_init() do { } while (0)
454
455#endif
456
457#endif
458