@@ -2100,20 +2100,30 @@ void asmlinkage __init noreturn __start_xen(unsigned long mbi_p)
cpu_has_nx ? XENLOG_INFO : XENLOG_WARNING "Warning: ",
cpu_has_nx ? "" : "not ");
- initrdidx = find_first_bit(module_map, boot_info->nr_mods);
- boot_info->mods[initrdidx].type = BOOTMOD_RAMDISK;
- boot_info->mods[initrdidx].flags |= BOOTMOD_FLAG_X86_CONSUMED;
- if ( bitmap_weight(module_map, boot_info->nr_mods) > 1 )
- printk(XENLOG_WARNING
- "Multiple initrd candidates, picking module #%u\n",
- initrdidx);
+ /*
+ * At this point all capabilities that consume boot modules should have
+ * claimed their boot modules. Find the first unclaimed boot module and
+ * claim it as the initrd ramdisk. Do a second search to see if there are
+ * any remaining unclaimed boot modules, and report them as unusued initrd
+ * candidates.
+ */
+ initrdidx = first_boot_module_index(boot_info, BOOTMOD_UNKNOWN);
+ if ( initrdidx >= 0 )
+ {
+ boot_info->mods[initrdidx].type = BOOTMOD_RAMDISK;
+ boot_info->mods[initrdidx].flags |= BOOTMOD_FLAG_X86_CONSUMED;
+ if ( first_boot_module_index(boot_info, BOOTMOD_UNKNOWN) >= 0 )
+ printk(XENLOG_WARNING
+ "Multiple initrd candidates, picking module #%u\n",
+ initrdidx);
+ }
/*
* We're going to setup domain0 using the module(s) that we stashed safely
* above our heap. The second module, if present, is an initrd ramdisk.
*/
dom0 = create_dom0(boot_info->mods[0].early_mod, boot_info->mods[0].headroom,
- initrdidx < boot_info->nr_mods ?
+ (initrdidx >= 0 && initrdidx < boot_info->nr_mods) ?
boot_info->mods[initrdidx].early_mod : NULL,
kextra, boot_info->boot_loader_name);
if ( !dom0 )
Locate the first unclaimed struct boot_module and mark it as ramdisk. If there are any remaining unclaimed struct boot_module instances, report to the console. Signed-off-by: Daniel P. Smith <dpsmith@apertussolutions.com> --- xen/arch/x86/setup.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)