提交 73159fdc 编写于 作者: A Andy Lutomirski 提交者: H. Peter Anvin

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: NAndy Lutomirski <luto@amacapital.net>
Link: http://lkml.kernel.org/r/e59a5f4362661f75dd4841fa74e1f2448045e245.1399317206.git.luto@amacapital.netSigned-off-by: NH. Peter Anvin <hpa@linux.intel.com>
上级 89ca3b88
...@@ -355,6 +355,12 @@ void __init early_ioremap_init(void) ...@@ -355,6 +355,12 @@ void __init early_ioremap_init(void)
{ {
pmd_t *pmd; pmd_t *pmd;
#ifdef CONFIG_X86_64
BUILD_BUG_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
#else
WARN_ON((fix_to_virt(0) + PAGE_SIZE) & ((1 << PMD_SHIFT) - 1));
#endif
early_ioremap_setup(); early_ioremap_setup();
pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN)); pmd = early_ioremap_pmd(fix_to_virt(FIX_BTMAP_BEGIN));
......
...@@ -449,9 +449,9 @@ void __init reserve_top_address(unsigned long reserve) ...@@ -449,9 +449,9 @@ void __init reserve_top_address(unsigned long reserve)
{ {
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
BUG_ON(fixmaps_set > 0); BUG_ON(fixmaps_set > 0);
printk(KERN_INFO "Reserving virtual address space above 0x%08x\n", __FIXADDR_TOP = round_down(-reserve, 1 << PMD_SHIFT) - PAGE_SIZE;
(int)-reserve); printk(KERN_INFO "Reserving virtual address space above 0x%08lx (rounded to 0x%08lx)\n",
__FIXADDR_TOP = -reserve - PAGE_SIZE; -reserve, __FIXADDR_TOP + PAGE_SIZE);
#endif #endif
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册