Skip to content

Commit 73159fd

Browse files
amlutoH. Peter Anvin
authored andcommitted
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>
1 parent 89ca3b8 commit 73159fd

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

arch/x86/mm/ioremap.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,12 @@ void __init early_ioremap_init(void)
355355
{
356356
pmd_t *pmd;
357357

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+
358364
early_ioremap_setup();
359365

360366
pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));

arch/x86/mm/pgtable.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -449,9 +449,9 @@ void __init reserve_top_address(unsigned long reserve)
449449
{
450450
#ifdef CONFIG_X86_32
451451
BUG_ON(fixmaps_set > 0);
452-
printk(KERN_INFO "Reserving virtual address space above 0x%08x\n",
453-
(int)-reserve);
454-
__FIXADDR_TOP = -reserve - PAGE_SIZE;
452+
__FIXADDR_TOP = round_down(-reserve, 1 << PMD_SHIFT) - PAGE_SIZE;
453+
printk(KERN_INFO "Reserving virtual address space above 0x%08lx (rounded to 0x%08lx)\n",
454+
-reserve, __FIXADDR_TOP + PAGE_SIZE);
455455
#endif
456456
}
457457

0 commit comments

Comments
 (0)