| .. | .. |
|---|
| 42 | 42 | |
|---|
| 43 | 43 | /* NOTE: even on 64 bits, these entries are __u32 because we allocate |
|---|
| 44 | 44 | * the pmd and pgd in ZONE_DMA (i.e. under 4GB) */ |
|---|
| 45 | | -typedef struct { __u32 pmd; } pmd_t; |
|---|
| 46 | 45 | typedef struct { __u32 pgd; } pgd_t; |
|---|
| 47 | 46 | typedef struct { unsigned long pgprot; } pgprot_t; |
|---|
| 48 | 47 | |
|---|
| 49 | | -#define pte_val(x) ((x).pte) |
|---|
| 50 | | -/* These do not work lvalues, so make sure we don't use them as such. */ |
|---|
| 48 | +#if CONFIG_PGTABLE_LEVELS == 3 |
|---|
| 49 | +typedef struct { __u32 pmd; } pmd_t; |
|---|
| 50 | +#define __pmd(x) ((pmd_t) { (x) } ) |
|---|
| 51 | +/* pXd_val() do not work as lvalues, so make sure we don't use them as such. */ |
|---|
| 51 | 52 | #define pmd_val(x) ((x).pmd + 0) |
|---|
| 53 | +#endif |
|---|
| 54 | + |
|---|
| 55 | +#define pte_val(x) ((x).pte) |
|---|
| 52 | 56 | #define pgd_val(x) ((x).pgd + 0) |
|---|
| 53 | 57 | #define pgprot_val(x) ((x).pgprot) |
|---|
| 54 | 58 | |
|---|
| 55 | 59 | #define __pte(x) ((pte_t) { (x) } ) |
|---|
| 56 | | -#define __pmd(x) ((pmd_t) { (x) } ) |
|---|
| 57 | 60 | #define __pgd(x) ((pgd_t) { (x) } ) |
|---|
| 58 | 61 | #define __pgprot(x) ((pgprot_t) { (x) } ) |
|---|
| 59 | | - |
|---|
| 60 | | -#define __pmd_val_set(x,n) (x).pmd = (n) |
|---|
| 61 | | -#define __pgd_val_set(x,n) (x).pgd = (n) |
|---|
| 62 | 62 | |
|---|
| 63 | 63 | #else |
|---|
| 64 | 64 | /* |
|---|
| 65 | 65 | * .. while these make it easier on the compiler |
|---|
| 66 | 66 | */ |
|---|
| 67 | 67 | typedef unsigned long pte_t; |
|---|
| 68 | + |
|---|
| 69 | +#if CONFIG_PGTABLE_LEVELS == 3 |
|---|
| 68 | 70 | typedef __u32 pmd_t; |
|---|
| 71 | +#define pmd_val(x) (x) |
|---|
| 72 | +#define __pmd(x) (x) |
|---|
| 73 | +#endif |
|---|
| 74 | + |
|---|
| 69 | 75 | typedef __u32 pgd_t; |
|---|
| 70 | 76 | typedef unsigned long pgprot_t; |
|---|
| 71 | 77 | |
|---|
| 72 | 78 | #define pte_val(x) (x) |
|---|
| 73 | | -#define pmd_val(x) (x) |
|---|
| 74 | 79 | #define pgd_val(x) (x) |
|---|
| 75 | 80 | #define pgprot_val(x) (x) |
|---|
| 76 | 81 | |
|---|
| 77 | 82 | #define __pte(x) (x) |
|---|
| 78 | | -#define __pmd(x) (x) |
|---|
| 79 | 83 | #define __pgd(x) (x) |
|---|
| 80 | 84 | #define __pgprot(x) (x) |
|---|
| 81 | 85 | |
|---|
| 82 | | -#define __pmd_val_set(x,n) (x) = (n) |
|---|
| 83 | | -#define __pgd_val_set(x,n) (x) = (n) |
|---|
| 84 | | - |
|---|
| 85 | 86 | #endif /* STRICT_MM_TYPECHECKS */ |
|---|
| 87 | + |
|---|
| 88 | +#define set_pmd(pmdptr, pmdval) (*(pmdptr) = (pmdval)) |
|---|
| 89 | +#if CONFIG_PGTABLE_LEVELS == 3 |
|---|
| 90 | +#define set_pud(pudptr, pudval) (*(pudptr) = (pudval)) |
|---|
| 91 | +#endif |
|---|
| 86 | 92 | |
|---|
| 87 | 93 | typedef struct page *pgtable_t; |
|---|
| 88 | 94 | |
|---|
| .. | .. |
|---|
| 106 | 112 | #else |
|---|
| 107 | 113 | #define BITS_PER_PTE_ENTRY 2 |
|---|
| 108 | 114 | #define BITS_PER_PMD_ENTRY 2 |
|---|
| 109 | | -#define BITS_PER_PGD_ENTRY BITS_PER_PMD_ENTRY |
|---|
| 115 | +#define BITS_PER_PGD_ENTRY 2 |
|---|
| 110 | 116 | #endif |
|---|
| 111 | 117 | #define PGD_ENTRY_SIZE (1UL << BITS_PER_PGD_ENTRY) |
|---|
| 112 | 118 | #define PMD_ENTRY_SIZE (1UL << BITS_PER_PMD_ENTRY) |
|---|
| .. | .. |
|---|
| 117 | 123 | /* This governs the relationship between virtual and physical addresses. |
|---|
| 118 | 124 | * If you alter it, make sure to take care of our various fixed mapping |
|---|
| 119 | 125 | * segments in fixmap.h */ |
|---|
| 120 | | -#if defined(BOOTLOADER) |
|---|
| 121 | | -#define __PAGE_OFFSET (0) /* bootloader uses physical addresses */ |
|---|
| 122 | | -#else |
|---|
| 123 | 126 | #ifdef CONFIG_64BIT |
|---|
| 124 | | -#define __PAGE_OFFSET (0x40000000) /* 1GB */ |
|---|
| 127 | +#define __PAGE_OFFSET_DEFAULT (0x40000000) /* 1GB */ |
|---|
| 125 | 128 | #else |
|---|
| 126 | | -#define __PAGE_OFFSET (0x10000000) /* 256MB */ |
|---|
| 129 | +#define __PAGE_OFFSET_DEFAULT (0x10000000) /* 256MB */ |
|---|
| 127 | 130 | #endif |
|---|
| 131 | + |
|---|
| 132 | +#if defined(BOOTLOADER) |
|---|
| 133 | +#define __PAGE_OFFSET (0) /* bootloader uses physical addresses */ |
|---|
| 134 | +#else |
|---|
| 135 | +#define __PAGE_OFFSET __PAGE_OFFSET_DEFAULT |
|---|
| 128 | 136 | #endif /* BOOTLOADER */ |
|---|
| 129 | 137 | |
|---|
| 130 | 138 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) |
|---|
| .. | .. |
|---|
| 171 | 179 | |
|---|
| 172 | 180 | #define page_to_phys(page) (page_to_pfn(page) << PAGE_SHIFT) |
|---|
| 173 | 181 | #define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) |
|---|
| 174 | | - |
|---|
| 175 | | -#define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ |
|---|
| 176 | | - VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) |
|---|
| 177 | 182 | |
|---|
| 178 | 183 | #include <asm-generic/memory_model.h> |
|---|
| 179 | 184 | #include <asm-generic/getorder.h> |
|---|