diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index ce7fdf2843..e100233826 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -165,6 +165,7 @@ static void __init process_multiboot_node(const void *fdt, int node, const char *name, u32 address_cells, u32 size_cells) { + static int kind_guess = 0; const struct fdt_property *prop; const __be32 *cell; bootmodule_kind kind; @@ -181,7 +182,18 @@ static void __init process_multiboot_node(const void *fdt, int node, else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 ) kind = BOOTMOD_XSM; else - panic("%s not a known xen multiboot type\n", name); + kind = BOOTMOD_UNKNOWN; + + /* Guess that first two unknown are kernel and ramdisk respectively. */ + if ( kind == BOOTMOD_UNKNOWN ) + { + switch ( kind_guess++ ) + { + case 0: kind = BOOTMOD_KERNEL; break; + case 1: kind = BOOTMOD_RAMDISK; break; + default: break; + } + } prop = fdt_get_property(fdt, node, "reg", &len); if ( !prop ) @@ -281,10 +293,11 @@ static void __init early_print_info(void) mi->bank[i].start + mi->bank[i].size - 1); printk("\n"); for ( i = 0 ; i < mods->nr_mods; i++ ) - printk("MODULE[%d]: %"PRIpaddr" - %"PRIpaddr" %s\n", + printk("MODULE[%d]: %"PRIpaddr" - %"PRIpaddr" %-12s %s\n", i, mods->module[i].start, mods->module[i].start + mods->module[i].size, + boot_module_kind_as_string(mods->module[i].kind), mods->module[i].cmdline); nr_rsvd = fdt_num_mem_rsv(device_tree_flattened); for ( i = 0; i < nr_rsvd; i++ ) diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 0cbe55233c..e53e491f8b 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -223,6 +223,20 @@ struct bootmodule * __init boot_module_find_by_kind(bootmodule_kind kind) return NULL; } +const char * __init boot_module_kind_as_string(bootmodule_kind kind) +{ + switch ( kind ) + { + case BOOTMOD_XEN: return "Xen"; + case BOOTMOD_FDT: return "Device Tree"; + case BOOTMOD_KERNEL: return "Kernel"; + case BOOTMOD_RAMDISK: return "Ramdisk"; + case BOOTMOD_XSM: return "XSM"; + case BOOTMOD_UNKNOWN: return "Unknown"; + default: BUG(); + } +} + void __init discard_initial_modules(void) { struct bootmodules *mi = &bootinfo.modules; diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h index e2e18c3033..36e57041c1 100644 --- a/xen/include/asm-arm/setup.h +++ b/xen/include/asm-arm/setup.h @@ -64,6 +64,7 @@ struct bootmodule *add_boot_module(bootmodule_kind kind, paddr_t start, paddr_t size, const char *cmdline); struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind); +const char * __init boot_module_kind_as_string(bootmodule_kind kind); #endif /*