Rev 5270 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5270 | serge | 1 | #ifndef _PGTABLE_NOPMD_H |
2 | #define _PGTABLE_NOPMD_H |
||
3 | |||
4 | #ifndef __ASSEMBLY__ |
||
5 | |||
6 | #include |
||
7 | |||
8 | struct mm_struct; |
||
9 | |||
10 | #define __PAGETABLE_PMD_FOLDED |
||
11 | |||
12 | /* |
||
13 | * Having the pmd type consist of a pud gets the size right, and allows |
||
14 | * us to conceptually access the pud entry that this pmd is folded into |
||
15 | * without casting. |
||
16 | */ |
||
17 | typedef struct { pud_t pud; } pmd_t; |
||
18 | |||
19 | #define PMD_SHIFT PUD_SHIFT |
||
20 | #define PTRS_PER_PMD 1 |
||
21 | #define PMD_SIZE (1UL << PMD_SHIFT) |
||
22 | #define PMD_MASK (~(PMD_SIZE-1)) |
||
23 | |||
24 | /* |
||
25 | * The "pud_xxx()" functions here are trivial for a folded two-level |
||
26 | * setup: the pmd is never bad, and a pmd always exists (as it's folded |
||
27 | * into the pud entry) |
||
28 | */ |
||
29 | static inline int pud_none(pud_t pud) { return 0; } |
||
30 | static inline int pud_bad(pud_t pud) { return 0; } |
||
31 | static inline int pud_present(pud_t pud) { return 1; } |
||
32 | static inline void pud_clear(pud_t *pud) { } |
||
33 | #define pmd_ERROR(pmd) (pud_ERROR((pmd).pud)) |
||
34 | |||
35 | #define pud_populate(mm, pmd, pte) do { } while (0) |
||
36 | |||
37 | /* |
||
38 | * (pmds are folded into puds so this doesn't get actually called, |
||
39 | * but the define is needed for a generic inline function.) |
||
40 | */ |
||
41 | #define set_pud(pudptr, pudval) set_pmd((pmd_t *)(pudptr), (pmd_t) { pudval }) |
||
42 | |||
43 | static inline pmd_t * pmd_offset(pud_t * pud, unsigned long address) |
||
44 | { |
||
45 | return (pmd_t *)pud; |
||
46 | } |
||
47 | |||
48 | #define pmd_val(x) (pud_val((x).pud)) |
||
49 | #define __pmd(x) ((pmd_t) { __pud(x) } ) |
||
50 | |||
51 | #define pud_page(pud) (pmd_page((pmd_t){ pud })) |
||
52 | #define pud_page_vaddr(pud) (pmd_page_vaddr((pmd_t){ pud })) |
||
53 | |||
54 | /* |
||
55 | * allocating and freeing a pmd is trivial: the 1-entry pmd is |
||
56 | * inside the pud, so has no extra memory associated with it. |
||
57 | */ |
||
58 | #define pmd_alloc_one(mm, address) NULL |
||
59 | static inline void pmd_free(struct mm_struct *mm, pmd_t *pmd) |
||
60 | { |
||
61 | } |
||
62 | #define __pmd_free_tlb(tlb, x, a) do { } while (0) |
||
63 | |||
64 | #undef pmd_addr_end |
||
65 | #define pmd_addr_end(addr, end) (end) |
||
66 | |||
67 | #endif /* __ASSEMBLY__ */ |
||
68 | |||
69 | #endif /* _PGTABLE_NOPMD_H */><> |