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

Re: [PATCH v3 6/8] xen/common: dom0less: introduce common kernel.c



On Fri, 2 May 2025, Oleksii Kurochko wrote:
> The following functions don't have arch specific things so it is moved to
> common:
> - kernel_prboe()
> - kernel_load()
> - output_length()
> 
> Functions necessary for dom0less are only moved.
> 
> The following changes are done:
> - Swap __init and return type of kernel_decompress() function to be
>   consistent with defintions of functions in other files. The same
>   for output_length().
> - Wrap by "ifdef CONFIG_ARM" the call of kernel_uimage_probe() in
>   kernel_probe() as uImage isn't really used nowadays thereby leave
>   kernel_uimage_probe() call here just for compatability with Arm code.
> - Introduce kernel_zimage_probe() to cover the case that arch can have
>   different zimage header.
> - Add ASSERT() for kernel_load() to check that it argument isn't NULL.
> - Make kernel_uimage_probe() non-static in Arm's code as it is used in
>   common/kernel.c.
> 
> Introduce CONFIG_DOMAIN_BUILD_HELPERS to not provide stubs for archs
> which don't provide enough functionality to enable it.
> Select CONFIG_DOMAIN_BUILD_HELPERS for CONFIG_ARM as only Arm supports
> it, at the moment.
> 
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>
> ---
> Change in v3:
>  - Empty line after license tag for newly introduced files.
> ---
> Change in v2:
>  - Drop inclusion of asm/kernel.h in kernel.c as everything necessary has
>    been moved to xen/fdt-kernel.h.
> ---
>  xen/arch/arm/Kconfig             |   1 +
>  xen/arch/arm/kernel.c            | 221 +---------------------------
>  xen/common/Kconfig               |   9 +-
>  xen/common/device-tree/Makefile  |   1 +
>  xen/common/device-tree/kernel.c  | 242 +++++++++++++++++++++++++++++++
>  xen/include/asm-generic/kernel.h | 141 ++++++++++++++++++
>  xen/include/xen/fdt-kernel.h     |  13 ++
>  7 files changed, 412 insertions(+), 216 deletions(-)
>  create mode 100644 xen/common/device-tree/kernel.c
>  create mode 100644 xen/include/asm-generic/kernel.h
> 
> diff --git a/xen/arch/arm/Kconfig b/xen/arch/arm/Kconfig
> index d0e0a7753c..3321d89068 100644
> --- a/xen/arch/arm/Kconfig
> +++ b/xen/arch/arm/Kconfig
> @@ -11,6 +11,7 @@ config ARM_64
>  
>  config ARM
>       def_bool y
> +     select DOMAIN_BUILD_HELPERS
>       select FUNCTION_ALIGNMENT_4B
>       select GENERIC_UART_INIT
>       select HAS_ALTERNATIVE if HAS_VMAP
> diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> index 5759a3470a..1168c21e97 100644
> --- a/xen/arch/arm/kernel.c
> +++ b/xen/arch/arm/kernel.c
> @@ -163,105 +163,6 @@ static void __init kernel_zimage_load(struct 
> kernel_info *info)
>      iounmap(kernel);
>  }
>  
> -static __init uint32_t output_length(char *image, unsigned long image_len)
> -{
> -    return *(uint32_t *)&image[image_len - 4];
> -}
> -
> -static __init int kernel_decompress(struct bootmodule *mod, uint32_t offset)
> -{
> -    char *output, *input;
> -    char magic[2];
> -    int rc;
> -    unsigned int kernel_order_out;
> -    paddr_t output_size;
> -    struct page_info *pages;
> -    mfn_t mfn;
> -    int i;
> -    paddr_t addr = mod->start;
> -    paddr_t size = mod->size;
> -
> -    if ( size < offset )
> -        return -EINVAL;
> -
> -    /*
> -     * It might be that gzip header does not appear at the start address
> -     * (e.g. in case of compressed uImage) so take into account offset to
> -     * gzip header.
> -     */
> -    addr += offset;
> -    size -= offset;
> -
> -    if ( size < 2 )
> -        return -EINVAL;
> -
> -    copy_from_paddr(magic, addr, sizeof(magic));
> -
> -    /* only gzip is supported */
> -    if ( !gzip_check(magic, size) )
> -        return -EINVAL;
> -
> -    input = ioremap_cache(addr, size);
> -    if ( input == NULL )
> -        return -EFAULT;
> -
> -    output_size = output_length(input, size);
> -    kernel_order_out = get_order_from_bytes(output_size);
> -    pages = alloc_domheap_pages(NULL, kernel_order_out, 0);
> -    if ( pages == NULL )
> -    {
> -        iounmap(input);
> -        return -ENOMEM;
> -    }
> -    mfn = page_to_mfn(pages);
> -    output = vmap_contig(mfn, 1 << kernel_order_out);
> -
> -    rc = perform_gunzip(output, input, size);
> -    clean_dcache_va_range(output, output_size);
> -    iounmap(input);
> -    vunmap(output);
> -
> -    if ( rc )
> -    {
> -        free_domheap_pages(pages, kernel_order_out);
> -        return rc;
> -    }
> -
> -    mod->start = page_to_maddr(pages);
> -    mod->size = output_size;
> -
> -    /*
> -     * Need to free pages after output_size here because they won't be
> -     * freed by discard_initial_modules
> -     */
> -    i = PFN_UP(output_size);
> -    for ( ; i < (1 << kernel_order_out); i++ )
> -        free_domheap_page(pages + i);
> -
> -    /*
> -     * When using static heap feature, don't give bootmodules memory back to
> -     * the heap allocator
> -     */
> -    if ( using_static_heap )
> -        return 0;
> -
> -    /*
> -     * When freeing the kernel, we need to pass the module start address and
> -     * size as they were before taking an offset to gzip header into account,
> -     * so that the entire region will be freed.
> -     */
> -    addr -= offset;
> -    size += offset;
> -
> -    /*
> -     * Free the original kernel, update the pointers to the
> -     * decompressed kernel
> -     */
> -    fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0);
> -
> -    return 0;
> -}
> -
>  /*
>   * Uimage CPU Architecture Codes
>   */
> @@ -274,8 +175,8 @@ static __init int kernel_decompress(struct bootmodule 
> *mod, uint32_t offset)
>  /*
>   * Check if the image is a uImage and setup kernel_info
>   */
> -static int __init kernel_uimage_probe(struct kernel_info *info,
> -                                      struct bootmodule *mod)
> +int __init kernel_uimage_probe(struct kernel_info *info,
> +                               struct bootmodule *mod)
>  {
>      struct {
>          __be32 magic;   /* Image Header Magic Number */
> @@ -505,130 +406,20 @@ static int __init kernel_zimage32_probe(struct 
> kernel_info *info,
>      return 0;
>  }
>  
> -int __init kernel_probe(struct kernel_info *info,
> -                        const struct dt_device_node *domain)
> +int __init kernel_zimage_probe(struct kernel_info *info, paddr_t addr,
> +                               paddr_t size)
>  {
> -    struct bootmodule *mod = NULL;
> -    struct bootcmdline *cmd = NULL;
> -    struct dt_device_node *node;
> -    u64 kernel_addr, initrd_addr, dtb_addr, size;
>      int rc;
>  
> -    /*
> -     * We need to initialize start to 0. This field may be populated during
> -     * kernel_xxx_probe() if the image has a fixed entry point (for e.g.
> -     * uimage.ep).
> -     * We will use this to determine if the image has a fixed entry point or
> -     * the load address should be used as the start address.
> -     */
> -    info->entry = 0;
> -
> -    /* domain is NULL only for the hardware domain */
> -    if ( domain == NULL )
> -    {
> -        ASSERT(is_hardware_domain(info->d));
> -
> -        mod = boot_module_find_by_kind(BOOTMOD_KERNEL);
> -
> -        info->kernel_bootmodule = mod;
> -        info->initrd_bootmodule = boot_module_find_by_kind(BOOTMOD_RAMDISK);
> -
> -        cmd = boot_cmdline_find_by_kind(BOOTMOD_KERNEL);
> -        if ( cmd )
> -            info->cmdline = &cmd->cmdline[0];
> -    }
> -    else
> -    {
> -        const char *name = NULL;
> -
> -        dt_for_each_child_node(domain, node)
> -        {
> -            if ( dt_device_is_compatible(node, "multiboot,kernel") )
> -            {
> -                u32 len;
> -                const __be32 *val;
> -
> -                val = dt_get_property(node, "reg", &len);
> -                dt_get_range(&val, node, &kernel_addr, &size);
> -                mod = boot_module_find_by_addr_and_kind(
> -                        BOOTMOD_KERNEL, kernel_addr);
> -                info->kernel_bootmodule = mod;
> -            }
> -            else if ( dt_device_is_compatible(node, "multiboot,ramdisk") )
> -            {
> -                u32 len;
> -                const __be32 *val;
> -
> -                val = dt_get_property(node, "reg", &len);
> -                dt_get_range(&val, node, &initrd_addr, &size);
> -                info->initrd_bootmodule = boot_module_find_by_addr_and_kind(
> -                        BOOTMOD_RAMDISK, initrd_addr);
> -            }
> -            else if ( dt_device_is_compatible(node, "multiboot,device-tree") 
> )
> -            {
> -                uint32_t len;
> -                const __be32 *val;
> -
> -                val = dt_get_property(node, "reg", &len);
> -                if ( val == NULL )
> -                    continue;
> -                dt_get_range(&val, node, &dtb_addr, &size);
> -                info->dtb_bootmodule = boot_module_find_by_addr_and_kind(
> -                        BOOTMOD_GUEST_DTB, dtb_addr);
> -            }
> -            else
> -                continue;
> -        }
> -        name = dt_node_name(domain);
> -        cmd = boot_cmdline_find_by_name(name);
> -        if ( cmd )
> -            info->cmdline = &cmd->cmdline[0];
> -    }
> -    if ( !mod || !mod->size )
> -    {
> -        printk(XENLOG_ERR "Missing kernel boot module?\n");
> -        return -ENOENT;
> -    }
> -
> -    printk("Loading %pd kernel from boot module @ %"PRIpaddr"\n",
> -           info->d, info->kernel_bootmodule->start);
> -    if ( info->initrd_bootmodule )
> -        printk("Loading ramdisk from boot module @ %"PRIpaddr"\n",
> -               info->initrd_bootmodule->start);
> -
> -    /*
> -     * uImage header always appears at the top of the image (even 
> compressed),
> -     * so it needs to be probed first. Note that in case of compressed 
> uImage,
> -     * kernel_decompress is called from kernel_uimage_probe making the 
> function
> -     * self-containing (i.e. fall through only in case of a header not 
> found).
> -     */
> -    rc = kernel_uimage_probe(info, mod);
> -    if ( rc != -ENOENT )
> -        return rc;
> -
> -    /*
> -     * If it is a gzip'ed image, 32bit or 64bit, uncompress it.
> -     * At this point, gzip header appears (if at all) at the top of the 
> image,
> -     * so pass 0 as an offset.
> -     */
> -    rc = kernel_decompress(mod, 0);
> -    if ( rc && rc != -EINVAL )
> -        return rc;
> -
>  #ifdef CONFIG_ARM_64
> -    rc = kernel_zimage64_probe(info, mod->start, mod->size);
> +    rc = kernel_zimage64_probe(info, addr, size);
>      if (rc < 0)
>  #endif
> -        rc = kernel_zimage32_probe(info, mod->start, mod->size);
> +        rc = kernel_zimage32_probe(info, addr, size);
>  
>      return rc;
>  }
>  
> -void __init kernel_load(struct kernel_info *info)
> -{
> -    info->load(info);
> -}
> -
>  /*
>   * Local variables:
>   * mode: C
> diff --git a/xen/common/Kconfig b/xen/common/Kconfig
> index be38abf9e1..38981f1d11 100644
> --- a/xen/common/Kconfig
> +++ b/xen/common/Kconfig
> @@ -14,13 +14,20 @@ config CORE_PARKING
>  
>  config DOM0LESS_BOOT
>       bool "Dom0less boot support" if EXPERT
> -     depends on HAS_DOM0LESS
> +     depends on HAS_DOM0LESS && DOMAIN_BUILD_HELPERS
>       default y
>       help
>         Dom0less boot support enables Xen to create and start domU guests 
> during
>         Xen boot without the need of a control domain (Dom0), which could be
>         present anyway.
>  
> +config DOMAIN_BUILD_HELPERS
> +     bool
> +     help
> +       Introduce functions necessary for working with domain creation, 
> kernel,
> +       etc. As an examples, these type of functions are going to be used by
> +       CONFIG_DOM0LESS_BOOT.

NIT: If possible, I would make this option a silent option that cannot
be manually enabled/disabled. As a choice to the user, I think
DOM0LESS_BOOT is sufficient.


>  config GRANT_TABLE
>       bool "Grant table support" if EXPERT
>       default y
> diff --git a/xen/common/device-tree/Makefile b/xen/common/device-tree/Makefile
> index f3dafc9b81..e88a4d5799 100644
> --- a/xen/common/device-tree/Makefile
> +++ b/xen/common/device-tree/Makefile
> @@ -4,3 +4,4 @@ obj-y += device-tree.o
>  obj-$(CONFIG_DOM0LESS_BOOT) += dom0less-build.o
>  obj-$(CONFIG_OVERLAY_DTB) += dt-overlay.o
>  obj-y += intc.o
> +obj-$(CONFIG_DOMAIN_BUILD_HELPERS) += kernel.o
> diff --git a/xen/common/device-tree/kernel.c b/xen/common/device-tree/kernel.c
> new file mode 100644
> index 0000000000..1bf3bbf64e
> --- /dev/null
> +++ b/xen/common/device-tree/kernel.c
> @@ -0,0 +1,242 @@
> +#include <xen/bootfdt.h>
> +#include <xen/device_tree.h>
> +#include <xen/fdt-kernel.h>
> +#include <xen/errno.h>
> +#include <xen/gunzip.h>
> +#include <xen/init.h>
> +#include <xen/lib.h>
> +#include <xen/mm.h>
> +#include <xen/pfn.h>
> +#include <xen/sched.h>
> +#include <xen/types.h>
> +#include <xen/vmap.h>
> +
> +#include <asm/page.h>
> +#include <asm/setup.h>
> +
> +static uint32_t __init output_length(char *image, unsigned long image_len)
> +{
> +    return *(uint32_t *)&image[image_len - 4];
> +}
> +
> +int __init kernel_decompress(struct bootmodule *mod, uint32_t offset)
> +{
> +    char *output, *input;
> +    char magic[2];
> +    int rc;
> +    unsigned int kernel_order_out;
> +    paddr_t output_size;
> +    struct page_info *pages;
> +    mfn_t mfn;
> +    int i;
> +    paddr_t addr = mod->start;
> +    paddr_t size = mod->size;
> +
> +    if ( size < offset )
> +        return -EINVAL;
> +
> +    /*
> +     * It might be that gzip header does not appear at the start address
> +     * (e.g. in case of compressed uImage) so take into account offset to
> +     * gzip header.
> +     */
> +    addr += offset;
> +    size -= offset;
> +
> +    if ( size < 2 )
> +        return -EINVAL;
> +
> +    copy_from_paddr(magic, addr, sizeof(magic));
> +
> +    /* only gzip is supported */
> +    if ( !gzip_check(magic, size) )
> +        return -EINVAL;
> +
> +    input = ioremap_cache(addr, size);
> +    if ( input == NULL )
> +        return -EFAULT;
> +
> +    output_size = output_length(input, size);
> +    kernel_order_out = get_order_from_bytes(output_size);
> +    pages = alloc_domheap_pages(NULL, kernel_order_out, 0);
> +    if ( pages == NULL )
> +    {
> +        iounmap(input);
> +        return -ENOMEM;
> +    }
> +    mfn = page_to_mfn(pages);
> +    output = vmap_contig(mfn, 1 << kernel_order_out);
> +
> +    rc = perform_gunzip(output, input, size);
> +    clean_dcache_va_range(output, output_size);
> +    iounmap(input);
> +    vunmap(output);
> +
> +    if ( rc )
> +    {
> +        free_domheap_pages(pages, kernel_order_out);
> +        return rc;
> +    }
> +
> +    mod->start = page_to_maddr(pages);
> +    mod->size = output_size;
> +
> +    /*
> +     * Need to free pages after output_size here because they won't be
> +     * freed by discard_initial_modules
> +     */
> +    i = PFN_UP(output_size);
> +    for ( ; i < (1 << kernel_order_out); i++ )
> +        free_domheap_page(pages + i);
> +
> +    /*
> +     * When using static heap feature, don't give bootmodules memory back to
> +     * the heap allocator
> +     */
> +    if ( using_static_heap )
> +        return 0;
> +
> +    /*
> +     * When freeing the kernel, we need to pass the module start address and
> +     * size as they were before taking an offset to gzip header into account,
> +     * so that the entire region will be freed.
> +     */
> +    addr -= offset;
> +    size += offset;
> +
> +    /*
> +     * Free the original kernel, update the pointers to the
> +     * decompressed kernel
> +     */
> +    fw_unreserved_regions(addr, addr + size, init_domheap_pages, 0);
> +
> +    return 0;
> +}
> +
> +int __init kernel_probe(struct kernel_info *info,
> +                        const struct dt_device_node *domain)
> +{
> +    struct bootmodule *mod = NULL;
> +    struct bootcmdline *cmd = NULL;
> +    struct dt_device_node *node;
> +    u64 kernel_addr, initrd_addr, dtb_addr, size;
> +    int rc;
> +
> +    /*
> +     * We need to initialize start to 0. This field may be populated during
> +     * kernel_xxx_probe() if the image has a fixed entry point (for e.g.
> +     * uimage.ep).
> +     * We will use this to determine if the image has a fixed entry point or
> +     * the load address should be used as the start address.
> +     */
> +    info->entry = 0;
> +
> +    /* domain is NULL only for the hardware domain */
> +    if ( domain == NULL )
> +    {
> +        ASSERT(is_hardware_domain(info->d));
> +
> +        mod = boot_module_find_by_kind(BOOTMOD_KERNEL);
> +
> +        info->kernel_bootmodule = mod;
> +        info->initrd_bootmodule = boot_module_find_by_kind(BOOTMOD_RAMDISK);
> +
> +        cmd = boot_cmdline_find_by_kind(BOOTMOD_KERNEL);
> +        if ( cmd )
> +            info->cmdline = &cmd->cmdline[0];
> +    }
> +    else
> +    {
> +        const char *name = NULL;
> +
> +        dt_for_each_child_node(domain, node)
> +        {
> +            if ( dt_device_is_compatible(node, "multiboot,kernel") )
> +            {
> +                u32 len;
> +                const __be32 *val;
> +
> +                val = dt_get_property(node, "reg", &len);
> +                dt_get_range(&val, node, &kernel_addr, &size);
> +                mod = boot_module_find_by_addr_and_kind(
> +                        BOOTMOD_KERNEL, kernel_addr);
> +                info->kernel_bootmodule = mod;
> +            }
> +            else if ( dt_device_is_compatible(node, "multiboot,ramdisk") )
> +            {
> +                u32 len;
> +                const __be32 *val;
> +
> +                val = dt_get_property(node, "reg", &len);
> +                dt_get_range(&val, node, &initrd_addr, &size);
> +                info->initrd_bootmodule = boot_module_find_by_addr_and_kind(
> +                        BOOTMOD_RAMDISK, initrd_addr);
> +            }
> +            else if ( dt_device_is_compatible(node, "multiboot,device-tree") 
> )
> +            {
> +                uint32_t len;
> +                const __be32 *val;
> +
> +                val = dt_get_property(node, "reg", &len);
> +                if ( val == NULL )
> +                    continue;
> +                dt_get_range(&val, node, &dtb_addr, &size);
> +                info->dtb_bootmodule = boot_module_find_by_addr_and_kind(
> +                        BOOTMOD_GUEST_DTB, dtb_addr);
> +            }
> +            else
> +                continue;
> +        }
> +        name = dt_node_name(domain);
> +        cmd = boot_cmdline_find_by_name(name);
> +        if ( cmd )
> +            info->cmdline = &cmd->cmdline[0];
> +    }
> +    if ( !mod || !mod->size )
> +    {
> +        printk(XENLOG_ERR "Missing kernel boot module?\n");
> +        return -ENOENT;
> +    }
> +
> +    printk("Loading %pd kernel from boot module @ %"PRIpaddr"\n",
> +           info->d, info->kernel_bootmodule->start);
> +    if ( info->initrd_bootmodule )
> +        printk("Loading ramdisk from boot module @ %"PRIpaddr"\n",
> +               info->initrd_bootmodule->start);
> +
> +    /*
> +     * uImage isn't really used nowadays thereby leave kernel_uimage_probe()
> +     * call here just for compatability with Arm code.
> +     */
> +#ifdef CONFIG_ARM
> +    /*
> +     * uImage header always appears at the top of the image (even 
> compressed),
> +     * so it needs to be probed first. Note that in case of compressed 
> uImage,
> +     * kernel_decompress is called from kernel_uimage_probe making the 
> function
> +     * self-containing (i.e. fall through only in case of a header not 
> found).
> +     */
> +    rc = kernel_uimage_probe(info, mod);
> +    if ( rc != -ENOENT )
> +        return rc;
> +#endif
> +
> +    /*
> +     * If it is a gzip'ed image, 32bit or 64bit, uncompress it.
> +     * At this point, gzip header appears (if at all) at the top of the 
> image,
> +     * so pass 0 as an offset.
> +     */
> +    rc = kernel_decompress(mod, 0);
> +    if ( rc && rc != -EINVAL )
> +        return rc;
> +
> +    rc = kernel_zimage_probe(info, mod->start, mod->size);
> +
> +    return rc;
> +}
> +
> +void __init kernel_load(struct kernel_info *info)
> +{
> +    ASSERT(info && info->load);
> +
> +    info->load(info);
> +}
> diff --git a/xen/include/asm-generic/kernel.h 
> b/xen/include/asm-generic/kernel.h
> new file mode 100644
> index 0000000000..6857fabb34
> --- /dev/null
> +++ b/xen/include/asm-generic/kernel.h

This file seems to be a duplicate of the previously introduced
xen/include/xen/fdt-kernel.h ?

Other than that, I checked the rest of the patch, including all the code
movement, and it looks correct to me.



> @@ -0,0 +1,141 @@
> +/*
> + * Kernel image loading.
> + *
> + * Copyright (C) 2011 Citrix Systems, Inc.
> + */
> +
> +#ifndef __ASM_GENERIC_KERNEL_H__
> +#define __ASM_GENERIC_KERNEL_H__
> +
> +#include <xen/bootfdt.h>
> +#include <xen/device_tree.h>
> +#include <xen/sched.h>
> +#include <xen/types.h>
> +
> +struct kernel_info {
> +    struct domain *d;
> +
> +    void *fdt; /* flat device tree */
> +    paddr_t unassigned_mem; /* RAM not (yet) assigned to a bank */
> +    struct meminfo mem;
> +#ifdef CONFIG_STATIC_SHM
> +    struct shared_meminfo shm_mem;
> +#endif
> +
> +    /* kernel entry point */
> +    paddr_t entry;
> +
> +    /* grant table region */
> +    paddr_t gnttab_start;
> +    paddr_t gnttab_size;
> +
> +    /* boot blob load addresses */
> +    const struct bootmodule *kernel_bootmodule, *initrd_bootmodule, 
> *dtb_bootmodule;
> +    const char* cmdline;
> +    paddr_t dtb_paddr;
> +    paddr_t initrd_paddr;
> +
> +    /* Enable uart emulation */
> +    bool vuart;
> +
> +    /* Enable/Disable PV drivers interfaces */
> +    uint16_t dom0less_feature;
> +
> +    /* Interrupt controller phandle */
> +    uint32_t phandle_intc;
> +
> +    /* loader to use for this kernel */
> +    void (*load)(struct kernel_info *info);
> +
> +    /* loader specific state */
> +    union {
> +        struct {
> +            paddr_t kernel_addr;
> +            paddr_t len;
> +#if defined(CONFIG_ARM_64) || defined(CONFIG_RISCV_64)
> +            paddr_t text_offset; /* 64-bit Image only */
> +#endif
> +            paddr_t start; /* Must be 0 for 64-bit Image */
> +        } zimage;
> +    };
> +
> +    struct arch_kernel_info arch;
> +};
> +
> +static inline struct membanks *kernel_info_get_mem(struct kernel_info *kinfo)
> +{
> +    return container_of(&kinfo->mem.common, struct membanks, common);
> +}
> +
> +static inline const struct membanks *
> +kernel_info_get_mem_const(const struct kernel_info *kinfo)
> +{
> +    return container_of(&kinfo->mem.common, const struct membanks, common);
> +}
> +
> +#ifndef KERNEL_INFO_SHM_MEM_INIT
> +
> +#ifdef CONFIG_STATIC_SHM
> +#define KERNEL_INFO_SHM_MEM_INIT .shm_mem.common.max_banks = NR_SHMEM_BANKS,
> +#else
> +#define KERNEL_INFO_SHM_MEM_INIT
> +#endif
> +
> +#endif /* KERNEL_INFO_SHM_MEM_INIT */
> +
> +#ifndef KERNEL_INFO_INIT
> +
> +#define KERNEL_INFO_INIT                        \
> +{                                               \
> +    .mem.common.max_banks = NR_MEM_BANKS,       \
> +    KERNEL_INFO_SHM_MEM_INIT                    \
> +}
> +
> +#endif /* KERNEL_INFO_INIT */
> +
> +/*
> + * Probe the kernel to detemine its type and select a loader.
> + *
> + * Sets in info:
> + *  ->type
> + *  ->load hook, and sets loader specific variables ->zimage
> + */
> +int kernel_probe(struct kernel_info *info, const struct dt_device_node 
> *domain);
> +
> +/*
> + * Loads the kernel into guest RAM.
> + *
> + * Expects to be set in info when called:
> + *  ->mem
> + *  ->fdt
> + *
> + * Sets in info:
> + *  ->entry
> + *  ->dtb_paddr
> + *  ->initrd_paddr
> + */
> +void kernel_load(struct kernel_info *info);
> +
> +int kernel_decompress(struct bootmodule *mod, uint32_t offset);
> +
> +int kernel_zimage_probe(struct kernel_info *info, paddr_t addr, paddr_t 
> size);
> +
> +/*
> + * uImage isn't really used nowadays thereby leave kernel_uimage_probe()
> + * call here just for compatability with Arm code.
> + */
> +#ifdef CONFIG_ARM
> +struct bootmodule;
> +int kernel_uimage_probe(struct kernel_info *info, struct bootmodule *mod);
> +#endif
> +
> +#endif /*__ASM_GENERIC_KERNEL_H__ */
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff --git a/xen/include/xen/fdt-kernel.h b/xen/include/xen/fdt-kernel.h
> index c81e759423..d85324c867 100644
> --- a/xen/include/xen/fdt-kernel.h
> +++ b/xen/include/xen/fdt-kernel.h
> @@ -121,6 +121,19 @@ int kernel_probe(struct kernel_info *info, const struct 
> dt_device_node *domain);
>   */
>  void kernel_load(struct kernel_info *info);
>  
> +int kernel_decompress(struct bootmodule *mod, uint32_t offset);
> +
> +int kernel_zimage_probe(struct kernel_info *info, paddr_t addr, paddr_t 
> size);
> +
> +/*
> + * uImage isn't really used nowadays thereby leave kernel_uimage_probe()
> + * call here just for compatability with Arm code.
> + */
> +#ifdef CONFIG_ARM
> +struct bootmodule;
> +int kernel_uimage_probe(struct kernel_info *info, struct bootmodule *mod);
> +#endif
> +
>  #endif /* __XEN_FDT_KERNEL_H__ */
>  
>  /*
> -- 
> 2.49.0
> 



 


Rackspace

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