[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH v2] xen/arm: add warning if memory modules overlap
It's possible for a misconfigured device tree to cause Xen to crash when there are overlapping addresses in the memory modules. Add a warning when printing the addresses to let the user know there's a possible issue. Signed-off-by: Brian Woods <brian.woods@xxxxxxxxxx> --- v1 -> v2 - removed nested loop and placed check in add_boot_module() Sample output: ... (XEN) MODULE[0]: 0000000001400000 - 0000000001542121 Xen (XEN) MODULE[1]: 0000000003846000 - 0000000003850080 Device Tree (XEN) MODULE[2]: 0000000003853000 - 0000000007fff676 Ramdisk (XEN) MODULE[3]: 0000000000080000 - 0000000003180000 Kernel (XEN) RESVD[0]: 0000000003846000 - 0000000003850000 (XEN) RESVD[1]: 0000000003853000 - 0000000007fff676 (XEN) (XEN) WARNING: overlap detected in the memory module addresses (XEN) (XEN) Command line: console=dtuart dtuart=serial0 dom0_mem=1G bootscrub=0 maxcpus=1 timer_slop=0 ... xen/arch/arm/bootfdt.c | 4 ++++ xen/arch/arm/setup.c | 6 ++++++ xen/include/asm-arm/setup.h | 1 + 3 files changed, 11 insertions(+) diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c index 08fb59f..f8b34d4 100644 --- a/xen/arch/arm/bootfdt.c +++ b/xen/arch/arm/bootfdt.c @@ -387,6 +387,10 @@ static void __init early_print_info(void) mem_resv->bank[j].start + mem_resv->bank[j].size - 1); } printk("\n"); + + if ( mem_module_overlap ) + printk("WARNING: overlap detected in the memory module addresses.\n"); + for ( i = 0 ; i < cmds->nr_mods; i++ ) printk("CMDLINE[%"PRIpaddr"]:%s %s\n", cmds->cmdline[i].start, cmds->cmdline[i].dt_name, diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c index 705a917..315a131 100644 --- a/xen/arch/arm/setup.c +++ b/xen/arch/arm/setup.c @@ -69,6 +69,8 @@ integer_param("xenheap_megabytes", opt_xenheap_megabytes); domid_t __read_mostly max_init_domid; +bool __initdata mem_module_overlap; + static __used void init_done(void) { /* Must be done past setting system_state. */ @@ -254,6 +256,10 @@ struct bootmodule __init *add_boot_module(bootmodule_kind kind, mod->domU = false; return mod; } + + if ( ((mod->start >= start) && (mod->start < start + size)) || + ((start >= mod->start) && (start < mod->start + mod->size)) ) + mem_module_overlap = true; } mod = &mods->module[mods->nr_mods++]; diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h index 2f8f24e..4bb1ba1 100644 --- a/xen/include/asm-arm/setup.h +++ b/xen/include/asm-arm/setup.h @@ -122,6 +122,7 @@ void device_tree_get_reg(const __be32 **cell, u32 address_cells, u32 device_tree_get_u32(const void *fdt, int node, const char *prop_name, u32 dflt); +extern bool mem_module_overlap; #endif /* * Local variables: -- 2.7.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |