diff -ru xen-3.0.1-orig/xen/common/page_alloc.c xen-3.0.1/xen/common/page_alloc.c --- xen-3.0.1-orig/xen/common/page_alloc.c 2006-04-03 01:53:24.000000000 +0200 +++ xen-3.0.1/xen/common/page_alloc.c 2006-04-04 09:01:53.000000000 +0200 @@ -155,7 +155,7 @@ void init_boot_pages(physaddr_t ps, physaddr_t pe) { - unsigned long bad_pfn; + unsigned long bad_pfn, bad_mask, i; char *p; ps = round_pgup(ps); @@ -170,16 +170,36 @@ while ( *p != '\0' ) { bad_pfn = simple_strtoul(p, &p, 0); + bad_mask = ~0; /* mask specific to one page */ + + if ( *p == '/' ) + { + p++; + bad_mask = simple_strtoul(p, &p, 0); + bad_pfn &= bad_mask; /* ignore address bits not covered by the mask */ + } if ( *p == ',' ) p++; else if ( *p != '\0' ) break; - if ( (bad_pfn < max_page) && !allocated_in_map(bad_pfn) ) - { + if ( bad_mask == ~0 ) printk("Marking page %lx as bad\n", bad_pfn); - map_alloc(bad_pfn, 1); + else + printk("Marking pages %lx/%lx as bad\n", + bad_pfn, bad_mask); + + /* iterate over pages covered by the mask */ + for ( i=0; (bad_pfn|i) < max_page ; i++ ) + { + if ( !(i & bad_mask) ) + { + if ( !allocated_in_map(bad_pfn|i) ) + map_alloc(bad_pfn|i, 1); + else + printk("Warning, bad page %lx in use\n", bad_pfn|i); + } } } }