@@ -1033,7 +1033,7 @@ void asmlinkage __init noreturn __start_xen(unsigned long mbi_p)
char *kextra;
void *bsp_stack;
struct cpu_info *info = get_cpu_info(), *bsp_info;
- unsigned int initrdidx, num_parked = 0;
+ unsigned int num_parked = 0;
struct boot_info *bi;
multiboot_info_t *mbi;
module_t *mod;
@@ -1042,7 +1042,7 @@ void asmlinkage __init noreturn __start_xen(unsigned long mbi_p)
unsigned long eb_start, eb_end;
bool acpi_boot_table_init_done = false, relocated = false;
bool vm_init_done = false;
- int ret;
+ int initrdidx, ret;
struct ns16550_defaults ns16550 = {
.data_bits = 8,
.parity = 'n',
@@ -2085,20 +2085,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, bi->nr_modules);
- bi->mods[initrdidx].type = BOOTMOD_RAMDISK;
- bi->mods[initrdidx].flags |= BOOTMOD_FLAG_X86_CONSUMED;
- if ( bitmap_weight(module_map, bi->nr_modules) > 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(bi, BOOTMOD_UNKNOWN);
+ if ( initrdidx >= 0 )
+ {
+ bi->mods[initrdidx].type = BOOTMOD_RAMDISK;
+ bi->mods[initrdidx].flags |= BOOTMOD_FLAG_X86_CONSUMED;
+ if ( first_boot_module_index(bi, 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(bi->mods[0].mod, bi->mods[0].headroom,
- initrdidx < bi->nr_modules ?
+ (initrdidx >= 0 && initrdidx < bi->nr_modules) ?
bi->mods[initrdidx].mod : NULL,
kextra, bi->loader);
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. In the change, the new boot module iterator is used to find the initrd index, which returns a signed int. Switch initrdidx from unsigned to signed. Signed-off-by: Daniel P. Smith <dpsmith@apertussolutions.com> --- xen/arch/x86/setup.c | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-)