@@ -291,6 +291,36 @@ static bool __init meminfo_overlap_check(struct meminfo *meminfo,
return false;
}
+/*
+ * TODO: '*_end' could be 0 if the module/region is at the end of the physical
+ * address space. This is for now not handled as it requires more rework.
+ */
+static bool __init bootmodules_overlap_check(struct bootmodules *bootmodules,
+ paddr_t region_start,
+ paddr_t region_size)
+{
+ paddr_t mod_start = INVALID_PADDR, mod_end = 0;
+ paddr_t region_end = region_start + region_size;
+ unsigned int i, mod_num = bootmodules->nr_mods;
+
+ for ( i = 0; i < mod_num; i++ )
+ {
+ mod_start = bootmodules->module[i].start;
+ mod_end = mod_start + bootmodules->module[i].size;
+
+ if ( region_end <= mod_start || region_start >= mod_end )
+ continue;
+ else
+ {
+ printk("Region: [%#"PRIpaddr", %#"PRIpaddr") overlapping with mod[%u]: [%#"PRIpaddr", %#"PRIpaddr")\n",
+ region_start, region_end, i, mod_start, mod_end);
+ return true;
+ }
+ }
+
+ return false;
+}
+
void __init fw_unreserved_regions(paddr_t s, paddr_t e,
void (*cb)(paddr_t, paddr_t),
unsigned int first)
@@ -315,6 +345,11 @@ bool __init check_reserved_regions_overlap(paddr_t region_start,
region_start, region_size) )
return true;
+ /* Check if input region is overlapping with bootmodules */
+ if ( bootmodules_overlap_check(&bootinfo.modules,
+ region_start, region_size) )
+ return true;
+
return false;
}
@@ -332,6 +367,10 @@ struct bootmodule __init *add_boot_module(bootmodule_kind kind,
boot_module_kind_as_string(kind), start, start + size);
return NULL;
}
+
+ if ( check_reserved_regions_overlap(start, size) )
+ return NULL;
+
for ( i = 0 ; i < mods->nr_mods ; i++ )
{
mod = &mods->module[i];