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 | ||
6e5882cf ZA |
21 | #define pte_clear(mm,addr,xp) do { set_pte_at(mm, addr, xp, __pte(0)); } while (0) |
22 | #define pmd_clear(xp) do { set_pmd(xp, __pmd(0)); } while (0) | |
23 | ||
6049742d | 24 | #define __HAVE_ARCH_PTEP_GET_AND_CLEAR |
1da177e4 | 25 | #define ptep_get_and_clear(mm,addr,xp) __pte(xchg(&(xp)->pte_low, 0)) |
6049742d | 26 | |
1da177e4 LT |
27 | #define pte_page(x) pfn_to_page(pte_pfn(x)) |
28 | #define pte_none(x) (!(x).pte_low) | |
29 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) | |
30 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | |
31 | #define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) | |
32 | ||
1da177e4 LT |
33 | /* |
34 | * All present user pages are user-executable: | |
35 | */ | |
36 | static inline int pte_exec(pte_t pte) | |
37 | { | |
38 | return pte_user(pte); | |
39 | } | |
40 | ||
41 | /* | |
42 | * All present pages are kernel-executable: | |
43 | */ | |
44 | static inline int pte_exec_kernel(pte_t pte) | |
45 | { | |
46 | return 1; | |
47 | } | |
48 | ||
49 | /* | |
50 | * Bits 0, 6 and 7 are taken, split up the 29 bits of offset | |
51 | * into this range: | |
52 | */ | |
53 | #define PTE_FILE_MAX_BITS 29 | |
54 | ||
55 | #define pte_to_pgoff(pte) \ | |
56 | ((((pte).pte_low >> 1) & 0x1f ) + (((pte).pte_low >> 8) << 5 )) | |
57 | ||
58 | #define pgoff_to_pte(off) \ | |
59 | ((pte_t) { (((off) & 0x1f) << 1) + (((off) >> 5) << 8) + _PAGE_FILE }) | |
60 | ||
61 | /* Encode and de-code a swap entry */ | |
62 | #define __swp_type(x) (((x).val >> 1) & 0x1f) | |
63 | #define __swp_offset(x) ((x).val >> 8) | |
64 | #define __swp_entry(type, offset) ((swp_entry_t) { ((type) << 1) | ((offset) << 8) }) | |
65 | #define __pte_to_swp_entry(pte) ((swp_entry_t) { (pte).pte_low }) | |
66 | #define __swp_entry_to_pte(x) ((pte_t) { (x).val }) | |
67 | ||
101f12af JB |
68 | void vmalloc_sync_all(void); |
69 | ||
1da177e4 | 70 | #endif /* _I386_PGTABLE_2LEVEL_H */ |