|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH] xen/arm: setup: Relocate the Device-Tree later on in the boot
Hi Julien,
Julien Grall writes:
> At the moment, the Device-Tree is relocated into xenheap while setting
> up the memory subsystem. This is actually not necessary because the
> early mapping is still present and we don't require the virtual address
> to be stable until unflatting the Device-Tree.
>
> So the relocation can safely be moved after the memory subsystem is
> fully setup. This has the nice advantage to make the relocation common
> and let the xenheap allocator decides where to put it.
>
> Lastly, the device-tree is not going to be used for ACPI system. So
> there are no need to relocate it and can just be discarded.
>
> Signed-off-by: Julien Grall <julien.grall@xxxxxxx>
Reviewed-by: Volodymyr Babchuk <volodymyr_babchuk@xxxxxxxx>
This certainly is looking better now.
> ---
> xen/arch/arm/setup.c | 58
> ++++++++++++++++++++--------------------------------
> 1 file changed, 22 insertions(+), 36 deletions(-)
>
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 1b303bde34..ebbfad94e4 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -399,6 +399,19 @@ void __init discard_initial_modules(void)
> remove_early_mappings();
> }
>
> +/* Relocate the FDT in Xen heap */
> +static void * __init relocate_fdt(paddr_t dtb_paddr, size_t dtb_size)
> +{
> + void *fdt = xmalloc_bytes(dtb_size);
> +
> + if ( !fdt )
> + panic("Unable to allocate memory for relocating the Device-Tree.\n");
> +
> + copy_from_paddr(fdt, dtb_paddr, dtb_size);
> +
> + return fdt;
> +}
> +
> #ifdef CONFIG_ARM_32
> /*
> * Returns the end address of the highest region in the range s..e
> @@ -572,16 +585,13 @@ static void __init init_pdx(void)
> }
>
> #ifdef CONFIG_ARM_32
> -static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
> +static void __init setup_mm(void)
> {
> paddr_t ram_start, ram_end, ram_size;
> paddr_t s, e;
> unsigned long ram_pages;
> unsigned long heap_pages, xenheap_pages, domheap_pages;
> - unsigned long dtb_pages;
> - unsigned long boot_mfn_start, boot_mfn_end;
> int i;
> - void *fdt;
> const uint32_t ctr = READ_CP32(CTR);
>
> if ( !bootinfo.mem.nr_banks )
> @@ -655,21 +665,6 @@ static void __init setup_mm(unsigned long dtb_paddr,
> size_t dtb_size)
>
> setup_xenheap_mappings((e >> PAGE_SHIFT) - xenheap_pages, xenheap_pages);
>
> - /*
> - * Need a single mapped page for populating bootmem_region_list
> - * and enough mapped pages for copying the DTB.
> - */
> - dtb_pages = (dtb_size + PAGE_SIZE-1) >> PAGE_SHIFT;
> - boot_mfn_start = mfn_x(xenheap_mfn_end) - dtb_pages - 1;
> - boot_mfn_end = mfn_x(xenheap_mfn_end);
> -
> - init_boot_pages(pfn_to_paddr(boot_mfn_start),
> pfn_to_paddr(boot_mfn_end));
> -
> - /* Copy the DTB. */
> - fdt = mfn_to_virt(mfn_x(alloc_boot_pages(dtb_pages, 1)));
> - copy_from_paddr(fdt, dtb_paddr, dtb_size);
> - device_tree_flattened = fdt;
> -
> /* Add non-xenheap memory */
> for ( i = 0; i < bootinfo.mem.nr_banks; i++ )
> {
> @@ -713,20 +708,17 @@ static void __init setup_mm(unsigned long dtb_paddr,
> size_t dtb_size)
> setup_frametable_mappings(ram_start, ram_end);
> max_page = PFN_DOWN(ram_end);
>
> - /* Add xenheap memory that was not already added to the boot
> - allocator. */
> + /* Add xenheap memory that was not already added to the boot allocator.
> */
> init_xenheap_pages(mfn_to_maddr(xenheap_mfn_start),
> - pfn_to_paddr(boot_mfn_start));
> + mfn_to_maddr(xenheap_mfn_end));
> }
> #else /* CONFIG_ARM_64 */
> -static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
> +static void __init setup_mm(void)
> {
> paddr_t ram_start = ~0;
> paddr_t ram_end = 0;
> paddr_t ram_size = 0;
> int bank;
> - unsigned long dtb_pages;
> - void *fdt;
>
> init_pdx();
>
> @@ -770,16 +762,6 @@ static void __init setup_mm(unsigned long dtb_paddr,
> size_t dtb_size)
> xenheap_mfn_start = maddr_to_mfn(ram_start);
> xenheap_mfn_end = maddr_to_mfn(ram_end);
>
> - /*
> - * Need enough mapped pages for copying the DTB.
> - */
> - dtb_pages = (dtb_size + PAGE_SIZE-1) >> PAGE_SHIFT;
> -
> - /* Copy the DTB. */
> - fdt = mfn_to_virt(mfn_x(alloc_boot_pages(dtb_pages, 1)));
> - copy_from_paddr(fdt, dtb_paddr, dtb_size);
> - device_tree_flattened = fdt;
> -
> setup_frametable_mappings(ram_start, ram_end);
> max_page = PFN_DOWN(ram_end);
> }
> @@ -838,7 +820,7 @@ void __init start_xen(unsigned long boot_phys_offset,
> printk("Command line: %s\n", cmdline);
> cmdline_parse(cmdline);
>
> - setup_mm(fdt_paddr, fdt_size);
> + setup_mm();
>
> /* Parse the ACPI tables for possible boot-time configuration */
> acpi_boot_table_init();
> @@ -856,10 +838,14 @@ void __init start_xen(unsigned long boot_phys_offset,
> if ( acpi_disabled )
> {
> printk("Booting using Device Tree\n");
> + device_tree_flattened = relocate_fdt(fdt_paddr, fdt_size);
> dt_unflatten_host_device_tree();
> }
> else
> + {
> printk("Booting using ACPI\n");
> + device_tree_flattened = NULL;
> + }
>
> init_IRQ();
--
Volodymyr Babchuk at EPAM
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |