浏览代码

x86: fix the missing BIOS area check in page_is_ram

page_is_ram has a FIXME since ages, which reminds to sanity check the
BIOS area between 640k and 1M, which is sometimes falsely reported as
RAM in the e820 tables.

Implement the sanity check. Move the BIOS range defines from
pageattr.c into e820.h to avoid duplicate defines.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Thomas Gleixner 17 年之前
父节点
当前提交
950f9d95be
共有 3 个文件被更改,包括 14 次插入11 次删除
  1. 10 5
      arch/x86/mm/ioremap.c
  2. 1 6
      arch/x86/mm/pageattr.c
  3. 3 0
      include/asm-x86/e820.h

+ 10 - 5
arch/x86/mm/ioremap.c

@@ -42,13 +42,18 @@ int page_is_ram(unsigned long pagenr)
 		 */
 		if (e820.map[i].type != E820_RAM)
 			continue;
-		/*
-		 *	!!!FIXME!!! Some BIOSen report areas as RAM that
-		 *	are not. Notably the 640->1Mb area. We need a sanity
-		 *	check here.
-		 */
 		addr = (e820.map[i].addr + PAGE_SIZE-1) >> PAGE_SHIFT;
 		end = (e820.map[i].addr + e820.map[i].size) >> PAGE_SHIFT;
+
+		/*
+		 * Sanity check: Some BIOSen report areas as RAM that
+		 * are not. Notably the 640->1Mb area, which is the
+		 * PCI BIOS area.
+		 */
+		if (addr >= (BIOS_BEGIN >> PAGE_SHIFT) &&
+		    end < (BIOS_END >> PAGE_SHIFT))
+			continue;
+
 		if ((pagenr >= addr) && (pagenr < end))
 			return 1;
 	}

+ 1 - 6
arch/x86/mm/pageattr.c

@@ -9,18 +9,13 @@
 #include <linux/slab.h>
 #include <linux/mm.h>
 
+#include <asm/e820.h>
 #include <asm/processor.h>
 #include <asm/tlbflush.h>
 #include <asm/sections.h>
 #include <asm/uaccess.h>
 #include <asm/pgalloc.h>
 
-/*
- * We must allow the BIOS range to be executable:
- */
-#define BIOS_BEGIN		0x000a0000
-#define BIOS_END		0x00100000
-
 static inline int
 within(unsigned long addr, unsigned long start, unsigned long end)
 {

+ 3 - 0
include/asm-x86/e820.h

@@ -25,6 +25,9 @@ struct e820map {
 #define ISA_START_ADDRESS	0xa0000
 #define ISA_END_ADDRESS		0x100000
 
+#define BIOS_BEGIN		0x000a0000
+#define BIOS_END		0x00100000
+
 #ifdef __KERNEL__
 #ifdef CONFIG_X86_32
 # include "e820_32.h"