diff options
author | Andi Kleen <andi@firstfloor.org> | 2008-03-11 22:53:27 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-04-17 11:41:30 -0400 |
commit | 7d1116a92d709c22e7db910724c9fcd2001b0499 (patch) | |
tree | 364fe750182fd5b8e53f14c64aed490388f6c5e6 | |
parent | 41bd4eac748f39d7f3ed770fae3e595a747172bd (diff) |
x86: implement true end_pfn_mapped for 32bit
Even on 32bit 2MB pages can map more memory than is in the true
max_low_pfn if end_pfn is not highmem and not aligned to 2MB.
Add a end_pfn_map similar to x86-64 that accounts for this
fact. This is important for code that really needs to know about
all mapping aliases.
Signed-off-by: Andi Kleen <ak@suse.de>
Cc: andreas.herrmann3@amd.com
Cc: mingo@elte.hu
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
-rw-r--r-- | arch/x86/mm/init_32.c | 4 | ||||
-rw-r--r-- | include/asm-x86/page.h | 4 | ||||
-rw-r--r-- | include/asm-x86/page_64.h | 1 |
3 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 00168e65688a..73dd0601166a 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
@@ -51,6 +51,8 @@ | |||
51 | 51 | ||
52 | unsigned int __VMALLOC_RESERVE = 128 << 20; | 52 | unsigned int __VMALLOC_RESERVE = 128 << 20; |
53 | 53 | ||
54 | unsigned long end_pfn_map; | ||
55 | |||
54 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | 56 | DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); |
55 | unsigned long highstart_pfn, highend_pfn; | 57 | unsigned long highstart_pfn, highend_pfn; |
56 | 58 | ||
@@ -194,6 +196,7 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
194 | set_pmd(pmd, pfn_pmd(pfn, prot)); | 196 | set_pmd(pmd, pfn_pmd(pfn, prot)); |
195 | 197 | ||
196 | pfn += PTRS_PER_PTE; | 198 | pfn += PTRS_PER_PTE; |
199 | end_pfn_map = pfn; | ||
197 | continue; | 200 | continue; |
198 | } | 201 | } |
199 | pte = one_page_table_init(pmd); | 202 | pte = one_page_table_init(pmd); |
@@ -208,6 +211,7 @@ static void __init kernel_physical_mapping_init(pgd_t *pgd_base) | |||
208 | 211 | ||
209 | set_pte(pte, pfn_pte(pfn, prot)); | 212 | set_pte(pte, pfn_pte(pfn, prot)); |
210 | } | 213 | } |
214 | end_pfn_map = pfn; | ||
211 | } | 215 | } |
212 | } | 216 | } |
213 | } | 217 | } |
diff --git a/include/asm-x86/page.h b/include/asm-x86/page.h index a05b2896492f..b734939916c4 100644 --- a/include/asm-x86/page.h +++ b/include/asm-x86/page.h | |||
@@ -36,7 +36,7 @@ | |||
36 | #define max_pfn_mapped end_pfn_map | 36 | #define max_pfn_mapped end_pfn_map |
37 | #else | 37 | #else |
38 | #include <asm/page_32.h> | 38 | #include <asm/page_32.h> |
39 | #define max_pfn_mapped max_low_pfn | 39 | #define max_pfn_mapped end_pfn_map |
40 | #endif /* CONFIG_X86_64 */ | 40 | #endif /* CONFIG_X86_64 */ |
41 | 41 | ||
42 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) | 42 | #define PAGE_OFFSET ((unsigned long)__PAGE_OFFSET) |
@@ -50,6 +50,8 @@ | |||
50 | 50 | ||
51 | extern int page_is_ram(unsigned long pagenr); | 51 | extern int page_is_ram(unsigned long pagenr); |
52 | 52 | ||
53 | extern unsigned long end_pfn_map; | ||
54 | |||
53 | struct page; | 55 | struct page; |
54 | 56 | ||
55 | static inline void clear_user_page(void *page, unsigned long vaddr, | 57 | static inline void clear_user_page(void *page, unsigned long vaddr, |
diff --git a/include/asm-x86/page_64.h b/include/asm-x86/page_64.h index f156778f707c..54d5db634858 100644 --- a/include/asm-x86/page_64.h +++ b/include/asm-x86/page_64.h | |||
@@ -59,7 +59,6 @@ void clear_page(void *page); | |||
59 | void copy_page(void *to, void *from); | 59 | void copy_page(void *to, void *from); |
60 | 60 | ||
61 | extern unsigned long end_pfn; | 61 | extern unsigned long end_pfn; |
62 | extern unsigned long end_pfn_map; | ||
63 | extern unsigned long phys_base; | 62 | extern unsigned long phys_base; |
64 | 63 | ||
65 | extern unsigned long __phys_addr(unsigned long); | 64 | extern unsigned long __phys_addr(unsigned long); |