diff options
Diffstat (limited to 'include/asm-x86_64')
-rw-r--r-- | include/asm-x86_64/Kbuild | 1 | ||||
-rw-r--r-- | include/asm-x86_64/const.h | 20 | ||||
-rw-r--r-- | include/asm-x86_64/page.h | 28 | ||||
-rw-r--r-- | include/asm-x86_64/pgtable.h | 33 |
4 files changed, 52 insertions, 30 deletions
diff --git a/include/asm-x86_64/Kbuild b/include/asm-x86_64/Kbuild index ebd7117782a6..242296ede3dd 100644 --- a/include/asm-x86_64/Kbuild +++ b/include/asm-x86_64/Kbuild | |||
@@ -18,3 +18,4 @@ header-y += vsyscall32.h | |||
18 | unifdef-y += mce.h | 18 | unifdef-y += mce.h |
19 | unifdef-y += mtrr.h | 19 | unifdef-y += mtrr.h |
20 | unifdef-y += vsyscall.h | 20 | unifdef-y += vsyscall.h |
21 | unifdef-y += const.h | ||
diff --git a/include/asm-x86_64/const.h b/include/asm-x86_64/const.h new file mode 100644 index 000000000000..54fb08f3db9b --- /dev/null +++ b/include/asm-x86_64/const.h | |||
@@ -0,0 +1,20 @@ | |||
1 | /* const.h: Macros for dealing with constants. */ | ||
2 | |||
3 | #ifndef _X86_64_CONST_H | ||
4 | #define _X86_64_CONST_H | ||
5 | |||
6 | /* Some constant macros are used in both assembler and | ||
7 | * C code. Therefore we cannot annotate them always with | ||
8 | * 'UL' and other type specificers unilaterally. We | ||
9 | * use the following macros to deal with this. | ||
10 | */ | ||
11 | |||
12 | #ifdef __ASSEMBLY__ | ||
13 | #define _AC(X,Y) X | ||
14 | #else | ||
15 | #define __AC(X,Y) (X##Y) | ||
16 | #define _AC(X,Y) __AC(X,Y) | ||
17 | #endif | ||
18 | |||
19 | |||
20 | #endif /* !(_X86_64_CONST_H) */ | ||
diff --git a/include/asm-x86_64/page.h b/include/asm-x86_64/page.h index 10f346165cab..d554b94485df 100644 --- a/include/asm-x86_64/page.h +++ b/include/asm-x86_64/page.h | |||
@@ -1,14 +1,11 @@ | |||
1 | #ifndef _X86_64_PAGE_H | 1 | #ifndef _X86_64_PAGE_H |
2 | #define _X86_64_PAGE_H | 2 | #define _X86_64_PAGE_H |
3 | 3 | ||
4 | #include <asm/const.h> | ||
4 | 5 | ||
5 | /* PAGE_SHIFT determines the page size */ | 6 | /* PAGE_SHIFT determines the page size */ |
6 | #define PAGE_SHIFT 12 | 7 | #define PAGE_SHIFT 12 |
7 | #ifdef __ASSEMBLY__ | 8 | #define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT) |
8 | #define PAGE_SIZE (0x1 << PAGE_SHIFT) | ||
9 | #else | ||
10 | #define PAGE_SIZE (1UL << PAGE_SHIFT) | ||
11 | #endif | ||
12 | #define PAGE_MASK (~(PAGE_SIZE-1)) | 9 | #define PAGE_MASK (~(PAGE_SIZE-1)) |
13 | #define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & __PHYSICAL_MASK) | 10 | #define PHYSICAL_PAGE_MASK (~(PAGE_SIZE-1) & __PHYSICAL_MASK) |
14 | 11 | ||
@@ -33,10 +30,10 @@ | |||
33 | #define N_EXCEPTION_STACKS 5 /* hw limit: 7 */ | 30 | #define N_EXCEPTION_STACKS 5 /* hw limit: 7 */ |
34 | 31 | ||
35 | #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) | 32 | #define LARGE_PAGE_MASK (~(LARGE_PAGE_SIZE-1)) |
36 | #define LARGE_PAGE_SIZE (1UL << PMD_SHIFT) | 33 | #define LARGE_PAGE_SIZE (_AC(1,UL) << PMD_SHIFT) |
37 | 34 | ||
38 | #define HPAGE_SHIFT PMD_SHIFT | 35 | #define HPAGE_SHIFT PMD_SHIFT |
39 | #define HPAGE_SIZE ((1UL) << HPAGE_SHIFT) | 36 | #define HPAGE_SIZE (_AC(1,UL) << HPAGE_SHIFT) |
40 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) | 37 | #define HPAGE_MASK (~(HPAGE_SIZE - 1)) |
41 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) | 38 | #define HUGETLB_PAGE_ORDER (HPAGE_SHIFT - PAGE_SHIFT) |
42 | 39 | ||
@@ -76,29 +73,24 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
76 | #define __pgd(x) ((pgd_t) { (x) } ) | 73 | #define __pgd(x) ((pgd_t) { (x) } ) |
77 | #define __pgprot(x) ((pgprot_t) { (x) } ) | 74 | #define __pgprot(x) ((pgprot_t) { (x) } ) |
78 | 75 | ||
79 | #define __PHYSICAL_START ((unsigned long)CONFIG_PHYSICAL_START) | 76 | #endif /* !__ASSEMBLY__ */ |
80 | #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) | ||
81 | #define __START_KERNEL_map 0xffffffff80000000UL | ||
82 | #define __PAGE_OFFSET 0xffff810000000000UL | ||
83 | 77 | ||
84 | #else | ||
85 | #define __PHYSICAL_START CONFIG_PHYSICAL_START | 78 | #define __PHYSICAL_START CONFIG_PHYSICAL_START |
86 | #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) | 79 | #define __START_KERNEL (__START_KERNEL_map + __PHYSICAL_START) |
87 | #define __START_KERNEL_map 0xffffffff80000000 | 80 | #define __START_KERNEL_map 0xffffffff80000000 |
88 | #define __PAGE_OFFSET 0xffff810000000000 | 81 | #define __PAGE_OFFSET 0xffff810000000000 |
89 | #endif /* !__ASSEMBLY__ */ | ||
90 | 82 | ||
91 | /* to align the pointer to the (next) page boundary */ | 83 | /* to align the pointer to the (next) page boundary */ |
92 | #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) | 84 | #define PAGE_ALIGN(addr) (((addr)+PAGE_SIZE-1)&PAGE_MASK) |
93 | 85 | ||
94 | /* See Documentation/x86_64/mm.txt for a description of the memory map. */ | 86 | /* See Documentation/x86_64/mm.txt for a description of the memory map. */ |
95 | #define __PHYSICAL_MASK_SHIFT 46 | 87 | #define __PHYSICAL_MASK_SHIFT 46 |
96 | #define __PHYSICAL_MASK ((1UL << __PHYSICAL_MASK_SHIFT) - 1) | 88 | #define __PHYSICAL_MASK ((_AC(1,UL) << __PHYSICAL_MASK_SHIFT) - 1) |
97 | #define __VIRTUAL_MASK_SHIFT 48 | 89 | #define __VIRTUAL_MASK_SHIFT 48 |
98 | #define __VIRTUAL_MASK ((1UL << __VIRTUAL_MASK_SHIFT) - 1) | 90 | #define __VIRTUAL_MASK ((_AC(1,UL) << __VIRTUAL_MASK_SHIFT) - 1) |
99 | 91 | ||
100 | #define KERNEL_TEXT_SIZE (40UL*1024*1024) | 92 | #define KERNEL_TEXT_SIZE (40*1024*1024) |
101 | #define KERNEL_TEXT_START 0xffffffff80000000UL | 93 | #define KERNEL_TEXT_START 0xffffffff80000000 |
102 | 94 | ||
103 | #ifndef __ASSEMBLY__ | 95 | #ifndef __ASSEMBLY__ |
104 | 96 | ||
@@ -106,7 +98,7 @@ typedef struct { unsigned long pgprot; } pgprot_t; | |||
106 | 98 | ||
107 | #endif /* __ASSEMBLY__ */ | 99 | #endif /* __ASSEMBLY__ */ |
108 | 100 | ||
109 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) | 101 | #define PAGE_OFFSET __PAGE_OFFSET |
110 | 102 | ||
111 | /* Note: __pa(&symbol_visible_to_c) should be always replaced with __pa_symbol. | 103 | /* Note: __pa(&symbol_visible_to_c) should be always replaced with __pa_symbol. |
112 | Otherwise you risk miscompilation. */ | 104 | Otherwise you risk miscompilation. */ |
diff --git a/include/asm-x86_64/pgtable.h b/include/asm-x86_64/pgtable.h index 5957361782fe..c514deb658a3 100644 --- a/include/asm-x86_64/pgtable.h +++ b/include/asm-x86_64/pgtable.h | |||
@@ -1,6 +1,9 @@ | |||
1 | #ifndef _X86_64_PGTABLE_H | 1 | #ifndef _X86_64_PGTABLE_H |
2 | #define _X86_64_PGTABLE_H | 2 | #define _X86_64_PGTABLE_H |
3 | 3 | ||
4 | #include <asm/const.h> | ||
5 | #ifndef __ASSEMBLY__ | ||
6 | |||
4 | /* | 7 | /* |
5 | * This file contains the functions and defines necessary to modify and use | 8 | * This file contains the functions and defines necessary to modify and use |
6 | * the x86-64 page table tree. | 9 | * the x86-64 page table tree. |
@@ -30,6 +33,8 @@ extern void clear_kernel_mapping(unsigned long addr, unsigned long size); | |||
30 | extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; | 33 | extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; |
31 | #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) | 34 | #define ZERO_PAGE(vaddr) (virt_to_page(empty_zero_page)) |
32 | 35 | ||
36 | #endif /* !__ASSEMBLY__ */ | ||
37 | |||
33 | /* | 38 | /* |
34 | * PGDIR_SHIFT determines what a top-level page table entry can map | 39 | * PGDIR_SHIFT determines what a top-level page table entry can map |
35 | */ | 40 | */ |
@@ -54,6 +59,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; | |||
54 | */ | 59 | */ |
55 | #define PTRS_PER_PTE 512 | 60 | #define PTRS_PER_PTE 512 |
56 | 61 | ||
62 | #ifndef __ASSEMBLY__ | ||
63 | |||
57 | #define pte_ERROR(e) \ | 64 | #define pte_ERROR(e) \ |
58 | printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), pte_val(e)) | 65 | printk("%s:%d: bad pte %p(%016lx).\n", __FILE__, __LINE__, &(e), pte_val(e)) |
59 | #define pmd_ERROR(e) \ | 66 | #define pmd_ERROR(e) \ |
@@ -117,22 +124,23 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
117 | 124 | ||
118 | #define pte_pgprot(a) (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK)) | 125 | #define pte_pgprot(a) (__pgprot((a).pte & ~PHYSICAL_PAGE_MASK)) |
119 | 126 | ||
120 | #define PMD_SIZE (1UL << PMD_SHIFT) | 127 | #endif /* !__ASSEMBLY__ */ |
128 | |||
129 | #define PMD_SIZE (_AC(1,UL) << PMD_SHIFT) | ||
121 | #define PMD_MASK (~(PMD_SIZE-1)) | 130 | #define PMD_MASK (~(PMD_SIZE-1)) |
122 | #define PUD_SIZE (1UL << PUD_SHIFT) | 131 | #define PUD_SIZE (_AC(1,UL) << PUD_SHIFT) |
123 | #define PUD_MASK (~(PUD_SIZE-1)) | 132 | #define PUD_MASK (~(PUD_SIZE-1)) |
124 | #define PGDIR_SIZE (1UL << PGDIR_SHIFT) | 133 | #define PGDIR_SIZE (_AC(1,UL) << PGDIR_SHIFT) |
125 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) | 134 | #define PGDIR_MASK (~(PGDIR_SIZE-1)) |
126 | 135 | ||
127 | #define USER_PTRS_PER_PGD ((TASK_SIZE-1)/PGDIR_SIZE+1) | 136 | #define USER_PTRS_PER_PGD ((TASK_SIZE-1)/PGDIR_SIZE+1) |
128 | #define FIRST_USER_ADDRESS 0 | 137 | #define FIRST_USER_ADDRESS 0 |
129 | 138 | ||
130 | #ifndef __ASSEMBLY__ | 139 | #define MAXMEM 0x3fffffffffff |
131 | #define MAXMEM 0x3fffffffffffUL | 140 | #define VMALLOC_START 0xffffc20000000000 |
132 | #define VMALLOC_START 0xffffc20000000000UL | 141 | #define VMALLOC_END 0xffffe1ffffffffff |
133 | #define VMALLOC_END 0xffffe1ffffffffffUL | 142 | #define MODULES_VADDR 0xffffffff88000000 |
134 | #define MODULES_VADDR 0xffffffff88000000UL | 143 | #define MODULES_END 0xfffffffffff00000 |
135 | #define MODULES_END 0xfffffffffff00000UL | ||
136 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) | 144 | #define MODULES_LEN (MODULES_END - MODULES_VADDR) |
137 | 145 | ||
138 | #define _PAGE_BIT_PRESENT 0 | 146 | #define _PAGE_BIT_PRESENT 0 |
@@ -158,7 +166,7 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
158 | #define _PAGE_GLOBAL 0x100 /* Global TLB entry */ | 166 | #define _PAGE_GLOBAL 0x100 /* Global TLB entry */ |
159 | 167 | ||
160 | #define _PAGE_PROTNONE 0x080 /* If not present */ | 168 | #define _PAGE_PROTNONE 0x080 /* If not present */ |
161 | #define _PAGE_NX (1UL<<_PAGE_BIT_NX) | 169 | #define _PAGE_NX (_AC(1,UL)<<_PAGE_BIT_NX) |
162 | 170 | ||
163 | #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) | 171 | #define _PAGE_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_USER | _PAGE_ACCESSED | _PAGE_DIRTY) |
164 | #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) | 172 | #define _KERNPG_TABLE (_PAGE_PRESENT | _PAGE_RW | _PAGE_ACCESSED | _PAGE_DIRTY) |
@@ -220,6 +228,8 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm, unsigned long | |||
220 | #define __S110 PAGE_SHARED_EXEC | 228 | #define __S110 PAGE_SHARED_EXEC |
221 | #define __S111 PAGE_SHARED_EXEC | 229 | #define __S111 PAGE_SHARED_EXEC |
222 | 230 | ||
231 | #ifndef __ASSEMBLY__ | ||
232 | |||
223 | static inline unsigned long pgd_bad(pgd_t pgd) | 233 | static inline unsigned long pgd_bad(pgd_t pgd) |
224 | { | 234 | { |
225 | return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); | 235 | return pgd_val(pgd) & ~(PTE_MASK | _KERNPG_TABLE | _PAGE_USER); |
@@ -405,8 +415,6 @@ extern spinlock_t pgd_lock; | |||
405 | extern struct page *pgd_list; | 415 | extern struct page *pgd_list; |
406 | void vmalloc_sync_all(void); | 416 | void vmalloc_sync_all(void); |
407 | 417 | ||
408 | #endif /* !__ASSEMBLY__ */ | ||
409 | |||
410 | extern int kern_addr_valid(unsigned long addr); | 418 | extern int kern_addr_valid(unsigned long addr); |
411 | 419 | ||
412 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ | 420 | #define io_remap_pfn_range(vma, vaddr, pfn, size, prot) \ |
@@ -436,5 +444,6 @@ extern int kern_addr_valid(unsigned long addr); | |||
436 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT | 444 | #define __HAVE_ARCH_PTEP_SET_WRPROTECT |
437 | #define __HAVE_ARCH_PTE_SAME | 445 | #define __HAVE_ARCH_PTE_SAME |
438 | #include <asm-generic/pgtable.h> | 446 | #include <asm-generic/pgtable.h> |
447 | #endif /* !__ASSEMBLY__ */ | ||
439 | 448 | ||
440 | #endif /* _X86_64_PGTABLE_H */ | 449 | #endif /* _X86_64_PGTABLE_H */ |