| 
    
 [Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH] xen/arm: Don't use copy_from_paddr for DTB relocation
 
On 26/02/2025 09:36, Luca Fancellu wrote:
> 
> 
> Currently the early stage of the Arm boot maps the DTB using
> early_fdt_map() using PAGE_HYPERVISOR_RO which is cacheable
> read-only memory, later during DTB relocation the function
> copy_from_paddr() is used to map pages in the same range on
> the fixmap but using PAGE_HYPERVISOR_WC which is non-cacheable
> read-write memory.
> 
> The Arm specifications, ARM DDI0487L.a, section B2.11 "Mismatched
> memory attributes" discourage using mismatched attributes for
> aliases of the same location.
> 
> Given that there is nothing preventing the relocation since the region
> is already mapped, fix that by open-coding copy_from_paddr inside
> relocate_fdt, without mapping on the fixmap.
> 
> Fixes: 1bdc81dac816 ("arm: setup MM using information from the device tree")
Why Fixes tag? I don't see it as a bug and something we need to backport...
> Signed-off-by: Luca Fancellu <luca.fancellu@xxxxxxx>
> ---
>  xen/arch/arm/setup.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index c1f2d1b89d43..b1fd4b44a2e1 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -237,14 +237,15 @@ void __init discard_initial_modules(void)
>  }
> 
>  /* Relocate the FDT in Xen heap */
> -static void * __init relocate_fdt(paddr_t dtb_paddr, size_t dtb_size)
> +static void * __init relocate_fdt(const void *dtb_vaddr, 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);
> +    memcpy(fdt, dtb_vaddr, dtb_size);
> +    clean_dcache_va_range(dtb_vaddr, dtb_size);
The purpose of cleaning dcache after memcpy is to clean the new area i.e.
destination == fdt, not source region.
> 
>      return fdt;
>  }
> @@ -362,7 +363,7 @@ void asmlinkage __init start_xen(unsigned long fdt_paddr)
>      if ( acpi_disabled )
>      {
>          printk("Booting using Device Tree\n");
> -        device_tree_flattened = relocate_fdt(fdt_paddr, fdt_size);
> +        device_tree_flattened = relocate_fdt(device_tree_flattened, 
> fdt_size);
NIT: It can be just my PoV but it reads odd. Why can't relocate_fdt modify
device_tree_flattened pointer directly in the function?
>          dt_unflatten_host_device_tree();
>      }
>      else
> --
> 2.34.1
> 
~Michal
 
 
  | 
  
![]()  | 
            
         Lists.xenproject.org is hosted with RackSpace, monitoring our  |