[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 |