aboutsummaryrefslogtreecommitdiffstats
path: root/include/asm-x86_64
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-x86_64')
-rw-r--r--include/asm-x86_64/Kbuild1
-rw-r--r--include/asm-x86_64/const.h20
-rw-r--r--include/asm-x86_64/page.h28
-rw-r--r--include/asm-x86_64/pgtable.h33
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
18unifdef-y += mce.h 18unifdef-y += mce.h
19unifdef-y += mtrr.h 19unifdef-y += mtrr.h
20unifdef-y += vsyscall.h 20unifdef-y += vsyscall.h
21unifdef-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);
30extern unsigned long empty_zero_page[PAGE_SIZE/sizeof(unsigned long)]; 33extern 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
223static inline unsigned long pgd_bad(pgd_t pgd) 233static 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;
405extern struct page *pgd_list; 415extern struct page *pgd_list;
406void vmalloc_sync_all(void); 416void vmalloc_sync_all(void);
407 417
408#endif /* !__ASSEMBLY__ */
409
410extern int kern_addr_valid(unsigned long addr); 418extern 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 */