diff options
author | Vivek Goyal <vgoyal@in.ibm.com> | 2007-05-02 13:27:06 -0400 |
---|---|---|
committer | Andi Kleen <andi@basil.nowhere.org> | 2007-05-02 13:27:06 -0400 |
commit | 9d291e787b2b71d1b57e5fbb24ba9c70e748ed84 (patch) | |
tree | 9cbc475b8e6c096dfd75fe1c393dcbf657405f81 /include/asm-x86_64/pgtable.h | |
parent | e65845045588806fa5c8df8a4f4253516515a5e3 (diff) |
[PATCH] x86-64: Assembly safe page.h and pgtable.h
This patch makes pgtable.h and page.h safe to include
in assembly files like head.S. Allowing us to use
symbolic constants instead of hard coded numbers when
refering to the page tables.
This patch copies asm-sparc64/const.h to asm-x86_64 to
get a definition of _AC() a very convinient macro that
allows us to force the type when we are compiling the
code in C and to drop all of the type information when
we are using the constant in assembly. Previously this
was done with multiple definition of the same constant.
const.h was modified slightly so that it works when given
CONFIG options as arguments.
This patch adds #ifndef __ASSEMBLY__ ... #endif
and _AC(1,UL) where appropriate so the assembler won't
choke on the header files. Otherwise nothing
should have changed.
AK: added const.h to exported headers to fix headers_check
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Vivek Goyal <vgoyal@in.ibm.com>
Signed-off-by: Andi Kleen <ak@suse.de>
Diffstat (limited to 'include/asm-x86_64/pgtable.h')
-rw-r--r-- | include/asm-x86_64/pgtable.h | 33 |
1 files changed, 21 insertions, 12 deletions
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 */ |