[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v4 07/23] xen/arm: probe domU kernels and initrds
On Mon, 15 Oct 2018, Julien Grall wrote: > Hi Stefano, > > On 05/10/2018 19:47, Stefano Stabellini wrote: > > Find addresses, sizes on device tree from kernel_probe. > > Find the cmdline from the bootcmdlines array. > > > > Introduce a new boot_module_find_by_addr_and_kind function to match not > > just on boot module kind, but also by address so that we can support > > multiple domains. > > > > Introduce a boot_cmdline_find_by_name function to find the right struct > > cmdline based on the device tree node name of the "xen,domain" > > compatible node. > > > > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> > > --- > > Changes in v3: > > - retrieve cmdline from bootcmdlines array > > > > Changes in v2: > > - fix indentation > > - unify kernel_probe with kernel_probe_domU > > - find cmdline on device_tree from kernel_probe > > --- > > xen/arch/arm/domain_build.c | 2 +- > > xen/arch/arm/kernel.c | 52 > > +++++++++++++++++++++++++++++++++++++++------ > > xen/arch/arm/kernel.h | 2 +- > > xen/arch/arm/setup.c | 29 +++++++++++++++++++++++++ > > xen/include/asm-arm/setup.h | 3 +++ > > 5 files changed, 79 insertions(+), 9 deletions(-) > > > > diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c > > index 64f8d6b..f073e6d 100644 > > --- a/xen/arch/arm/domain_build.c > > +++ b/xen/arch/arm/domain_build.c > > @@ -2137,7 +2137,7 @@ int __init construct_dom0(struct domain *d) > > kinfo.unassigned_mem = dom0_mem; > > kinfo.d = d; > > - rc = kernel_probe(&kinfo); > > + rc = kernel_probe(&kinfo, NULL); > > if ( rc < 0 ) > > return rc; > > diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c > > index da8410e..e5b8213 100644 > > --- a/xen/arch/arm/kernel.c > > +++ b/xen/arch/arm/kernel.c > > @@ -421,22 +421,60 @@ static int __init kernel_zimage32_probe(struct > > kernel_info *info, > > return 0; > > } > > -int __init kernel_probe(struct kernel_info *info) > > +int __init kernel_probe(struct kernel_info *info, struct dt_device_node > > *domain) > > { > > - struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_KERNEL); > > + struct bootmodule *mod = NULL; > > + struct bootcmdline *cmd = NULL; > > + struct dt_device_node *node; > > + u64 kernel_addr, initrd_addr, size; > > + const char *name = NULL; > > Please try to limit scope of variables. For instance, name is only used I'll move it below > > int rc; > > + if ( domain == NULL ) > > A line explain this is for the hardware domain would be useful. > > Maybe with an ASSERT(is_hardware_domain(d)) in the if. I'll add a comment and the ASSERT > > + { > > + mod = boot_module_find_by_kind(BOOTMOD_KERNEL); > > + > > + info->kernel_bootmodule = mod; > > + info->initrd_bootmodule = > > boot_module_find_by_kind(BOOTMOD_RAMDISK); > > + } else { > > Coding style: > > } > else > { I'll fix > > + dt_for_each_child_node(domain, node) > > + { > > + if ( dt_device_is_compatible(node, "multiboot,kernel") ) > > + { > > + u32 len; > > + const __be32 *val; > > Newline. OK > > > + val = dt_get_property(node, "reg", &len); > > + dt_get_range(&val, node, &kernel_addr, &size); > > Why don't you use dt_device_get_address? I tried but it doesn't work, it fails to retrieve address and size. The reason is that dt_match_bus fails (dt_device_get_address->dt_get_address->dt_match_bus). I guess the reason is that /chosen is not a bus. > > + } > > + else if ( dt_device_is_compatible(node, "multiboot,ramdisk") ) > > + { > > + u32 len; > > + const __be32 *val; > > Newline. OK > > + val = dt_get_property(node, "reg", &len); > > + dt_get_range(&val, node, &initrd_addr, &size); > > Ditto. > > > + } > > + else > > + continue; > > + } > > + if ( kernel_addr ) > > 0 is a valid physical address. Please use INVALID_PADDR when checking whether > the user specified an address. > > But, why don't you assign info->kernel_bootmodule when you found the node > associated to it? OK > > + info->kernel_bootmodule = mod = > > boot_module_find_by_addr_and_kind( > > + BOOTMOD_KERNEL, kernel_addr); > > This code is not easy to read because of the indentation and the double > assignment. As you change half the user of mod below, then you can drop it > completely. > > For the indentation, you could use a temporary variable. This would also help > to avoid using info-> everywhere below. I'll improve the code and avoid the double assignment, but I would like to keep mod around. It is better than the alternative. > > + if ( initrd_addr ) > > + info->initrd_bootmodule = boot_module_find_by_addr_and_kind( > > + BOOTMOD_RAMDISK, initrd_addr); > > + name = dt_node_name(domain); > > + cmd = boot_cmdline_find_by_name(name); > > + if ( cmd ) > > + info->cmdline = &cmd->cmdline[0]; > > If you set command line for DomU here, then please also set the command line > for the hwdom above. So the function has the same behavior accross all the > domain. OK > > + } > > if ( !mod || !mod->size ) > > { > > printk(XENLOG_ERR "Missing kernel boot module?\n"); > > return -ENOENT; > > } > > - info->kernel_bootmodule = mod; > > - > > - printk("Loading kernel from boot module @ %"PRIpaddr"\n", mod->start); > > - > > - info->initrd_bootmodule = boot_module_find_by_kind(BOOTMOD_RAMDISK); > > + printk("Loading DomU kernel from boot module @ %"PRIpaddr"\n", > > This message is wrong for the hardware domain. The best solution would be to > print dom%u. OK > > + info->kernel_bootmodule->start); > > if ( info->initrd_bootmodule ) > > printk("Loading ramdisk from boot module @ %"PRIpaddr"\n", > > info->initrd_bootmodule->start); > > diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h > > index 39b7828..4a65289 100644 > > --- a/xen/arch/arm/kernel.h > > +++ b/xen/arch/arm/kernel.h > > @@ -55,7 +55,7 @@ struct kernel_info { > > * ->type > > * ->load hook, and sets loader specific variables ->zimage > > */ > > -int kernel_probe(struct kernel_info *info); > > +int kernel_probe(struct kernel_info *info, struct dt_device_node *domain); > > /* > > * Loads the kernel into guest RAM. > > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > > index dbab232..d6d1546 100644 > > --- a/xen/arch/arm/setup.c > > +++ b/xen/arch/arm/setup.c > > @@ -263,6 +263,35 @@ struct bootcmdline * __init > > boot_cmdline_find_by_kind(bootmodule_kind kind) > > return NULL; > > } > > +struct bootcmdline * __init boot_cmdline_find_by_name(const char *name) > > +{ > > + struct bootcmdlines *mods = &bootinfo.cmdlines; > > + struct bootcmdline *mod; > > + int i; > > Unsigned + newline. OK > > + for (i = 0 ; i < mods->nr_mods ; i++ ) > > + { > > + mod = &mods->cmdline[i]; > > + if ( strcmp(mod->dt_name, name) == 0 ) > > + return mod; > > + } > > + return NULL; > > +} > > + > > +struct bootmodule * __init > > boot_module_find_by_addr_and_kind(bootmodule_kind kind, > > + paddr_t start) > > +{ > > + struct bootmodules *mods = &bootinfo.modules; > > + struct bootmodule *mod; > + int i; > > Same here. OK > > + for (i = 0 ; i < mods->nr_mods ; i++ ) > > + { > > + mod = &mods->module[i]; > > + if ( mod->kind == kind && mod->start == start ) > > + return mod; > > + } > > + return NULL; > > +} > > + > > const char * __init boot_module_kind_as_string(bootmodule_kind kind) > > { > > switch ( kind ) > > diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h > > index 711b4a2..177e8db 100644 > > --- a/xen/include/asm-arm/setup.h > > +++ b/xen/include/asm-arm/setup.h > > @@ -95,7 +95,10 @@ const char __init *boot_fdt_cmdline(const void *fdt); > > struct bootmodule *add_boot_module(bootmodule_kind kind, > > paddr_t start, paddr_t size, bool > > domU); > > struct bootmodule *boot_module_find_by_kind(bootmodule_kind kind); > > +struct bootmodule * __init > > boot_module_find_by_addr_and_kind(bootmodule_kind kind, > > + paddr_t > > start); > > struct bootcmdline *boot_cmdline_find_by_kind(bootmodule_kind kind); > > +struct bootcmdline * __init boot_cmdline_find_by_name(const char *name); > > const char * __init boot_module_kind_as_string(bootmodule_kind kind); > > #endif > > > > Cheers, > > -- > Julien Grall > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |