[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

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



commit 4f6a29158273642928db3f73604ac76d6da1d6af
Author:     Henry Wang <Henry.Wang@xxxxxxx>
AuthorDate: Wed Feb 1 10:15:12 2023 +0800
Commit:     Julien Grall <julien@xxxxxxx>
CommitDate: Sun Apr 16 17:19:06 2023 +0100

    xen/arm: Extend the memory overlap check to include bootmodules
    
    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 introduces a helper `bootmodules_overlap_check()`
    and uses this helper to extend the check in function
    `check_reserved_regions_overlap()` so that memory regions in
    bootinfo.modules are included. Use `check_reserved_regions_overlap()`
    in `add_boot_module()` to return early if any error occurs.
    
    Signed-off-by: Henry Wang <Henry.Wang@xxxxxxx>
    Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
---
 xen/arch/arm/setup.c | 39 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 39 insertions(+)

diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index 28c79a413f..1ea42a0386 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -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];
--
generated by git-patchbot for /home/xen/git/xen.git#master



 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.