[PATCH 3/3] xen/arm: Extend the memory overlap check to include EfiACPIReclaimMemory

Henry Wang posted 3 patches 1 year, 11 months ago
There is a newer version of this series
[PATCH 3/3] xen/arm: Extend the memory overlap check to include EfiACPIReclaimMemory
Posted by Henry Wang 1 year, 11 months ago
Similarly as the static regions and boot modules, memory regions with
EfiACPIReclaimMemory type (defined in bootinfo.acpi if CONFIG_ACPI is
enabled) should also not be overlapping with memory regions in
bootinfo.reserved_mem and bootinfo.modules.

Therefore, this commit further extends the check in function
`check_reserved_regions_overlap()` to include memory regions in
bootinfo.acpi, and use the extended `check_reserved_regions_overlap()`
in `meminfo_add_bank()` defined in `efi-boot.h` to return early if any
error occurs.

Signed-off-by: Henry Wang <Henry.Wang@arm.com>
---
 xen/arch/arm/efi/efi-boot.h | 10 ++++++++--
 xen/arch/arm/setup.c        | 20 ++++++++++++++++++++
 2 files changed, 28 insertions(+), 2 deletions(-)

diff --git a/xen/arch/arm/efi/efi-boot.h b/xen/arch/arm/efi/efi-boot.h
index 43a836c3a7..6121ba1f2f 100644
--- a/xen/arch/arm/efi/efi-boot.h
+++ b/xen/arch/arm/efi/efi-boot.h
@@ -161,13 +161,19 @@ static bool __init meminfo_add_bank(struct meminfo *mem,
                                     EFI_MEMORY_DESCRIPTOR *desc)
 {
     struct membank *bank;
+    paddr_t start = desc->PhysicalStart;
+    paddr_t size = desc->NumberOfPages * EFI_PAGE_SIZE;
 
     if ( mem->nr_banks >= NR_MEM_BANKS )
         return false;
+#ifdef CONFIG_ACPI
+    if ( check_reserved_regions_overlap(start, size) )
+        return false;
+#endif
 
     bank = &mem->bank[mem->nr_banks];
-    bank->start = desc->PhysicalStart;
-    bank->size = desc->NumberOfPages * EFI_PAGE_SIZE;
+    bank->start = start;
+    bank->size = size;
 
     mem->nr_banks++;
 
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index b43c8e118a..f2c2a3b6df 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -287,6 +287,13 @@ static int __init overlap_check(void *bootinfo_type,
         num = bootinfo.modules.nr_mods;
         type_str = "bootmodules";
     }
+#ifdef CONFIG_ACPI
+    else if ( bootinfo_type == &bootinfo.acpi )
+    {
+        num = bootinfo.acpi.nr_banks;
+        type_str = "EfiACPIReclaimMemory";
+    }
+#endif
     else
         panic("Invalid bootinfo type passed to overlap check\n");
 
@@ -302,6 +309,13 @@ static int __init overlap_check(void *bootinfo_type,
             bank_start = bootinfo.modules.module[i].start;
             bank_end = bank_start + bootinfo.modules.module[i].size;
         }
+#ifdef CONFIG_ACPI
+        else if ( bootinfo_type == &bootinfo.acpi )
+        {
+            bank_start = bootinfo.acpi.bank[i].start;
+            bank_end = bank_start + bootinfo.acpi.bank[i].size;
+        }
+#endif
 
         if ( region_end <= bank_start || region_start >= bank_end )
             continue;
@@ -345,6 +359,12 @@ int __init check_reserved_regions_overlap(paddr_t region_start,
     if ( overlap_check(&bootinfo.modules, region_start, region_end) )
         return -EINVAL;
 
+#ifdef CONFIG_ACPI
+    /* Check if input region is overlapping with ACPI EfiACPIReclaimMemory */
+    if ( overlap_check(&bootinfo.acpi, region_start, region_end) )
+        return -EINVAL;
+#endif
+
     return 0;
 }
 
-- 
2.25.1