[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH for-4.9 3/4] xen/arm: Check if the FDT passed by the bootloader is valid
On Wed, 19 Apr 2017, Julien Grall wrote: > There is currently no sanity check on the FDT passed by the bootloader. > Whilst they are stricly not necessary, it will avoid us to spend hours > to try to find out why it does not work. > > >From the booting documentation for AArch32 [1] and AArch64 [2] must : > - be placed on 8-byte boundary > - not exceed 2MB (only on AArch64) > > Even if AArch32 does not seem to limit the size, Xen is not currently > able to support more the 2MB FDT. It is better to crash rather with a nice > error message than claiming we are supporting any size of FDT. > > The checks are mostly borrowed from the Linux code (see fixmap_remap_fdt > in arch/arm64/mm/mmu.c). > > [1] Section 2 in linux/Documentation/arm64/booting.txt > [2] Section 4b in linux/Documentation/arm/Booting > > Signed-off-by: Julien Grall <julien.grall@xxxxxxx> > --- > xen/arch/arm/mm.c | 29 ++++++++++++++++++++++++++++- > xen/arch/arm/setup.c | 6 ++++++ > xen/include/asm-arm/setup.h | 3 +++ > 3 files changed, 37 insertions(+), 1 deletion(-) > > diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c > index 0d076489c6..53d36e2ce2 100644 > --- a/xen/arch/arm/mm.c > +++ b/xen/arch/arm/mm.c > @@ -39,6 +39,8 @@ > #include <xsm/xsm.h> > #include <xen/pfn.h> > #include <xen/sizes.h> > +#include <xen/libfdt/libfdt.h> > +#include <asm/setup.h> > > static void __init create_mappings(lpae_t *second, > unsigned long virt_offset, > @@ -447,11 +449,36 @@ void * __init early_fdt_map(paddr_t fdt_paddr) > { > /* We are using 2MB superpage for mapping the FDT */ > paddr_t base_paddr = fdt_paddr & SECOND_MASK; > + paddr_t offset; > + void *fdt_virt; > + > + /* > + * 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); I think that this BUILD_BUG_ON is overkill, a comment would be enough > + 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); Same here. > create_mappings(boot_second, BOOT_FDT_VIRT_START, > paddr_to_pfn(base_paddr), > SZ_2M >> PAGE_SHIFT, SZ_2M); > > - return (void *)BOOT_FDT_VIRT_START + (fdt_paddr % SECOND_SIZE); > + offset = fdt_paddr % SECOND_SIZE; > + fdt_virt = (void *)BOOT_FDT_VIRT_START + offset; offset is useless, you can just: fdt_virt = (void *)BOOT_FDT_VIRT_START + (fdt_paddr % SECOND_SIZE); > + if ( fdt_magic(fdt_virt) != FDT_MAGIC ) > + return NULL; > + > + if ( fdt_totalsize(fdt_virt) > MAX_FDT_SIZE ) > + return NULL; > + > + return fdt_virt; > } > > void __init remove_early_mappings(void) > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > index 986398970f..8f72f31fb5 100644 > --- a/xen/arch/arm/setup.c > +++ b/xen/arch/arm/setup.c > @@ -725,6 +725,12 @@ void __init start_xen(unsigned long boot_phys_offset, > smp_clear_cpu_maps(); > > device_tree_flattened = early_fdt_map(fdt_paddr); > + if ( !device_tree_flattened ) > + panic("Invalid device tree blob at physical address %#lx\n" > + "The DTB must be 8-byte aligned and must not exceed 2 MB in > size\n" > + "\nPlease check your bootloader.", > + fdt_paddr); Strange, why did you place the "\n" at the beginning of the line? These are all minor stylistic nits, so Reviewed-by: Stefano Stabellini <sstabellini@xxxxxxxxxx> > fdt_size = boot_fdt_info(device_tree_flattened, fdt_paddr); > > cmdline = boot_fdt_cmdline(device_tree_flattened); > diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h > index 7c761851d2..7ff2c34dab 100644 > --- a/xen/include/asm-arm/setup.h > +++ b/xen/include/asm-arm/setup.h > @@ -3,6 +3,9 @@ > > #include <public/version.h> > > +#define MIN_FDT_ALIGN 8 > +#define MAX_FDT_SIZE SZ_2M > + > #define NR_MEM_BANKS 64 > > #define MAX_MODULES 5 /* Current maximum useful modules */ > -- > 2.11.0 > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |