Gitweb:     
http://git.kernel.org/git/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=950f9d95bed1a366434d3597ea75f5b9d772d74f
Commit:     950f9d95bed1a366434d3597ea75f5b9d772d74f
Parent:     5f5192b9feeff6a96c97c143c3ca558fdbe2dc8e
Author:     Thomas Gleixner <[EMAIL PROTECTED]>
AuthorDate: Wed Jan 30 13:34:06 2008 +0100
Committer:  Ingo Molnar <[EMAIL PROTECTED]>
CommitDate: Wed Jan 30 13:34:06 2008 +0100

    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 <[EMAIL PROTECTED]>
    Signed-off-by: Ingo Molnar <[EMAIL PROTECTED]>
---
 arch/x86/mm/ioremap.c  |   15 ++++++++++-----
 arch/x86/mm/pageattr.c |    7 +------
 include/asm-x86/e820.h |    3 +++
 3 files changed, 14 insertions(+), 11 deletions(-)

diff --git a/arch/x86/mm/ioremap.c b/arch/x86/mm/ioremap.c
index d3026e1..24e42ca 100644
--- a/arch/x86/mm/ioremap.c
+++ b/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;
        }
diff --git a/arch/x86/mm/pageattr.c b/arch/x86/mm/pageattr.c
index 19f7f7a..fcd9612 100644
--- a/arch/x86/mm/pageattr.c
+++ b/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)
 {
diff --git a/include/asm-x86/e820.h b/include/asm-x86/e820.h
index f96f185..7004251 100644
--- a/include/asm-x86/e820.h
+++ b/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"
-
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to