|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: bootfdt: Always sort memory banks
On Mon, 14 Jun 2021, Oleksandr Tyshchenko wrote:
> From: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
>
> At the moment, Xen expects the memory banks to be ordered.
> Unfortunately, there may be a case when updated by firmware
> device tree contains unordered banks. This means Xen will panic
> when setting xenheap mappings for the subsequent bank with start
> address being less than xenheap_mfn_start (start address of
> the first bank).
>
> As there is no clear requirment regarding ordering in the device
> tree, update code to be able to deal with by sorting memory
> banks if we have more than one.
>
> Suggested-by: Julien Grall <jgrall@xxxxxxxxxx>
> Signed-off-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx>
> ---
>
> The proposed commit fixes the booting Xen on R-Car M3-W+ SoC:
>
> Starting kernel ...
> - UART enabled -
> - Boot CPU booting -
> - Current EL 00000008 -
> - Initialize CPU -
> - Turning on paging -
> - Zero BSS -
> - Ready -
> (XEN) Checking for initrd in /chosen
> (XEN) Initrd 0000000084000040-0000000085dbc32a
> (XEN) RAM: 0000000480000000 - 00000004ffffffff
> (XEN) RAM: 0000000048000000 - 00000000bfffffff
> (XEN) RAM: 0000000600000000 - 00000006ffffffff
>
> ...
>
> (XEN) ****************************************
> (XEN) Panic on CPU 0:
> (XEN) cannot add xenheap mapping at 48000 below heap start 480000
> (XEN) ****************************************
> (XEN)
> (XEN) Reboot in five seconds...
> ---
> xen/arch/arm/bootfdt.c | 22 ++++++++++++++++++++++
> 1 file changed, 22 insertions(+)
>
> diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
> index dcff512..3ef63b3 100644
> --- a/xen/arch/arm/bootfdt.c
> +++ b/xen/arch/arm/bootfdt.c
> @@ -13,6 +13,7 @@
> #include <xen/init.h>
> #include <xen/device_tree.h>
> #include <xen/libfdt/libfdt.h>
> +#include <xen/sort.h>
> #include <xsm/xsm.h>
> #include <asm/setup.h>
>
> @@ -395,6 +396,21 @@ static void __init early_print_info(void)
> printk("\n");
> }
>
> +/* This function assumes that memory regions are not overlapped */
> +static int __init cmp_memory_node(const void *key, const void *elem)
> +{
> + const struct membank *handler0 = key;
> + const struct membank *handler1 = elem;
> +
> + if ( handler0->start < handler1->start )
> + return -1;
> +
> + if ( handler0->start >= (handler1->start + handler1->size) )
> + return 1;
> +
> + return 0;
> +}
> +
> /**
> * boot_fdt_info - initialize bootinfo from a DTB
> * @fdt: flattened device tree binary
> @@ -412,6 +428,12 @@ size_t __init boot_fdt_info(const void *fdt, paddr_t
> paddr)
> add_boot_module(BOOTMOD_FDT, paddr, fdt_totalsize(fdt), false);
>
> device_tree_for_each_node((void *)fdt, 0, early_scan_node, NULL);
> + if ( bootinfo.mem.nr_banks > 1 )
> + {
> + /* Some DT may describe unordered banks, sort them in ascending
> order */
> + sort(bootinfo.mem.bank, bootinfo.mem.nr_banks, sizeof(struct
> membank),
> + cmp_memory_node, NULL);
> + }
> early_print_info();
>
> return fdt_totalsize(fdt);
> --
> 2.7.4
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |