[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [XEN] Fix some e820 start-of-day issues by clipping all E820_RAM
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxxx # Date 1168780513 0 # Node ID 328deec3febfae2ddf66ed67e74abc07f8f91107 # Parent eb19c2745b8010ee5ee8700cb36ecd5eef53e656 [XEN] Fix some e820 start-of-day issues by clipping all E820_RAM regions to be page-sized and -aligned. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> --- xen/arch/x86/setup.c | 23 ++++++++++++++++++++--- 1 files changed, 20 insertions(+), 3 deletions(-) diff -r eb19c2745b80 -r 328deec3febf xen/arch/x86/setup.c --- a/xen/arch/x86/setup.c Sun Jan 14 12:03:31 2007 +0000 +++ b/xen/arch/x86/setup.c Sun Jan 14 13:15:13 2007 +0000 @@ -411,6 +411,23 @@ void __init __start_xen(multiboot_info_t printk("WARNING: Buggy e820 map detected and fixed " "(truncated length fields).\n"); + /* Ensure that all E820 RAM regions are page-aligned and -sized. */ + for ( i = 0; i < e820_raw_nr; i++ ) + { + uint64_t s, e; + if ( e820_raw[i].type != E820_RAM ) + continue; + s = PFN_UP(e820_raw[i].addr); + e = PFN_DOWN(e820_raw[i].addr + e820_raw[i].size); + e820_raw[i].size = 0; /* discarded later */ + if ( s < e ) + { + e820_raw[i].addr = s << PAGE_SHIFT; + e820_raw[i].size = (e - s) << PAGE_SHIFT; + } + } + + /* Sanitise the raw E820 map to produce a final clean version. */ max_page = init_e820(e820_raw, &e820_raw_nr); modules_length = mod[mbi->mods_count-1].mod_end - mod[0].mod_start; @@ -423,7 +440,7 @@ void __init __start_xen(multiboot_info_t printk("Not enough memory to stash the DOM0 kernel image.\n"); for ( ; ; ) ; } - + if ( (e820.map[i].type == E820_RAM) && (e820.map[i].size >= modules_length) && ((e820.map[i].addr + e820.map[i].size) >= @@ -474,10 +491,10 @@ void __init __start_xen(multiboot_info_t start = PFN_UP(e820.map[i].addr); end = PFN_DOWN(e820.map[i].addr + e820.map[i].size); /* Clip the range to exclude what the bootstrapper initialised. */ - if ( end < init_mapped ) - continue; if ( start < init_mapped ) start = init_mapped; + if ( end <= start ) + continue; /* Request the mapping. */ map_pages_to_xen( PAGE_OFFSET + (start << PAGE_SHIFT), _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |