diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2009-04-14 15:23:53 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2009-04-14 15:23:53 +0100 |
commit | b7bcf6c3bec7e75fc18b6bf078c2fbc1441e0d50 (patch) | |
tree | f5141de4aa2c95a117b2fb1eeb12ecd72782bc3a | |
parent | 71c0c5fbe55c257427523828842df80f8529847a (diff) | |
download | xen-b7bcf6c3bec7e75fc18b6bf078c2fbc1441e0d50.tar.gz xen-b7bcf6c3bec7e75fc18b6bf078c2fbc1441e0d50.tar.bz2 xen-b7bcf6c3bec7e75fc18b6bf078c2fbc1441e0d50.zip |
x86: Support discontiguous sets of multiboot modules.
Signed-off-by: Keir Fraser <keir.fraser@citrix.com>
-rw-r--r-- | xen/arch/x86/setup.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index bf04e43280..5da0b33039 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -419,7 +419,7 @@ void __init __start_xen(unsigned long mbi_p) multiboot_info_t *mbi = __va(mbi_p); module_t *mod = (module_t *)__va(mbi->mods_addr); unsigned long nr_pages, modules_length, modules_headroom; - int i, e820_warn = 0, bytes = 0; + int i, j, e820_warn = 0, bytes = 0; struct ns16550_defaults ns16550 = { .data_bits = 8, .parity = 'n', @@ -614,7 +614,9 @@ void __init __start_xen(unsigned long mbi_p) * we can relocate the dom0 kernel and other multiboot modules. Also, on * x86/64, we relocate Xen to higher memory. */ - modules_length = mod[mbi->mods_count-1].mod_end - mod[0].mod_start; + modules_length = 0; + for ( i = 0; i < mbi->mods_count; i++ ) + modules_length += mod[i].mod_end - mod[i].mod_start; /* ensure mod[0] is mapped before parsing */ bootstrap_map(mod[0].mod_start, mod[0].mod_end); @@ -735,8 +737,14 @@ void __init __start_xen(unsigned long mbi_p) initial_images_start = e; e -= modules_headroom; initial_images_base = e; - move_memory(initial_images_start, - mod[0].mod_start, mod[mbi->mods_count-1].mod_end); + e += modules_length + modules_headroom; + for ( j = mbi->mods_count-1; j >= 0; j-- ) + { + e -= mod[j].mod_end - mod[j].mod_start; + move_memory(e, mod[j].mod_start, mod[j].mod_end); + mod[j].mod_end += e - mod[j].mod_start; + mod[j].mod_start = e; + } } if ( !kexec_crash_area.start && (s < e) && @@ -1030,8 +1038,7 @@ void __init __start_xen(unsigned long mbi_p) if ( (initrdidx > 0) && (initrdidx < mbi->mods_count) ) { - _initrd_start = initial_images_start + - (mod[initrdidx].mod_start - mod[0].mod_start); + _initrd_start = mod[initrdidx].mod_start; _initrd_len = mod[initrdidx].mod_end - mod[initrdidx].mod_start; } |