diff options
Diffstat (limited to 'arch/arm/include/asm/pgtable.h')
-rw-r--r-- | arch/arm/include/asm/pgtable.h | 37 |
1 files changed, 22 insertions, 15 deletions
diff --git a/arch/arm/include/asm/pgtable.h b/arch/arm/include/asm/pgtable.h index c433c6c73112..201ccaa11f61 100644 --- a/arch/arm/include/asm/pgtable.h +++ b/arch/arm/include/asm/pgtable.h | |||
@@ -162,10 +162,8 @@ extern void __pgd_error(const char *file, int line, unsigned long val); | |||
162 | * entries are stored 1024 bytes below. | 162 | * entries are stored 1024 bytes below. |
163 | */ | 163 | */ |
164 | #define L_PTE_PRESENT (1 << 0) | 164 | #define L_PTE_PRESENT (1 << 0) |
165 | #define L_PTE_FILE (1 << 1) /* only when !PRESENT */ | ||
166 | #define L_PTE_YOUNG (1 << 1) | 165 | #define L_PTE_YOUNG (1 << 1) |
167 | #define L_PTE_BUFFERABLE (1 << 2) /* obsolete, matches PTE */ | 166 | #define L_PTE_FILE (1 << 2) /* only when !PRESENT */ |
168 | #define L_PTE_CACHEABLE (1 << 3) /* obsolete, matches PTE */ | ||
169 | #define L_PTE_DIRTY (1 << 6) | 167 | #define L_PTE_DIRTY (1 << 6) |
170 | #define L_PTE_WRITE (1 << 7) | 168 | #define L_PTE_WRITE (1 << 7) |
171 | #define L_PTE_USER (1 << 8) | 169 | #define L_PTE_USER (1 << 8) |
@@ -264,10 +262,19 @@ extern struct page *empty_zero_page; | |||
264 | #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) | 262 | #define pte_clear(mm,addr,ptep) set_pte_ext(ptep, __pte(0), 0) |
265 | #define pte_page(pte) (pfn_to_page(pte_pfn(pte))) | 263 | #define pte_page(pte) (pfn_to_page(pte_pfn(pte))) |
266 | #define pte_offset_kernel(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr)) | 264 | #define pte_offset_kernel(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr)) |
267 | #define pte_offset_map(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr)) | 265 | |
268 | #define pte_offset_map_nested(dir,addr) (pmd_page_vaddr(*(dir)) + __pte_index(addr)) | 266 | #define pte_offset_map(dir,addr) (__pte_map(dir, KM_PTE0) + __pte_index(addr)) |
269 | #define pte_unmap(pte) do { } while (0) | 267 | #define pte_offset_map_nested(dir,addr) (__pte_map(dir, KM_PTE1) + __pte_index(addr)) |
270 | #define pte_unmap_nested(pte) do { } while (0) | 268 | #define pte_unmap(pte) __pte_unmap(pte, KM_PTE0) |
269 | #define pte_unmap_nested(pte) __pte_unmap(pte, KM_PTE1) | ||
270 | |||
271 | #ifndef CONFIG_HIGHPTE | ||
272 | #define __pte_map(dir,km) pmd_page_vaddr(*(dir)) | ||
273 | #define __pte_unmap(pte,km) do { } while (0) | ||
274 | #else | ||
275 | #define __pte_map(dir,km) ((pte_t *)kmap_atomic(pmd_page(*(dir)), km) + PTRS_PER_PTE) | ||
276 | #define __pte_unmap(pte,km) kunmap_atomic((pte - PTRS_PER_PTE), km) | ||
277 | #endif | ||
271 | 278 | ||
272 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) | 279 | #define set_pte_ext(ptep,pte,ext) cpu_set_pte_ext(ptep,pte,ext) |
273 | 280 | ||
@@ -381,13 +388,13 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
381 | * | 388 | * |
382 | * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 | 389 | * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 |
383 | * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | 390 | * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 |
384 | * <--------------- offset --------------------> <--- type --> 0 0 | 391 | * <--------------- offset --------------------> <- type --> 0 0 0 |
385 | * | 392 | * |
386 | * This gives us up to 127 swap files and 32GB per swap file. Note that | 393 | * This gives us up to 63 swap files and 32GB per swap file. Note that |
387 | * the offset field is always non-zero. | 394 | * the offset field is always non-zero. |
388 | */ | 395 | */ |
389 | #define __SWP_TYPE_SHIFT 2 | 396 | #define __SWP_TYPE_SHIFT 3 |
390 | #define __SWP_TYPE_BITS 7 | 397 | #define __SWP_TYPE_BITS 6 |
391 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) | 398 | #define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1) |
392 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) | 399 | #define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT) |
393 | 400 | ||
@@ -411,13 +418,13 @@ extern pgd_t swapper_pg_dir[PTRS_PER_PGD]; | |||
411 | * | 418 | * |
412 | * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 | 419 | * 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 |
413 | * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | 420 | * 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 |
414 | * <------------------------ offset -------------------------> 1 0 | 421 | * <----------------------- offset ------------------------> 1 0 0 |
415 | */ | 422 | */ |
416 | #define pte_file(pte) (pte_val(pte) & L_PTE_FILE) | 423 | #define pte_file(pte) (pte_val(pte) & L_PTE_FILE) |
417 | #define pte_to_pgoff(x) (pte_val(x) >> 2) | 424 | #define pte_to_pgoff(x) (pte_val(x) >> 3) |
418 | #define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE) | 425 | #define pgoff_to_pte(x) __pte(((x) << 3) | L_PTE_FILE) |
419 | 426 | ||
420 | #define PTE_FILE_MAX_BITS 30 | 427 | #define PTE_FILE_MAX_BITS 29 |
421 | 428 | ||
422 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ | 429 | /* Needs to be defined here and not in linux/mm.h, as it is arch dependent */ |
423 | /* FIXME: this is not correct */ | 430 | /* FIXME: this is not correct */ |