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-devel

[Xen-devel] [PATCH] linux/x86: fix amd64-agp aperture validation

To: <xen-devel@xxxxxxxxxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] linux/x86: fix amd64-agp aperture validation
From: "Jan Beulich" <jbeulich@xxxxxxxxxx>
Date: Wed, 04 Apr 2007 16:49:38 +0100
Delivery-date: Wed, 04 Apr 2007 08:47:35 -0700
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-devel-request@lists.xensource.com?subject=help>
List-id: Xen developer discussion <xen-devel.lists.xensource.com>
List-post: <mailto:xen-devel@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-devel>, <mailto:xen-devel-request@lists.xensource.com?subject=unsubscribe>
Sender: xen-devel-bounces@xxxxxxxxxxxxxxxxxxx
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.

Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Acked-by: Mark Langsdorf <mark.langsdorf@xxxxxxx>

Index: sle10sp1-2007-03-28/arch/i386/kernel/setup-xen.c
===================================================================
--- sle10sp1-2007-03-28.orig/arch/i386/kernel/setup-xen.c       2007-04-04 
17:07:13.000000000 +0200
+++ sle10sp1-2007-03-28/arch/i386/kernel/setup-xen.c    2007-04-04 
16:45:36.000000000 +0200
@@ -1022,6 +1022,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.
   *
Index: sle10sp1-2007-03-28/arch/x86_64/kernel/e820-xen.c
===================================================================
--- sle10sp1-2007-03-28.orig/arch/x86_64/kernel/e820-xen.c      2007-04-04 
17:07:13.000000000 +0200
+++ sle10sp1-2007-03-28/arch/x86_64/kernel/e820-xen.c   2007-04-04 
17:07:28.000000000 +0200
@@ -97,17 +97,27 @@ 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
+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 +126,7 @@ int __meminit e820_any_mapped(unsigned l
        } 
        return 0;
 }
-#endif
+EXPORT_SYMBOL_GPL(e820_any_mapped);
 
 /*
  * This function checks if the entire range <start,end> is mapped with type.
Index: sle10sp1-2007-03-28/drivers/char/agp/amd64-agp.c
===================================================================
--- sle10sp1-2007-03-28.orig/drivers/char/agp/amd64-agp.c       2007-04-04 
17:07:13.000000000 +0200
+++ sle10sp1-2007-03-28/drivers/char/agp/amd64-agp.c    2007-04-04 
16:45:36.000000000 +0200
@@ -14,6 +14,7 @@
 #include <linux/agp_backend.h>
 #include <linux/mmzone.h>
 #include <asm/page.h>          /* PAGE_SIZE */
+#include <asm/e820.h>
 #include <asm/k8.h>
 #include "agp.h"
 
@@ -252,7 +253,9 @@ static struct agp_bridge_driver amd_8151
 /* Some basic sanity checks for the aperture. */
 static int __devinit aperture_valid(u64 aper, u32 size)
 {
+#ifndef CONFIG_XEN
        u32 pfn, c;
+#endif
        if (aper == 0) {
                printk(KERN_ERR PFX "No aperture\n");
                return 0;
@@ -265,6 +268,7 @@ static int __devinit aperture_valid(u64 
                printk(KERN_ERR PFX "Aperture out of bounds\n");
                return 0;
        }
+#ifndef CONFIG_XEN
        pfn = aper >> PAGE_SHIFT;
        for (c = 0; c < size/PAGE_SIZE; c++) {
                if (!pfn_valid(pfn + c))
@@ -273,6 +277,11 @@ static int __devinit aperture_valid(u64 
                        printk(KERN_ERR PFX "Aperture pointing to RAM\n");
                        return 0;
                }
+#else
+       if (e820_any_mapped(aper, aper + size, E820_RAM)) {
+               printk(KERN_ERR PFX "Aperture pointing to RAM\n");
+               return 0;
+#endif
        }
 
        /* Request the Aperture. This catches cases when someone else
Index: sle10sp1-2007-03-28/include/asm-i386/e820.h
===================================================================
--- sle10sp1-2007-03-28.orig/include/asm-i386/e820.h    2007-04-04 
17:07:13.000000000 +0200
+++ sle10sp1-2007-03-28/include/asm-i386/e820.h 2007-04-04 16:45:36.000000000 
+0200
@@ -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-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] linux/x86: fix amd64-agp aperture validation, Jan Beulich <=