WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [linux-2.6.18-xen] Fix amd64-agp aperture validation

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [linux-2.6.18-xen] Fix amd64-agp aperture validation
From: "Xen patchbot-linux-2.6.18-xen" <patchbot-linux-2.6.18-xen@xxxxxxxxxxxxxxxxxxx>
Date: Thu, 21 Jun 2007 16:41:56 -0700
Delivery-date: Thu, 21 Jun 2007 16:40:21 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User kfraser@xxxxxxxxxxxxxxxxxxxxx
# Date 1182429545 -3600
# Node ID c8c9bc0b7e29e804c09d4375a0e655cda826a9e4
# Parent  6d30a91a72c66127c6445b40c0510b2d6ee72e42
Fix amd64-agp aperture validation

Under Xen, pfn_valid() on a machine address makes no sense. But even
on native, under CONFIG_DISCONTIGMEM, assuming that a !pfn_valid()
implies all subsequent pfn-s are also invalid is wrong. Thus replace
this by explicitly checking against the E820 map.

Patch is in 2.6.22-rc4.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Acked-by: Mark Langsdorf <mark.langsdorf@xxxxxxx>
---
 arch/i386/kernel/setup-xen.c  |   29 +++++++++++++++++++++++++++++
 arch/i386/kernel/setup.c      |   22 ++++++++++++++++++++++
 arch/x86_64/kernel/e820-xen.c |   17 +++++++++++++----
 arch/x86_64/kernel/e820.c     |    3 ++-
 drivers/char/agp/amd64-agp.c  |   13 ++++---------
 include/asm-i386/e820.h       |    1 +
 6 files changed, 71 insertions(+), 14 deletions(-)

diff -r 6d30a91a72c6 -r c8c9bc0b7e29 arch/i386/kernel/setup-xen.c
--- a/arch/i386/kernel/setup-xen.c      Thu Jun 21 09:45:00 2007 +0100
+++ b/arch/i386/kernel/setup-xen.c      Thu Jun 21 13:39:05 2007 +0100
@@ -1028,6 +1028,35 @@ efi_memory_present_wrapper(unsigned long
        return 0;
 }
 
+/*
+ * This function checks if any part of the range <start,end> is mapped
+ * with type.
+ */
+int
+e820_any_mapped(u64 start, u64 end, unsigned type)
+{
+       int i;
+
+#ifndef CONFIG_XEN
+       for (i = 0; i < e820.nr_map; i++) {
+               const struct e820entry *ei = &e820.map[i];
+#else
+       if (!is_initial_xendomain())
+               return 0;
+       for (i = 0; i < machine_e820.nr_map; ++i) {
+               const struct e820entry *ei = &machine_e820.map[i];
+#endif
+
+               if (type && ei->type != type)
+                       continue;
+               if (ei->addr >= end || ei->addr + ei->size <= start)
+                       continue;
+               return 1;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(e820_any_mapped);
+
  /*
   * This function checks if the entire range <start,end> is mapped with type.
   *
diff -r 6d30a91a72c6 -r c8c9bc0b7e29 arch/i386/kernel/setup.c
--- a/arch/i386/kernel/setup.c  Thu Jun 21 09:45:00 2007 +0100
+++ b/arch/i386/kernel/setup.c  Thu Jun 21 13:39:05 2007 +0100
@@ -956,6 +956,28 @@ efi_memory_present_wrapper(unsigned long
        return 0;
 }
 
+/*
+ * This function checks if any part of the range <start,end> is mapped
+ * with type.
+ */
+int
+e820_any_mapped(u64 start, u64 end, unsigned type)
+{
+       int i;
+
+       for (i = 0; i < e820.nr_map; i++) {
+               const struct e820entry *ei = &e820.map[i];
+
+               if (type && ei->type != type)
+                       continue;
+               if (ei->addr >= end || ei->addr + ei->size <= start)
+                       continue;
+               return 1;
+       }
+       return 0;
+}
+EXPORT_SYMBOL_GPL(e820_any_mapped);
+
  /*
   * This function checks if the entire range <start,end> is mapped with type.
   *
diff -r 6d30a91a72c6 -r c8c9bc0b7e29 arch/x86_64/kernel/e820-xen.c
--- a/arch/x86_64/kernel/e820-xen.c     Thu Jun 21 09:45:00 2007 +0100
+++ b/arch/x86_64/kernel/e820-xen.c     Thu Jun 21 13:39:05 2007 +0100
@@ -97,17 +97,26 @@ static inline int bad_addr(unsigned long
        return 0;
 } 
 
-#ifndef CONFIG_XEN
 /*
  * This function checks if any part of the range <start,end> is mapped
  * with type.
  */
-int __meminit
-e820_any_mapped(unsigned long start, unsigned long end, unsigned type)
+int e820_any_mapped(unsigned long start, unsigned long end, unsigned type)
 { 
        int i;
+
+#ifndef CONFIG_XEN
        for (i = 0; i < e820.nr_map; i++) { 
                struct e820entry *ei = &e820.map[i]; 
+#else
+       extern struct e820map machine_e820;
+
+       if (!is_initial_xendomain())
+               return 0;
+       for (i = 0; i < machine_e820.nr_map; i++) {
+               const struct e820entry *ei = &machine_e820.map[i];
+#endif
+
                if (type && ei->type != type) 
                        continue;
                if (ei->addr >= end || ei->addr + ei->size <= start)
@@ -116,7 +125,7 @@ e820_any_mapped(unsigned long start, uns
        } 
        return 0;
 }
-#endif
+EXPORT_SYMBOL_GPL(e820_any_mapped);
 
 /*
  * This function checks if the entire range <start,end> is mapped with type.
diff -r 6d30a91a72c6 -r c8c9bc0b7e29 arch/x86_64/kernel/e820.c
--- a/arch/x86_64/kernel/e820.c Thu Jun 21 09:45:00 2007 +0100
+++ b/arch/x86_64/kernel/e820.c Thu Jun 21 13:39:05 2007 +0100
@@ -93,7 +93,7 @@ static inline int bad_addr(unsigned long
  * This function checks if any part of the range <start,end> is mapped
  * with type.
  */
-int __meminit
+int
 e820_any_mapped(unsigned long start, unsigned long end, unsigned type)
 { 
        int i;
@@ -107,6 +107,7 @@ e820_any_mapped(unsigned long start, uns
        } 
        return 0;
 }
+EXPORT_SYMBOL_GPL(e820_any_mapped);
 
 /*
  * This function checks if the entire range <start,end> is mapped with type.
diff -r 6d30a91a72c6 -r c8c9bc0b7e29 drivers/char/agp/amd64-agp.c
--- a/drivers/char/agp/amd64-agp.c      Thu Jun 21 09:45:00 2007 +0100
+++ b/drivers/char/agp/amd64-agp.c      Thu Jun 21 13:39:05 2007 +0100
@@ -15,6 +15,7 @@
 #include <linux/mmzone.h>
 #include <asm/page.h>          /* PAGE_SIZE */
 #include <asm/k8.h>
+#include <asm/e820.h>
 #include "agp.h"
 
 /* PTE bits. */
@@ -252,7 +253,6 @@ static struct agp_bridge_driver amd_8151
 /* Some basic sanity checks for the aperture. */
 static int __devinit aperture_valid(u64 aper, u32 size)
 {
-       u32 pfn, c;
        if (aper == 0) {
                printk(KERN_ERR PFX "No aperture\n");
                return 0;
@@ -265,14 +265,9 @@ static int __devinit aperture_valid(u64 
                printk(KERN_ERR PFX "Aperture out of bounds\n");
                return 0;
        }
-       pfn = aper >> PAGE_SHIFT;
-       for (c = 0; c < size/PAGE_SIZE; c++) {
-               if (!pfn_valid(pfn + c))
-                       break;
-               if (!PageReserved(pfn_to_page(pfn + c))) {
-                       printk(KERN_ERR PFX "Aperture pointing to RAM\n");
-                       return 0;
-               }
+       if (e820_any_mapped(aper, aper + size, E820_RAM)) {
+               printk(KERN_ERR PFX "Aperture pointing to RAM\n");
+               return 0;
        }
 
        /* Request the Aperture. This catches cases when someone else
diff -r 6d30a91a72c6 -r c8c9bc0b7e29 include/asm-i386/e820.h
--- a/include/asm-i386/e820.h   Thu Jun 21 09:45:00 2007 +0100
+++ b/include/asm-i386/e820.h   Thu Jun 21 13:39:05 2007 +0100
@@ -38,6 +38,7 @@ extern struct e820map e820;
 
 extern int e820_all_mapped(unsigned long start, unsigned long end,
                           unsigned type);
+extern int e820_any_mapped(u64 start, u64 end, unsigned type);
 
 #endif/*!__ASSEMBLY__*/
 

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [linux-2.6.18-xen] Fix amd64-agp aperture validation, Xen patchbot-linux-2.6.18-xen <=