Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
422 | giacomo | 1 | #ifndef _I386_PGTABLE_2LEVEL_H |
2 | #define _I386_PGTABLE_2LEVEL_H |
||
3 | |||
4 | /* |
||
5 | * traditional i386 two-level paging structure: |
||
6 | */ |
||
7 | |||
8 | #define PGDIR_SHIFT 22 |
||
9 | #define PTRS_PER_PGD 1024 |
||
10 | |||
11 | /* |
||
12 | * the i386 is two-level, so we don't really have any |
||
13 | * PMD directory physically. |
||
14 | */ |
||
15 | #define PMD_SHIFT 22 |
||
16 | #define PTRS_PER_PMD 1 |
||
17 | |||
18 | #define PTRS_PER_PTE 1024 |
||
19 | |||
20 | #define pte_ERROR(e) \ |
||
21 | printk("%s:%d: bad pte %08lx.\n", __FILE__, __LINE__, (e).pte_low) |
||
22 | #define pmd_ERROR(e) \ |
||
23 | printk("%s:%d: bad pmd %08lx.\n", __FILE__, __LINE__, pmd_val(e)) |
||
24 | #define pgd_ERROR(e) \ |
||
25 | printk("%s:%d: bad pgd %08lx.\n", __FILE__, __LINE__, pgd_val(e)) |
||
26 | |||
27 | /* |
||
28 | * The "pgd_xxx()" functions here are trivial for a folded two-level |
||
29 | * setup: the pgd is never bad, and a pmd always exists (as it's folded |
||
30 | * into the pgd entry) |
||
31 | */ |
||
32 | static inline int pgd_none(pgd_t pgd) { return 0; } |
||
33 | static inline int pgd_bad(pgd_t pgd) { return 0; } |
||
34 | static inline int pgd_present(pgd_t pgd) { return 1; } |
||
35 | #define pgd_clear(xp) do { } while (0) |
||
36 | |||
37 | /* |
||
38 | * Certain architectures need to do special things when PTEs |
||
39 | * within a page table are directly modified. Thus, the following |
||
40 | * hook is made available. |
||
41 | */ |
||
42 | #define set_pte(pteptr, pteval) (*(pteptr) = pteval) |
||
43 | #define set_pte_atomic(pteptr, pteval) set_pte(pteptr,pteval) |
||
44 | /* |
||
45 | * (pmds are folded into pgds so this doesn't get actually called, |
||
46 | * but the define is needed for a generic inline function.) |
||
47 | */ |
||
48 | #define set_pmd(pmdptr, pmdval) (*(pmdptr) = pmdval) |
||
49 | #define set_pgd(pgdptr, pgdval) (*(pgdptr) = pgdval) |
||
50 | |||
51 | #define pgd_page(pgd) \ |
||
52 | ((unsigned long) __va(pgd_val(pgd) & PAGE_MASK)) |
||
53 | |||
54 | static inline pmd_t * pmd_offset(pgd_t * dir, unsigned long address) |
||
55 | { |
||
56 | return (pmd_t *) dir; |
||
57 | } |
||
58 | #define ptep_get_and_clear(xp) __pte(xchg(&(xp)->pte_low, 0)) |
||
59 | #define pte_same(a, b) ((a).pte_low == (b).pte_low) |
||
60 | #define pte_page(x) pfn_to_page(pte_pfn(x)) |
||
61 | #define pte_none(x) (!(x).pte_low) |
||
62 | #define pte_pfn(x) ((unsigned long)(((x).pte_low >> PAGE_SHIFT))) |
||
63 | #define pfn_pte(pfn, prot) __pte(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) |
||
64 | #define pfn_pmd(pfn, prot) __pmd(((pfn) << PAGE_SHIFT) | pgprot_val(prot)) |
||
65 | |||
66 | /* |
||
67 | * Bits 0, 6 and 7 are taken, split up the 29 bits of offset |
||
68 | * into this range: |
||
69 | */ |
||
70 | #define PTE_FILE_MAX_BITS 29 |
||
71 | |||
72 | #define pte_to_pgoff(pte) \ |
||
73 | ((((pte).pte_low >> 1) & 0x1f ) + (((pte).pte_low >> 8) << 5 )) |
||
74 | |||
75 | #define pgoff_to_pte(off) \ |
||
76 | ((pte_t) { (((off) & 0x1f) << 1) + (((off) >> 5) << 8) + _PAGE_FILE }) |
||
77 | |||
78 | #endif /* _I386_PGTABLE_2LEVEL_H */ |