diff options
author | Andy Lutomirski <luto@amacapital.net> | 2014-05-05 15:19:31 -0400 |
---|---|---|
committer | H. Peter Anvin <hpa@linux.intel.com> | 2014-05-05 16:18:25 -0400 |
commit | 73159fdcdb9be3eda61b846864352c29371baeb6 (patch) | |
tree | 9856e06e22e942873f47691e198e7d8531f7db21 /arch/x86/mm | |
parent | 89ca3b881987f5a4be4c5dbaa7f0df12bbdde2fd (diff) |
x86, mm: Ensure correct alignment of the fixmap
The early_ioremap code requires that its buffers not span a PMD
boundary. The logic for ensuring that only works if the fixmap is
aligned, so assert that it's aligned correctly.
To make this work reliably, reserve_top_address needs to be
adjusted.
Signed-off-by: Andy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/e59a5f4362661f75dd4841fa74e1f2448045e245.1399317206.git.luto@amacapital.net
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>
Diffstat (limited to 'arch/x86/mm')
-rw-r--r-- | arch/x86/mm/ioremap.c | 6 | ||||
-rw-r--r-- | arch/x86/mm/pgtable.c | 6 |
2 files changed, 9 insertions, 3 deletions
diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c index 597ac155c91c..6ef98c55a899 100644 --- a/arch/x86/mm/ioremap.c +++ b/arch/x86/mm/ioremap.c | |||
@@ -355,6 +355,12 @@ void __init early_ioremap_init(void) | |||
355 | { | 355 | { |
356 | pmd_t *pmd; | 356 | pmd_t *pmd; |
357 | 357 | ||
358 | #ifdef CONFIG_X86_64 | ||
359 | BUILD_BUG_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1)); | ||
360 | #else | ||
361 | WARN_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1)); | ||
362 | #endif | ||
363 | |||
358 | early_ioremap_setup(); | 364 | early_ioremap_setup(); |
359 | 365 | ||
360 | pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)); | 366 | pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)); |
diff --git a/arch/x86/mm/pgtable.c b/arch/x86/mm/pgtable.c index c96314abd144..5f8bdda1d1ba 100644 --- a/arch/x86/mm/pgtable.c +++ b/arch/x86/mm/pgtable.c | |||
@@ -449,9 +449,9 @@ void __init reserve_top_address(unsigned long reserve) | |||
449 | { | 449 | { |
450 | #ifdef CONFIG_X86_32 | 450 | #ifdef CONFIG_X86_32 |
451 | BUG_ON(fixmaps_set > 0); | 451 | BUG_ON(fixmaps_set > 0); |
452 | printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", | 452 | __FIXADDR_TOP = round_down(-reserve, 1 << PMD_SHIFT) - PAGE_SIZE; |
453 | (int)-reserve); | 453 | printk(KERN_INFO "Reserving virtual address space above 0x%08lx (rounded to 0x%08lx)\n", |
454 | __FIXADDR_TOP = -reserve - PAGE_SIZE; | 454 | -reserve, __FIXADDR_TOP + PAGE_SIZE); |
455 | #endif | 455 | #endif |
456 | } | 456 | } |
457 | 457 | ||