[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH RFC 08/15] xen/arm: probe domU kernels and initrds
On Thu, 14 Jun 2018, Julien Grall wrote: > Hi Stefano, > > On 13/06/18 23:15, Stefano Stabellini wrote: > > Find addresses and sizes on device tree. > > 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 domUs. > > > > Signed-off-by: Stefano Stabellini <stefanos@xxxxxxxxxx> > > --- > > xen/arch/arm/kernel.c | 54 > > +++++++++++++++++++++++++++++++++++++++++++++ > > xen/arch/arm/kernel.h | 2 ++ > > xen/arch/arm/setup.c | 15 +++++++++++++ > > xen/include/asm-arm/setup.h | 2 ++ > > 4 files changed, 73 insertions(+) > > > > diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c > > index 8fdfd91..c41092e 100644 > > --- a/xen/arch/arm/kernel.c > > +++ b/xen/arch/arm/kernel.c > > @@ -496,6 +496,60 @@ err: > > return rc; > > } > > +int kernel_probe_domU(struct kernel_info *info, struct dt_device_node > > *domU) > > +{ > > + struct bootmodule *mod; > > + struct dt_device_node *node; > > + u64 kernel_addr, initrd_addr, size; > > + int rc; > > + > > + dt_for_each_child_node(domU, node) > > + { > > + if ( dt_device_is_compatible(node, "multiboot,domU-kernel") ) > > + { > > + u32 len; > > + const __be32 *val; > > + val = dt_get_property(node, "reg", &len); > > + dt_get_range(&val, node, &kernel_addr, &size); > > + } > > + else if ( dt_device_is_compatible(node, "multiboot,domU-ramdisk") ) > > + { > > + u32 len; > > + const __be32 *val; > > + val = dt_get_property(node, "reg", &len); > > + dt_get_range(&val, node, &initrd_addr, &size); > > + } > > + else > > + continue; > > + } > > + info->kernel_bootmodule = mod = boot_module_find_by_addr_and_kind( > > + > > BOOTMOD_DOMU_KERNEL, kernel_addr); > > This line contains hard tab. This patch was screwed for some reason. I fixed it. > But I don't think this will work as you expect. Imagine the kernel is the same > for each guest. It would be fine to have the Image loaded once in memory and > therefore specify the same physical address for all domU-kernel compatible > node. However, the command line may be different. > > So you would end up to use the wrong module here. Yes, you are right. In order to fix the issue, I had to rework the way boot_modules are done. In the next series, it will be possible to use the same kernel address in multiple modules, and the right cmdline will get retrieved. > > + info->initrd_bootmodule = boot_module_find_by_addr_and_kind( > > + > > BOOTMOD_DOMU_RAMDISK, initrd_addr); > > Same here. > > > + printk("Loading DomU kernel from boot module @ %"PRIpaddr"\n", > > + info->kernel_bootmodule->start); > > The indentation is wrong here. > > > + if ( info->initrd_bootmodule ) > > + printk("Loading ramdisk from boot module @ %"PRIpaddr"\n", > > + info->initrd_bootmodule->start); > > + > > + /* if it is a gzip'ed image, 32bit or 64bit, uncompress it */ > > + rc = kernel_decompress(mod); > > + if (rc < 0 && rc != -EINVAL) > > + return rc; > > + > > +#ifdef CONFIG_ARM_64 > > + rc = kernel_zimage64_probe(info, mod->start, mod->size); > > + if (rc < 0) > > +#endif > > + rc = kernel_uimage_probe(info, mod->start, mod->size); > > + if (rc < 0) > > + rc = kernel_zimage32_probe(info, mod->start, mod->size); > > + if (rc < 0) > > + rc = kernel_elf_probe(info, mod->start, mod->size); > > Most of this code is the same as kernel_probe. How about reworking > kernel_probe to handle any domain? Yes, I can make it common. > > + > > + return rc; > > +} > > + > > int kernel_probe(struct kernel_info *info) > > { > > struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_KERNEL); > > diff --git a/xen/arch/arm/kernel.h b/xen/arch/arm/kernel.h > > index 6d69509..8e1614b 100644 > > --- a/xen/arch/arm/kernel.h > > +++ b/xen/arch/arm/kernel.h > > @@ -64,6 +64,8 @@ struct kernel_info { > > */ > > int kernel_probe(struct kernel_info *info); > > +int kernel_probe_domU(struct kernel_info *info, struct dt_device_node > > *node); > > + > > /* > > * Loads the kernel into guest RAM. > > * > > diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c > > index 82593c8..98bdb24 100644 > > --- a/xen/arch/arm/setup.c > > +++ b/xen/arch/arm/setup.c > > @@ -241,6 +241,21 @@ struct bootmodule * __init > > boot_module_find_by_kind(bootmodule_kind kind) > > 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; > > + 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 86aac0e..903782f 100644 > > --- a/xen/include/asm-arm/setup.h > > +++ b/xen/include/asm-arm/setup.h > > @@ -83,6 +83,8 @@ struct bootmodule *add_boot_module(bootmodule_kind kind, > > paddr_t start, paddr_t size, > > const char *cmdline); > > 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); > > 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 |