[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 1/3] xen/arm: Add memory overlap check for bootinfo.reserved_mem
On Wed, 14 Dec 2022, Henry Wang wrote: > As we are having more and more types of static region, and all of > these static regions are defined in bootinfo.reserved_mem, it is > necessary to add the overlap check of reserved memory regions in Xen, > because such check will help user to identify the misconfiguration in > the device tree at the early stage of boot time. > > Currently we have 3 types of static region, namely > (1) static memory > (2) static heap > (3) static shared memory > > (1) and (2) are parsed by the function `device_tree_get_meminfo()` and > (3) is parsed using its own logic. All of parsed information of these > types will be stored in `struct meminfo`. > > Therefore, to unify the overlap checking logic for all of these types, > this commit firstly introduces a helper `meminfo_overlap_check()` and > a function `check_reserved_regions_overlap()` to check if an input > physical address range is overlapping with the existing memory regions > defined in bootinfo. After that, use `check_reserved_regions_overlap()` > in `device_tree_get_meminfo()` to do the overlap check of (1) and (2) > and replace the original overlap check of (3) with > `check_reserved_regions_overlap()`. > > Signed-off-by: Henry Wang <Henry.Wang@xxxxxxx> Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > --- > v1 -> v2: > 1. Split original `overlap_check()` to `meminfo_overlap_check()`. > 2. Rework commit message. > --- > xen/arch/arm/bootfdt.c | 13 +++++----- > xen/arch/arm/include/asm/setup.h | 2 ++ > xen/arch/arm/setup.c | 42 ++++++++++++++++++++++++++++++++ > 3 files changed, 50 insertions(+), 7 deletions(-) > > diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c > index 0085c28d74..e2f6c7324b 100644 > --- a/xen/arch/arm/bootfdt.c > +++ b/xen/arch/arm/bootfdt.c > @@ -88,6 +88,9 @@ static int __init device_tree_get_meminfo(const void *fdt, > int node, > for ( i = 0; i < banks && mem->nr_banks < NR_MEM_BANKS; i++ ) > { > device_tree_get_reg(&cell, address_cells, size_cells, &start, &size); > + if ( mem == &bootinfo.reserved_mem && > + check_reserved_regions_overlap(start, size) ) > + return -EINVAL; > /* Some DT may describe empty bank, ignore them */ > if ( !size ) > continue; > @@ -482,7 +485,9 @@ static int __init process_shm_node(const void *fdt, int > node, > return -EINVAL; > } > > - if ( (end <= mem->bank[i].start) || (paddr >= bank_end) ) > + if ( check_reserved_regions_overlap(paddr, size) ) > + return -EINVAL; > + else > { > if ( strcmp(shm_id, mem->bank[i].shm_id) != 0 ) > continue; > @@ -493,12 +498,6 @@ static int __init process_shm_node(const void *fdt, int > node, > return -EINVAL; > } > } > - else > - { > - printk("fdt: shared memory region overlap with an existing > entry %#"PRIpaddr" - %#"PRIpaddr"\n", > - mem->bank[i].start, bank_end); > - return -EINVAL; > - } > } > } > > diff --git a/xen/arch/arm/include/asm/setup.h > b/xen/arch/arm/include/asm/setup.h > index fdbf68aadc..6a9f88ecbb 100644 > --- a/xen/arch/arm/include/asm/setup.h > +++ b/xen/arch/arm/include/asm/setup.h > @@ -143,6 +143,8 @@ void fw_unreserved_regions(paddr_t s, paddr_t e, > size_t boot_fdt_info(const void *fdt, paddr_t paddr); > const char *boot_fdt_cmdline(const void *fdt); > > +int check_reserved_regions_overlap(paddr_t region_start, paddr_t > region_size); > + > struct bootmodule *add_boot_module(bootmodule_kind kind, > paddr_t start, paddr_t size, bool domU); > struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind); > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index 1f26f67b90..e6eeb3a306 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -261,6 +261,31 @@ static void __init dt_unreserved_regions(paddr_t s, > paddr_t e, > cb(s, e); > } > > +static int __init meminfo_overlap_check(struct meminfo *meminfo, > + paddr_t region_start, > + paddr_t region_end) > +{ > + paddr_t bank_start = INVALID_PADDR, bank_end = 0; > + unsigned int i, bank_num = meminfo->nr_banks; > + > + for ( i = 0; i < bank_num; i++ ) > + { > + bank_start = meminfo->bank[i].start; > + bank_end = bank_start + meminfo->bank[i].size; > + > + if ( region_end <= bank_start || region_start >= bank_end ) > + continue; > + else > + { > + printk("Region %#"PRIpaddr" - %#"PRIpaddr" overlapping with > bank[%u] %#"PRIpaddr" - %#"PRIpaddr"\n", > + region_start, region_end, i, bank_start, bank_end); > + return -EINVAL; > + } > + } > + > + return 0; > +} > + > void __init fw_unreserved_regions(paddr_t s, paddr_t e, > void (*cb)(paddr_t, paddr_t), > unsigned int first) > @@ -271,7 +296,24 @@ void __init fw_unreserved_regions(paddr_t s, paddr_t e, > cb(s, e); > } > > +/* > + * Given an input physical address range, check if this range is overlapping > + * with the existing reserved memory regions defined in bootinfo. > + * Return 0 if the input physical address range is not overlapping with any > + * existing reserved memory regions, otherwise -EINVAL. > + */ > +int __init check_reserved_regions_overlap(paddr_t region_start, > + paddr_t region_size) > +{ > + paddr_t region_end = region_start + region_size; > + > + /* Check if input region is overlapping with bootinfo.reserved_mem banks > */ > + if ( meminfo_overlap_check(&bootinfo.reserved_mem, > + region_start, region_end) ) > + return -EINVAL; > > + return 0; > +} > > struct bootmodule __init *add_boot_module(bootmodule_kind kind, > paddr_t start, paddr_t size, > -- > 2.25.1 >
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |