|
[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
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |