|
[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 |