aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2009-04-14 15:23:53 +0100
committerKeir Fraser <keir.fraser@citrix.com>2009-04-14 15:23:53 +0100
commitb7bcf6c3bec7e75fc18b6bf078c2fbc1441e0d50 (patch)
treef5141de4aa2c95a117b2fb1eeb12ecd72782bc3a
parent71c0c5fbe55c257427523828842df80f8529847a (diff)
downloadxen-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.c19
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;
}