diff mbox series

[2/3] xen/arm: Extend the memory overlap check to include bootmodules

Message ID 20221205025753.2178965-3-Henry.Wang@arm.com (mailing list archive)
State Superseded
Headers show
Series Memory region overlap check in device tree | expand

Commit Message

Henry Wang Dec. 5, 2022, 2:57 a.m. UTC
Similarly as the static regions defined in bootinfo.reserved_mem,
the bootmodule regions defined in bootinfo.modules should also not
be overlapping with memory regions in either bootinfo.reserved_mem
or bootinfo.modules.

Therefore, this commit extends the check in function
`check_reserved_regions_overlap()` to include memory regions in
bootinfo.modules, and use `check_reserved_regions_overlap()` in
`add_boot_module()` to return early if any error occurs.

Signed-off-by: Henry Wang <Henry.Wang@arm.com>
---
 xen/arch/arm/setup.c | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)
diff mbox series

Patch

diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 94d232605e..b43c8e118a 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -282,6 +282,11 @@  static int __init overlap_check(void *bootinfo_type,
         num = bootinfo.reserved_mem.nr_banks;
         type_str = "reserved_mem";
     }
+    else if ( bootinfo_type == &bootinfo.modules )
+    {
+        num = bootinfo.modules.nr_mods;
+        type_str = "bootmodules";
+    }
     else
         panic("Invalid bootinfo type passed to overlap check\n");
 
@@ -292,6 +297,11 @@  static int __init overlap_check(void *bootinfo_type,
             bank_start = bootinfo.reserved_mem.bank[i].start;
             bank_end = bank_start + bootinfo.reserved_mem.bank[i].size;
         }
+        else if ( bootinfo_type == &bootinfo.modules )
+        {
+            bank_start = bootinfo.modules.module[i].start;
+            bank_end = bank_start + bootinfo.modules.module[i].size;
+        }
 
         if ( region_end <= bank_start || region_start >= bank_end )
             continue;
@@ -331,6 +341,10 @@  int __init check_reserved_regions_overlap(paddr_t region_start,
     if ( overlap_check(&bootinfo.reserved_mem, region_start, region_end) )
         return -EINVAL;
 
+    /* Check if input region is overlapping with bootmodules */
+    if ( overlap_check(&bootinfo.modules, region_start, region_end) )
+        return -EINVAL;
+
     return 0;
 }
 
@@ -348,6 +362,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];