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