[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 08/10] xen: arm: support bootmodule type detection by ordering



On Mon, 16 Jun 2014, Ian Campbell wrote:
> Assign modules types based on the order in which they are defined in the FDT.
> This is supported only for the dom0 kernel and ramdisk when given as the first
> and second modules respectively, similar to how
> http://wiki.xen.org/wiki?title=Xen_ARM_with_Virtualization_Extensions/Multiboot&oldid=11824
> defined the default types from the bootloader side.
> 
> This is compatible with how Xen interprets the modules with x86 multiboot and 
> I
> think simplifies things for bootloaders which now need not contain similar
> guessing code if they only care about the most basic case.
> 
> Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
> ---
>  xen/arch/arm/bootfdt.c      |   10 +++++++---
>  xen/arch/arm/setup.c        |   14 ++++++++++++++
>  xen/include/asm-arm/setup.h |   11 ++++++++++-
>  3 files changed, 31 insertions(+), 4 deletions(-)
> 
> diff --git a/xen/arch/arm/bootfdt.c b/xen/arch/arm/bootfdt.c
> index e983aa7..a80055c 100644
> --- a/xen/arch/arm/bootfdt.c
> +++ b/xen/arch/arm/bootfdt.c
> @@ -163,6 +163,7 @@ static void __init process_multiboot_node(const void 
> *fdt, int node,
>                                            const char *name,
>                                            u32 address_cells, u32 size_cells)
>  {
> +    static bootmodulekind kind_guess = BOOTMOD_LAST_PRESERVE + 1;

kind_guess = BOOTMOD_KERNEL would be clearer


>      const struct fdt_property *prop;
>      const __be32 *cell;
>      bootmodulekind kind;
> @@ -178,8 +179,10 @@ static void __init process_multiboot_node(const void 
> *fdt, int node,
>          kind = BOOTMOD_RAMDISK;
>      else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 )
>          kind = BOOTMOD_XSM;
> +    else if ( kind_guess < BOOTMOD_UNKNOWN )
> +        kind = kind_guess++;

This would allow for BOOTMOD_XSM to be specified this way. Do we want
that? If so, we should write to the commit message and to the wiki.
Otherwise I would prefer:

else if ( kind_guess == BOOTMOD_KERNEL || kind_guess == BOOTMOD_RAMDISK )
{
    kind = kind_guess;
    kind_guess++;
}


>      else
> -        panic("%s not a known xen multiboot type\n", name);
> +        kind = BOOTMOD_UNKNOWN;
>  
>      prop = fdt_get_property(fdt, node, "reg", &len);
>      if ( !prop )
> @@ -278,11 +281,12 @@ static void __init early_print_info(void)
>                       mi->bank[i].start,
>                       mi->bank[i].start + mi->bank[i].size - 1);
>      printk("\n");
> -    for ( i = 1 ; i < mods->nr_mods; i++ )
> -        printk("MODULE[%d]: %"PRIpaddr" - %"PRIpaddr" %s\n",
> +    for ( i = 0 ; i < mods->nr_mods; i++ )
> +        printk("MODULE[%d]: %"PRIpaddr" - %"PRIpaddr" %-8s %s\n",
>                       i,
>                       mods->module[i].start,
>                       mods->module[i].start + mods->module[i].size,
> +                     boot_module_kind_as_string(mods->module[i].kind),
>                       mods->module[i].cmdline);
>      nr_rsvd = fdt_num_mem_rsv(device_tree_flattened);
>      for ( i = 0; i < nr_rsvd; i++ )
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 4c9dd3d..d358d04 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -221,6 +221,20 @@ struct bootmodule * __init 
> boot_module_find_by_kind(bootmodulekind kind)
>      return NULL;
>  }
>  
> +const char * __init boot_module_kind_as_string(bootmodulekind kind)
> +{
> +    switch ( kind )
> +    {
> +    case BOOTMOD_XEN:     return "Xen";
> +    case BOOTMOD_FDT:     return "FDT";
> +    case BOOTMOD_KERNEL:  return "Kernel";
> +    case BOOTMOD_RAMDISK: return "Ramdisk";
> +    case BOOTMOD_XSM:     return "XSM";
> +    case BOOTMOD_UNKNOWN: return "Unknown";
> +    default: BUG();
> +    }
> +}
> +
>  void __init discard_initial_modules(void)
>  {
>      struct bootmodules *mi = &bootinfo.modules;
> diff --git a/xen/include/asm-arm/setup.h b/xen/include/asm-arm/setup.h
> index 57c98cb..f1a27fb 100644
> --- a/xen/include/asm-arm/setup.h
> +++ b/xen/include/asm-arm/setup.h
> @@ -10,12 +10,20 @@
>  typedef enum {
>      BOOTMOD_XEN,
>      BOOTMOD_FDT,
> +
>      /* Everything up to here is not freed after start of day */
>      BOOTMOD_LAST_PRESERVE = BOOTMOD_FDT,
> +
> +    /*
> +     * Default module types. For modules which are not given an
> +     * explict type these are automatically used, in this order.
> +     */
>      BOOTMOD_KERNEL,
>      BOOTMOD_RAMDISK,
> +    BOOTMOD_UNKNOWN,
> +
> +    /* The remaining module types are never automatically assigned. */
>      BOOTMOD_XSM,
> -    BOOTMOD_UNKNOWN
>  }  bootmodulekind;
>  
>  
> @@ -66,6 +74,7 @@ const char __init *boot_fdt_cmdline(const void *fdt);
>  void add_boot_module(bootmodulekind kind, paddr_t start, paddr_t size,
>                       const char *cmdline);
>  struct bootmodule *boot_module_find_by_kind(bootmodulekind kind);
> +const char * __init boot_module_kind_as_string(bootmodulekind kind);
>  
>  #endif
>  /*
> -- 
> 1.7.10.4
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.