Hi Michal,

> On 26 Feb 2025, at 10:38, Orzel, Michal <michal.or...@amd.com> wrote:
> 
> 
> 
> 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...

ok I’ll remove it

> 
>> Signed-off-by: Luca Fancellu <luca.fance...@arm.com>
>> ---
>> 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.

woops, my bad, I’ll fix

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

you mean something like: 

static void * __init relocate_fdt(size_t dtb_size)
{
void *fdt = xmalloc_bytes(dtb_size);

if ( !fdt )
panic("Unable to allocate memory for relocating the Device-Tree.\n");

memcpy(fdt, device_tree_flattened, dtb_size);
clean_dcache_va_range(fdt, dtb_size);

return fdt;
}


Cheers,
Luca

Reply via email to