aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/mm
diff options
context:
space:
mode:
authorAndy Lutomirski <luto@amacapital.net>2014-05-05 15:19:31 -0400
committerH. Peter Anvin <hpa@linux.intel.com>2014-05-05 16:18:25 -0400
commit73159fdcdb9be3eda61b846864352c29371baeb6 (patch)
tree9856e06e22e942873f47691e198e7d8531f7db21 /arch/x86/mm
parent89ca3b881987f5a4be4c5dbaa7f0df12bbdde2fd (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.c6
-rw-r--r--arch/x86/mm/pgtable.c6
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