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

Re: [PATCH v3 3/8] asm-generic: move parts of Arm's asm/kernel.h to common code



On Fri, 2 May 2025, Oleksii Kurochko wrote:
> Move the following parts to common with the following changes:
> - struct kernel_info:
>   - Create arch_kernel_info for arch specific kernel information.
>     At the moment, it contains domain_type for Arm.
>   - Rename vpl011 to vuart to have more generic name suitable for other archs.
>   - s/phandle_gic/phandle_intc to have more generic name suitable for other
>     archs.
>   - Make text_offset of zimage structure available for RISCV_64.
> - Wrap by `#ifdef KERNEL_INFO_SHM_MEM_INIT` definition of KERNEL_SHM_MEM_INIT
>   and wrap by `#ifndef KERNEL_INFO_INIT` definition of KERNEL_INFO_INIT to 
> have
>   ability to override KERNEL_INFO_SHM_MEM_INIT for arch in case it doesn't
>   want to use generic one.
> - Move DOM0LESS_* macros to dom0less-build.h.
> - Move all others parts of Arm's kernel.h to xen/fdt-kernel.h.
> 
> Because of the changes in struct kernel_info the correspondent parts of Arm's
> code are updated.
> 
> As part of this patch the following clean up happens:
> - Drop asm/setup.h from asm/kernel.h as nothing depends from it.
>   Add inclusion of asm/setup.h for a code which uses device_tree_get_reg() to
>   avoid compilation issues for CONFIG_STATIC_MEMORY and CONFIG_STATIC_SHM.
> - Drop inclusion of asm/kernel.h everywhere except xen/fdt-kernel.h.
> 
> Signed-off-by: Oleksii Kurochko <oleksii.kurochko@xxxxxxxxx>

Everything looks good except for one question below. This patch looks
like a lot of work, thanks Oleksii!


