Commit | Line | Data |
---|---|---|
1da177e4 LT |
1 | #ifndef _I386_PGTABLE_2LEVEL_H |
2 | #define _I386_PGTABLE_2LEVEL_H | |
3 | ||
4 | #include <asm-generic/pgtable-nopmd.h> | |
5 | ||
6 | #define pte_ERROR(e) \ | |
7 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low) | |
8 | #define pgd_ERROR(e) \ | |
9 | printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) | |
10 | ||
11 | /* | |
12 | * Certain architectures need to do special things when PTEs | |
13 | * within a page table are directly modified. Thus, the following | |
14 | * hook is made available. | |
15 | */ | |
16 | #define set_pte(pteptr, pteval) (*(pteptr) = pteval) | |
17 | #define set_pte_at(mm,addr,ptep,pteval) set_pte(ptep,pteval) | |
18 | #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval) | |
19 | #define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval)) | |
20 | ||
21 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte_low, 0)) | |
22 | #define pte_same(a, b) ((a).pte_low == (b).pte_low) | |
23 | #define pte_page(x) pfn_to_page(pte_pfn(x)) | |
24 | #define pte_none(x) (!(x).pte_low) | |
25 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) | |
26 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | |
27 | #define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | |
28 | ||
29 | #define pmd_page(pmd) (pfn_to_page(pmd_val(pmd) >> PAGE_SHIFT)) | |
30 | ||
31 | #define pmd_page_kernel(pmd) \ | |
32 | ((unsigned long) __va(pmd_val(pmd) & PAGE_MASK)) | |
33 | ||
34 | /* | |
35 | * All present user pages are user-executable: | |
36 | */ | |
37 | static inline int pte_exec(pte_t pte) | |
38 | { | |
39 | return pte_user(pte); | |
40 | } | |
41 | ||
42 | /* | |
43 | * All present pages are kernel-executable: | |
44 | */ | |
45 | static inline int pte_exec_kernel(pte_t pte) | |
46 | { | |
47 | return 1; | |
48 | } | |
49 | ||
50 | /* | |
51 | * Bits 0, 6 and 7 are taken, split up the 29 bits of offset | |
52 | * into this range: | |
53 | */ | |
54 | #define PTE_FILE_MAX_BITS 29 | |
55 | ||
56 | #define pte_to_pgoff(pte) \ | |
57 | ((((pte).pte_low >> 1) & 0x1f ) + (((pte).pte_low >> 8) << 5 )) | |
58 | ||
59 | #define pgoff_to_pte(off) \ | |
60 | ((pte_t) { (((off) & 0x1f) << 1) + (((off) >> 5) << 8) + _PAGE_FILE }) | |
61 | ||
62 | /* Encode and de-code a swap entry */ | |
63 | #define __swp_type(x) (((x).val >> 1) & 0x1f) | |
64 | #define __swp_offset(x) ((x).val >> 8) | |
65 | #define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 8) }) | |
66 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte_low }) | |
67 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | |
68 | ||
69 | #endif /* _I386_PGTABLE_2LEVEL_H */ |