The patch titled fix amd64-agp aperture validation has been added to the -mm tree. Its filename is fix-amd64-agp-aperture-validation.patch *** Remember to use Documentation/SubmitChecklist when testing your code *** See http://www.zip.com.au/~akpm/linux/patches/stuff/added-to-mm.txt to find out what to do about this ------------------------------------------------------ Subject: fix amd64-agp aperture validation From: "Jan Beulich" <jbeulich@xxxxxxxxxx> 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> Cc: Dave Jones <davej@xxxxxxxxxxxxxxxxx> Cc: Andi Kleen <ak@xxxxxxx> Signed-off-by: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> --- arch/i386/kernel/e820.c | 20 ++++++++++++++++++++ arch/x86_64/kernel/e820.c | 3 ++- drivers/char/agp/amd64-agp.c | 13 ++++--------- include/asm-i386/e820.h | 1 + 4 files changed, 27 insertions(+), 10 deletions(-) diff -puN arch/i386/kernel/e820.c~fix-amd64-agp-aperture-validation arch/i386/kernel/e820.c --- a/arch/i386/kernel/e820.c~fix-amd64-agp-aperture-validation +++ a/arch/i386/kernel/e820.c @@ -818,6 +818,26 @@ void __init limit_regions(unsigned long print_memory_map("limit_regions endfunc"); } +/* + * 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 -puN arch/x86_64/kernel/e820.c~fix-amd64-agp-aperture-validation arch/x86_64/kernel/e820.c --- a/arch/x86_64/kernel/e820.c~fix-amd64-agp-aperture-validation +++ a/arch/x86_64/kernel/e820.c @@ -98,7 +98,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; @@ -112,6 +112,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 -puN drivers/char/agp/amd64-agp.c~fix-amd64-agp-aperture-validation drivers/char/agp/amd64-agp.c --- a/drivers/char/agp/amd64-agp.c~fix-amd64-agp-aperture-validation +++ a/drivers/char/agp/amd64-agp.c @@ -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" @@ -259,7 +260,6 @@ static const struct agp_bridge_driver am /* 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; @@ -272,14 +272,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 -puN include/asm-i386/e820.h~fix-amd64-agp-aperture-validation include/asm-i386/e820.h --- a/include/asm-i386/e820.h~fix-amd64-agp-aperture-validation +++ a/include/asm-i386/e820.h @@ -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); extern void find_max_pfn(void); extern void register_bootmem_low_pages(unsigned long max_low_pfn); extern void e820_register_memory(void); _ Patches currently in -mm which might be from jbeulich@xxxxxxxxxx are remove-pci_dac_dma_-apis.patch x86-tighten-kernel-image-page-access-rights.patch i386-simplify-smp_call_function-by-using-common-implementation.patch fix-amd64-agp-aperture-validation.patch use-stop_machine_run-in-the-intel-rng-driver.patch - To unsubscribe from this list: send the line "unsubscribe mm-commits" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html