> ---
> Changes in v3:
>  - Only resolving of merge conflicts.
> ---
> Changes in v2:
>  - Introduce xen/fdt-kernel.h.
>  - Move DOM0LESS_* macros to dom0less-build.h.
>  - Move the rest in asm-generic/kernel.h to xen/fdt-kernel.h.
>  - Drop inclusion of asm/kernel.h everywhere except xen/fdt-kernel.h.
>  - Wrap by #if __has_include(....) the member of kernel_info structure:
>      struct arch_kernel_info arch.
>  - Update the commit message.
> ---
>  xen/arch/arm/acpi/domain_build.c         |   2 +-
>  xen/arch/arm/dom0less-build.c            |  31 +++---
>  xen/arch/arm/domain_build.c              |  12 +-
>  xen/arch/arm/include/asm/domain_build.h  |   2 +-
>  xen/arch/arm/include/asm/kernel.h        | 126 +--------------------
>  xen/arch/arm/include/asm/static-memory.h |   2 +-
>  xen/arch/arm/include/asm/static-shmem.h  |   2 +-
>  xen/arch/arm/kernel.c                    |  12 +-
>  xen/arch/arm/static-memory.c             |   1 +
>  xen/arch/arm/static-shmem.c              |   1 +
>  xen/common/device-tree/dt-overlay.c      |   2 +-
>  xen/include/asm-generic/dom0less-build.h |  28 +++++
>  xen/include/xen/fdt-kernel.h             | 133 +++++++++++++++++++++++
>  13 files changed, 199 insertions(+), 155 deletions(-)
>  create mode 100644 xen/include/xen/fdt-kernel.h
> 
> diff --git a/xen/arch/arm/acpi/domain_build.c 
> b/xen/arch/arm/acpi/domain_build.c
> index 2ce75543d0..f9ca8b47e5 100644
> --- a/xen/arch/arm/acpi/domain_build.c
> +++ b/xen/arch/arm/acpi/domain_build.c
> @@ -10,6 +10,7 @@
>   */
>  
>  #include <xen/compile.h>
> +#include <xen/fdt-kernel.h>
>  #include <xen/mm.h>
>  #include <xen/sched.h>
>  #include <xen/acpi.h>
> @@ -18,7 +19,6 @@
>  #include <xen/device_tree.h>
>  #include <xen/libfdt/libfdt.h>
>  #include <acpi/actables.h>
> -#include <asm/kernel.h>
>  #include <asm/domain_build.h>
>  
>  /* Override macros from asm/page.h to make them work with mfn_t */
> diff --git a/xen/arch/arm/dom0less-build.c b/xen/arch/arm/dom0less-build.c
> index ef49495d4f..c0634dd61e 100644
> --- a/xen/arch/arm/dom0less-build.c
> +++ b/xen/arch/arm/dom0less-build.c
> @@ -1,6 +1,7 @@
>  /* SPDX-License-Identifier: GPL-2.0-only */
>  #include <xen/device_tree.h>
>  #include <xen/domain_page.h>
> +#include <xen/fdt-kernel.h>
>  #include <xen/err.h>
>  #include <xen/event.h>
>  #include <xen/grant_table.h>
> @@ -64,11 +65,11 @@ static int __init make_gicv2_domU_node(struct kernel_info 
> *kinfo)
>      if (res)
>          return res;
>  
> -    res = fdt_property_cell(fdt, "linux,phandle", kinfo->phandle_gic);
> +    res = fdt_property_cell(fdt, "linux,phandle", kinfo->phandle_intc);
>      if (res)
>          return res;
>  
> -    res = fdt_property_cell(fdt, "phandle", kinfo->phandle_gic);
> +    res = fdt_property_cell(fdt, "phandle", kinfo->phandle_intc);
>      if (res)
>          return res;
>  
> @@ -135,11 +136,11 @@ static int __init make_gicv3_domU_node(struct 
> kernel_info *kinfo)
>      if (res)
>          return res;
>  
> -    res = fdt_property_cell(fdt, "linux,phandle", kinfo->phandle_gic);
> +    res = fdt_property_cell(fdt, "linux,phandle", kinfo->phandle_intc);
>      if (res)
>          return res;
>  
> -    res = fdt_property_cell(fdt, "phandle", kinfo->phandle_gic);
> +    res = fdt_property_cell(fdt, "phandle", kinfo->phandle_intc);
>      if (res)
>          return res;
>  
> @@ -200,7 +201,7 @@ static int __init make_vpl011_uart_node(struct 
> kernel_info *kinfo)
>          return res;
>  
>      res = fdt_property_cell(fdt, "interrupt-parent",
> -                            kinfo->phandle_gic);
> +                            kinfo->phandle_intc);
>      if ( res )
>          return res;
>  
> @@ -486,10 +487,10 @@ static int __init domain_handle_dtb_bootmodule(struct 
> domain *d,
>           */
>          if ( dt_node_cmp(name, "gic") == 0 )
>          {
> -            uint32_t phandle_gic = fdt_get_phandle(pfdt, node_next);
> +            uint32_t phandle_intc = fdt_get_phandle(pfdt, node_next);
>  
> -            if ( phandle_gic != 0 )
> -                kinfo->phandle_gic = phandle_gic;
> +            if ( phandle_intc != 0 )
> +                kinfo->phandle_intc = phandle_intc;
>              continue;
>          }
>  
> @@ -532,7 +533,7 @@ static int __init prepare_dtb_domU(struct domain *d, 
> struct kernel_info *kinfo)
>      int addrcells, sizecells;
>      int ret, fdt_size = DOMU_DTB_SIZE;
>  
> -    kinfo->phandle_gic = GUEST_PHANDLE_GIC;
> +    kinfo->phandle_intc = GUEST_PHANDLE_GIC;
>      kinfo->gnttab_start = GUEST_GNTTAB_BASE;
>      kinfo->gnttab_size = GUEST_GNTTAB_SIZE;
>  
> @@ -594,7 +595,7 @@ static int __init prepare_dtb_domU(struct domain *d, 
> struct kernel_info *kinfo)
>      /*
>       * domain_handle_dtb_bootmodule has to be called before the rest of
>       * the device tree is generated because it depends on the value of
> -     * the field phandle_gic.
> +     * the field phandle_intc.
>       */
>      if ( kinfo->dtb_bootmodule )
>      {
> @@ -611,7 +612,7 @@ static int __init prepare_dtb_domU(struct domain *d, 
> struct kernel_info *kinfo)
>      if ( ret )
>          goto err;
>  
> -    if ( kinfo->vpl011 )
> +    if ( kinfo->vuart )
>      {
>          ret = -EINVAL;
>  #ifdef CONFIG_SBSA_VUART_CONSOLE
> @@ -839,8 +840,8 @@ int __init construct_domU(struct domain *d,
>      printk("*** LOADING DOMU cpus=%u memory=%#"PRIx64"KB ***\n",
>             d->max_vcpus, mem);
>  
> -    kinfo.vpl011 = dt_property_read_bool(node, "vpl011");
> -    if ( kinfo.vpl011 && is_hardware_domain(d) )
> +    kinfo.vuart = dt_property_read_bool(node, "vpl011");
> +    if ( kinfo.vuart && is_hardware_domain(d) )
>          panic("hardware domain cannot specify vpl011\n");
>  
>      rc = dt_property_read_string(node, "xen,enhanced", &dom0less_enhanced);
> @@ -872,7 +873,7 @@ int __init construct_domU(struct domain *d,
>  
>  #ifdef CONFIG_ARM_64
>      /* type must be set before allocate memory */
> -    d->arch.type = kinfo.type;
> +    d->arch.type = kinfo.arch.type;
>  #endif
>      if ( is_hardware_domain(d) )
>      {
> @@ -898,7 +899,7 @@ int __init construct_domU(struct domain *d,
>           * tree node in prepare_dtb_domU, so initialization on related 
> variables
>           * shall be done first.
>           */
> -        if ( kinfo.vpl011 )
> +        if ( kinfo.vuart )
>          {
>              rc = domain_vpl011_init(d, NULL);
>              if ( rc < 0 )
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 270a6b97e4..8c7a054718 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -1,6 +1,7 @@
>  /* SPDX-License-Identifier: GPL-2.0-only */
>  #include <xen/init.h>
>  #include <xen/compile.h>
> +#include <xen/fdt-kernel.h>
>  #include <xen/lib.h>
>  #include <xen/llc-coloring.h>
>  #include <xen/mm.h>
> @@ -20,7 +21,6 @@
>  #include <xen/vmap.h>
>  #include <xen/warning.h>
>  #include <asm/device.h>
> -#include <asm/kernel.h>
>  #include <asm/setup.h>
>  #include <asm/tee/tee.h>
>  #include <asm/pci.h>
> @@ -747,7 +747,7 @@ static int __init fdt_property_interrupts(const struct 
> kernel_info *kinfo,
>          return res;
>  
>      res = fdt_property_cell(kinfo->fdt, "interrupt-parent",
> -                            kinfo->phandle_gic);
> +                            kinfo->phandle_intc);
>  
>      return res;
>  }
> @@ -2026,7 +2026,7 @@ static int __init prepare_dtb_hwdom(struct domain *d, 
> struct kernel_info *kinfo)
>  
>      ASSERT(dt_host && (dt_host->sibling == NULL));
>  
> -    kinfo->phandle_gic = dt_interrupt_controller->phandle;
> +    kinfo->phandle_intc = dt_interrupt_controller->phandle;
>      fdt = device_tree_flattened;
>  
>      new_size = fdt_totalsize(fdt) + DOM0_FDT_EXTRA_SIZE;
> @@ -2196,13 +2196,13 @@ int __init construct_domain(struct domain *d, struct 
> kernel_info *kinfo)
>  
>  #ifdef CONFIG_ARM_64
>      /* if aarch32 mode is not supported at EL1 do not allow 32-bit domain */
> -    if ( !(cpu_has_el1_32) && kinfo->type == DOMAIN_32BIT )
> +    if ( !(cpu_has_el1_32) && kinfo->arch.type == DOMAIN_32BIT )
>      {
>          printk("Platform does not support 32-bit domain\n");
>          return -EINVAL;
>      }
>  
> -    if ( is_sve_domain(d) && (kinfo->type == DOMAIN_32BIT) )
> +    if ( is_sve_domain(d) && (kinfo->arch.type == DOMAIN_32BIT) )
>      {
>          printk("SVE is not available for 32-bit domain\n");
>          return -EINVAL;
> @@ -2318,7 +2318,7 @@ int __init construct_hwdom(struct kernel_info *kinfo,
>  
>  #ifdef CONFIG_ARM_64
>      /* type must be set before allocate_memory */
> -    d->arch.type = kinfo->type;
> +    d->arch.type = kinfo->arch.type;
>  #endif
>      find_gnttab_region(d, kinfo);
>      if ( is_domain_direct_mapped(d) )
> diff --git a/xen/arch/arm/include/asm/domain_build.h 
> b/xen/arch/arm/include/asm/domain_build.h
> index 378c10cc98..df1c0fe301 100644
> --- a/xen/arch/arm/include/asm/domain_build.h
> +++ b/xen/arch/arm/include/asm/domain_build.h
> @@ -1,8 +1,8 @@
>  #ifndef __ASM_DOMAIN_BUILD_H__
>  #define __ASM_DOMAIN_BUILD_H__
>  
> +#include <xen/fdt-kernel.h>
>  #include <xen/sched.h>
> -#include <asm/kernel.h>
>  
>  typedef __be32 gic_interrupt_t[3];
>  typedef bool (*alloc_domheap_mem_cb)(struct domain *d, struct page_info *pg,
> diff --git a/xen/arch/arm/include/asm/kernel.h 
> b/xen/arch/arm/include/asm/kernel.h
> index bdc96f4c18..cfeab792c7 100644
> --- a/xen/arch/arm/include/asm/kernel.h
> +++ b/xen/arch/arm/include/asm/kernel.h
> @@ -6,137 +6,15 @@
>  #ifndef __ARCH_ARM_KERNEL_H__
>  #define __ARCH_ARM_KERNEL_H__
>  
> -#include <xen/device_tree.h>
>  #include <asm/domain.h>
> -#include <asm/setup.h>
>  
> -/*
> - * List of possible features for dom0less domUs
> - *
> - * DOM0LESS_ENHANCED_NO_XS:  Notify the OS it is running on top of Xen. All 
> the
> - *                           default features (excluding Xenstore) will be
> - *                           available. Note that an OS *must* not rely on 
> the
> - *                           availability of Xen features if this is not set.
> - * DOM0LESS_XENSTORE:        Xenstore will be enabled for the VM. The
> - *                           xenstore page allocation is done by Xen at
> - *                           domain creation. This feature can't be
> - *                           enabled without the DOM0LESS_ENHANCED_NO_XS.
> - * DOM0LESS_XS_LEGACY        Xenstore will be enabled for the VM, the
> - *                           xenstore page allocation will happen in
> - *                           init-dom0less. This feature can't be enabled
> - *                           without the DOM0LESS_ENHANCED_NO_XS.
> - * DOM0LESS_ENHANCED:        Notify the OS it is running on top of Xen. All 
> the
> - *                           default features (including Xenstore) will be
> - *                           available. Note that an OS *must* not rely on 
> the
> - *                           availability of Xen features if this is not set.
> - * DOM0LESS_ENHANCED_LEGACY: Same as before, but using DOM0LESS_XS_LEGACY.
> - */
> -#define DOM0LESS_ENHANCED_NO_XS  BIT(0, U)
> -#define DOM0LESS_XENSTORE        BIT(1, U)
> -#define DOM0LESS_XS_LEGACY       BIT(2, U)
> -#define DOM0LESS_ENHANCED_LEGACY (DOM0LESS_ENHANCED_NO_XS | 
> DOM0LESS_XS_LEGACY)
> -#define DOM0LESS_ENHANCED        (DOM0LESS_ENHANCED_NO_XS | 
> DOM0LESS_XENSTORE)
> -
> -struct kernel_info {
> +struct arch_kernel_info
> +{
>  #ifdef CONFIG_ARM_64
>      enum domain_type type;
>  #endif
> -
> -    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 pl011 emulation */
> -    bool vpl011;
> -
> -    /* Enable/Disable PV drivers interfaces */
> -    uint16_t dom0less_feature;
> -
> -    /* GIC phandle */
> -    uint32_t phandle_gic;
> -
> -    /* loader to use for this kernel */
> -    void (*load)(struct kernel_info *info);
> -    /* loader specific state */
> -    union {
> -        struct {
> -            paddr_t kernel_addr;
> -            paddr_t len;
> -#ifdef CONFIG_ARM_64
> -            paddr_t text_offset; /* 64-bit Image only */
> -#endif
> -            paddr_t start; /* Must be 0 for 64-bit Image */
> -        } zimage;
> -    };
>  };
>  
> -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);
> -}
> -
> -#ifdef CONFIG_STATIC_SHM
> -#define KERNEL_INFO_SHM_MEM_INIT                \
> -    .shm_mem.common.max_banks = NR_SHMEM_BANKS, \
> -    .shm_mem.common.type = STATIC_SHARED_MEMORY,

This line type = STATIC_SHARED_MEMORY,


> -#else
> -#define KERNEL_INFO_SHM_MEM_INIT
> -#endif
> -
> -#define KERNEL_INFO_INIT                        \
> -{                                               \
> -    .mem.common.max_banks = NR_MEM_BANKS,       \
> -    .mem.common.type = MEMORY,                  \

and also this line type = MEMORY,
...


> -    KERNEL_INFO_SHM_MEM_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);
> -
>  #endif /* #ifdef __ARCH_ARM_KERNEL_H__ */
>  
>  /*
> diff --git a/xen/arch/arm/include/asm/static-memory.h 
> b/xen/arch/arm/include/asm/static-memory.h
> index 804166e541..a32a3c6553 100644
> --- a/xen/arch/arm/include/asm/static-memory.h
> +++ b/xen/arch/arm/include/asm/static-memory.h
> @@ -3,8 +3,8 @@
>  #ifndef __ASM_STATIC_MEMORY_H_
>  #define __ASM_STATIC_MEMORY_H_
>  
> +#include <xen/fdt-kernel.h>
>  #include <xen/pfn.h>
> -#include <asm/kernel.h>
>  
>  #ifdef CONFIG_STATIC_MEMORY
>  
> diff --git a/xen/arch/arm/include/asm/static-shmem.h 
> b/xen/arch/arm/include/asm/static-shmem.h
> index 94eaa9d500..a4f853805a 100644
> --- a/xen/arch/arm/include/asm/static-shmem.h
> +++ b/xen/arch/arm/include/asm/static-shmem.h
> @@ -3,8 +3,8 @@
>  #ifndef __ASM_STATIC_SHMEM_H_
>  #define __ASM_STATIC_SHMEM_H_
>  
> +#include <xen/fdt-kernel.h>
>  #include <xen/types.h>
> -#include <asm/kernel.h>
>  #include <asm/setup.h>
>  
>  #ifdef CONFIG_STATIC_SHM
> diff --git a/xen/arch/arm/kernel.c b/xen/arch/arm/kernel.c
> index 2647812e8e..f00fc388db 100644
> --- a/xen/arch/arm/kernel.c
> +++ b/xen/arch/arm/kernel.c
> @@ -7,6 +7,7 @@
>  #include <xen/byteorder.h>
>  #include <xen/domain_page.h>
>  #include <xen/errno.h>
> +#include <xen/fdt-kernel.h>
>  #include <xen/guest_access.h>
>  #include <xen/gunzip.h>
>  #include <xen/init.h>
> @@ -16,6 +17,7 @@
>  #include <xen/sched.h>
>  #include <xen/vmap.h>
>  
> +#include <asm/domain_build.h>
>  #include <asm/kernel.h>
>  #include <asm/setup.h>
>  
> @@ -101,7 +103,7 @@ static paddr_t __init kernel_zimage_place(struct 
> kernel_info *info)
>      paddr_t load_addr;
>  
>  #ifdef CONFIG_ARM_64
> -    if ( (info->type == DOMAIN_64BIT) && (info->zimage.start == 0) )
> +    if ( (info->arch.type == DOMAIN_64BIT) && (info->zimage.start == 0) )
>          return mem->bank[0].start + info->zimage.text_offset;
>  #endif
>  
> @@ -371,10 +373,10 @@ static int __init kernel_uimage_probe(struct 
> kernel_info *info,
>      switch ( uimage.arch )
>      {
>      case IH_ARCH_ARM:
> -        info->type = DOMAIN_32BIT;
> +        info->arch.type = DOMAIN_32BIT;
>          break;
>      case IH_ARCH_ARM64:
> -        info->type = DOMAIN_64BIT;
> +        info->arch.type = DOMAIN_64BIT;
>          break;
>      default:
>          printk(XENLOG_ERR "Unsupported uImage arch type %d\n", uimage.arch);
> @@ -444,7 +446,7 @@ static int __init kernel_zimage64_probe(struct 
> kernel_info *info,
>  
>      info->load = kernel_zimage_load;
>  
> -    info->type = DOMAIN_64BIT;
> +    info->arch.type = DOMAIN_64BIT;
>  
>      return 0;
>  }
> @@ -496,7 +498,7 @@ static int __init kernel_zimage32_probe(struct 
> kernel_info *info,
>      info->load = kernel_zimage_load;
>  
>  #ifdef CONFIG_ARM_64
> -    info->type = DOMAIN_32BIT;
> +    info->arch.type = DOMAIN_32BIT;
>  #endif
>  
>      return 0;
> diff --git a/xen/arch/arm/static-memory.c b/xen/arch/arm/static-memory.c
> index d4585c5a06..e0f76afcd8 100644
> --- a/xen/arch/arm/static-memory.c
> +++ b/xen/arch/arm/static-memory.c
> @@ -2,6 +2,7 @@
>  
>  #include <xen/sched.h>
>  
> +#include <asm/setup.h>
>  #include <asm/static-memory.h>
>  
>  static bool __init append_static_memory_to_bank(struct domain *d,
> diff --git a/xen/arch/arm/static-shmem.c b/xen/arch/arm/static-shmem.c
> index e8d4ca3ba3..14ae48fb1e 100644
> --- a/xen/arch/arm/static-shmem.c
> +++ b/xen/arch/arm/static-shmem.c
> @@ -6,6 +6,7 @@
>  #include <xen/sched.h>
>  
>  #include <asm/domain_build.h>
> +#include <asm/setup.h>
>  #include <asm/static-memory.h>
>  #include <asm/static-shmem.h>
>  
> diff --git a/xen/common/device-tree/dt-overlay.c 
> b/xen/common/device-tree/dt-overlay.c
> index 97fb99eaaa..81107cb48d 100644
> --- a/xen/common/device-tree/dt-overlay.c
> +++ b/xen/common/device-tree/dt-overlay.c
> @@ -6,8 +6,8 @@
>   * Written by Vikram Garhwal <vikram.garhwal@xxxxxxx>
>   *
>   */
> -#include <asm/domain_build.h>
>  #include <xen/dt-overlay.h>
> +#include <xen/fdt-kernel.h>
>  #include <xen/guest_access.h>
>  #include <xen/iocap.h>
>  #include <xen/libfdt/libfdt.h>
> diff --git a/xen/include/asm-generic/dom0less-build.h 
> b/xen/include/asm-generic/dom0less-build.h
> index 5655571a66..f095135caa 100644
> --- a/xen/include/asm-generic/dom0less-build.h
> +++ b/xen/include/asm-generic/dom0less-build.h
> @@ -16,6 +16,34 @@ struct dt_device_node;
>  #define XENSTORE_PFN_LATE_ALLOC UINT64_MAX
>  extern bool need_xenstore;
>  
> +/*
> + * List of possible features for dom0less domUs
> + *
> + * DOM0LESS_ENHANCED_NO_XS:  Notify the OS it is running on top of Xen. All 
> the
> + *                           default features (excluding Xenstore) will be
> + *                           available. Note that an OS *must* not rely on 
> the
> + *                           availability of Xen features if this is not set.
> + * DOM0LESS_XENSTORE:        Xenstore will be enabled for the VM. The
> + *                           xenstore page allocation is done by Xen at
> + *                           domain creation. This feature can't be
> + *                           enabled without the DOM0LESS_ENHANCED_NO_XS.
> + * DOM0LESS_XS_LEGACY        Xenstore will be enabled for the VM, the
> + *                           xenstore page allocation will happen in
> + *                           init-dom0less. This feature can't be enabled
> + *                           without the DOM0LESS_ENHANCED_NO_XS.
> + * DOM0LESS_ENHANCED:        Notify the OS it is running on top of Xen. All 
> the
> + *                           default features (including Xenstore) will be
> + *                           available. Note that an OS *must* not rely on 
> the
> + *                           availability of Xen features if this is not set.
> + * DOM0LESS_ENHANCED_LEGACY: Same as before, but using DOM0LESS_XS_LEGACY.
> +
> + */
> +#define DOM0LESS_ENHANCED_NO_XS  BIT(0, U)
> +#define DOM0LESS_XENSTORE        BIT(1, U)
> +#define DOM0LESS_XS_LEGACY       BIT(2, U)
> +#define DOM0LESS_ENHANCED_LEGACY (DOM0LESS_ENHANCED_NO_XS | 
> DOM0LESS_XS_LEGACY)
> +#define DOM0LESS_ENHANCED        (DOM0LESS_ENHANCED_NO_XS | 
> DOM0LESS_XENSTORE)
> +
>  void create_domUs(void);
>  bool is_dom0less_mode(void);
>  void set_xs_domain(struct domain *d);
> diff --git a/xen/include/xen/fdt-kernel.h b/xen/include/xen/fdt-kernel.h
> new file mode 100644
> index 0000000000..c81e759423
> --- /dev/null
> +++ b/xen/include/xen/fdt-kernel.h
> @@ -0,0 +1,133 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +/*
> + * For Kernel image loading.
> + *
> + * Copyright (C) 2011 Citrix Systems, Inc.
> + */
> +#ifndef __XEN_FDT_KERNEL_H__
> +#define __XEN_FDT_KERNEL_H__
> +
> +#include <xen/bootfdt.h>
> +#include <xen/device_tree.h>
> +#include <xen/types.h>
> +
> +#if __has_include(<asm/kernel.h>)
> +#   include <asm/kernel.h>
> +#endif
> +
> +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;
> +    };
> +
> +#if __has_include(<asm/kernel.h>)
> +    struct arch_kernel_info arch;
> +#endif
> +};
> +
> +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,

they are missing here...


> +#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,       \

and also here.

Why?


> +    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);
> +
> +#endif /* __XEN_FDT_KERNEL_H__ */
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> -- 
> 2.49.0
> 



 


Rackspace

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