|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v2 8/8] xen/riscv: introduce early_fdt_map()
On 12.07.2024 18:22, Oleksii Kurochko wrote:
> --- a/xen/arch/riscv/include/asm/mm.h
> +++ b/xen/arch/riscv/include/asm/mm.h
> @@ -266,4 +266,6 @@ static inline unsigned int arch_get_dma_bitsize(void)
>
> void setup_fixmap_mappings(void);
>
> +void* early_fdt_map(paddr_t fdt_paddr);
Please can you take care to address comments on earlier versions before
submitting a new one?
> @@ -435,3 +438,55 @@ inline pte_t mfn_to_xen_entry(mfn_t mfn, unsigned int
> attr)
>
> return mfn_to_pte(mfn);
> }
> +
> +void * __init early_fdt_map(paddr_t fdt_paddr)
> +{
> + /* We are using 2MB superpage for mapping the FDT */
> + paddr_t base_paddr = fdt_paddr & XEN_PT_LEVEL_MAP_MASK(1);
> + paddr_t offset;
> + void *fdt_virt;
> + uint32_t size;
> + int rc;
> +
> + /*
> + * Check whether the physical FDT address is set and meets the minimum
> + * alignment requirement. Since we are relying on MIN_FDT_ALIGN to be at
> + * least 8 bytes so that we always access the magic and size fields
> + * of the FDT header after mapping the first chunk, double check if
> + * that is indeed the case.
> + */
> + BUILD_BUG_ON(MIN_FDT_ALIGN < 8);
> + if ( !fdt_paddr || fdt_paddr % MIN_FDT_ALIGN )
> + return NULL;
> +
> + /* The FDT is mapped using 2MB superpage */
> + BUILD_BUG_ON(BOOT_FDT_VIRT_START % SZ_2M);
May I suggest that you use MB(2) instead of SZ_2M (not just here)? I think
I had voiced opposition to the introduction of xen/sizes.h about 10 years
back, yet sadly it still landed in the tree. I for one think that our KB(),
MB(), and GB() constructs are superior, and (I hope) free of Misra issues
(unlike SZ_2G).
> + rc = map_pages_to_xen(BOOT_FDT_VIRT_START, maddr_to_mfn(base_paddr),
> + SZ_2M >> PAGE_SHIFT,
> + PAGE_HYPERVISOR_RO | _PAGE_BLOCK);
> + if ( rc )
> + panic("Unable to map the device-tree.\n");
> +
> + offset = fdt_paddr % XEN_PT_LEVEL_SIZE(1);
> + fdt_virt = (void *)BOOT_FDT_VIRT_START + offset;
> +
> + if ( fdt_magic(fdt_virt) != FDT_MAGIC )
> + return NULL;
> +
> + size = fdt_totalsize(fdt_virt);
> + if ( size > BOOT_FDT_VIRT_SIZE )
> + return NULL;
> +
> + if ( (offset + size) > SZ_2M )
> + {
> + rc = map_pages_to_xen(BOOT_FDT_VIRT_START + SZ_2M,
> + maddr_to_mfn(base_paddr + SZ_2M),
> + SZ_2M >> PAGE_SHIFT,
> + PAGE_HYPERVISOR_RO | _PAGE_BLOCK);
> + if ( rc )
> + panic("Unable to map the device-tree\n");
> + }
Why this two part mapping? And why are you mapping perhaps much more
than "size"?
> @@ -48,6 +49,14 @@ void __init noreturn start_xen(unsigned long bootcpu_id,
>
> setup_fixmap_mappings();
>
> + device_tree_flattened = early_fdt_map(dtb_addr);
> + if ( device_tree_flattened )
Is this condition perhaps inverted?
Jan
> + panic("Invalid device tree blob at physical address %#lx.\n"
> + "The DTB must be 8-byte aligned and must not exceed %lld "
> + "bytes in size.\n\n"
> + "Please check your bootloader.\n",
> + dtb_addr, BOOT_FDT_VIRT_SIZE);
> +
> printk("All set up\n");
>
> for ( ;; )
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |