|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 10/19] x86: Replace boot_module with bootmodule
On Fri, 30 May 2025, Alejandro Vallejo wrote:
> These types resemble each other very closely in layout and intent, and
> with "struct bootmodule" already in common code it makes perfect sense
> to merge them. In order to do so, add an arch-specific area for
> x86-specific tidbits.
>
> Signed-off-by: Alejandro Vallejo <agarciav@xxxxxxx>
> ---
> xen/arch/x86/cpu/microcode/core.c | 9 ++--
> xen/arch/x86/hvm/dom0_build.c | 10 ++---
> xen/arch/x86/include/asm/boot-domain.h | 4 +-
> xen/arch/x86/include/asm/bootfdt.h | 52 +++++++++++++++++++++++
> xen/arch/x86/include/asm/bootinfo.h | 58 +++-----------------------
> xen/arch/x86/include/asm/setup.h | 6 +--
> xen/arch/x86/pv/dom0_build.c | 8 ++--
> xen/arch/x86/setup.c | 52 ++++++++++++-----------
> xen/include/xen/bootfdt.h | 9 ++++
> xen/xsm/xsm_policy.c | 4 +-
> 10 files changed, 113 insertions(+), 99 deletions(-)
> create mode 100644 xen/arch/x86/include/asm/bootfdt.h
>
> diff --git a/xen/arch/x86/cpu/microcode/core.c
> b/xen/arch/x86/cpu/microcode/core.c
> index 34a94cd25b..0111ef9156 100644
> --- a/xen/arch/x86/cpu/microcode/core.c
> +++ b/xen/arch/x86/cpu/microcode/core.c
> @@ -760,12 +760,11 @@ static int __init early_microcode_load(struct boot_info
> *bi)
> {
> for ( idx = 0; idx < bi->nr_modules; ++idx )
> {
> - const struct boot_module *bm = &bi->mods[idx];
> + const struct bootmodule *bm = &bi->mods[idx];
> struct cpio_data cd;
>
> /* Search anything unclaimed or likely to be a CPIO archive. */
> - if ( bm->type != BOOTMOD_UNKNOWN &&
> - bm->type != BOOTMOD_RAMDISK )
> + if ( bm->kind != BOOTMOD_UNKNOWN && bm->kind != BOOTMOD_RAMDISK )
> continue;
>
> size = bm->size;
> @@ -815,12 +814,12 @@ static int __init early_microcode_load(struct boot_info
> *bi)
> return -ENODEV;
> }
>
> - if ( bi->mods[idx].type != BOOTMOD_UNKNOWN )
> + if ( bi->mods[idx].kind != BOOTMOD_UNKNOWN )
> {
> printk(XENLOG_WARNING "Microcode: Chosen module %d already
> used\n", idx);
> return -ENODEV;
> }
> - bi->mods[idx].type = BOOTMOD_MICROCODE;
> + bi->mods[idx].kind = BOOTMOD_MICROCODE;
>
> size = bi->mods[idx].size;
> data = bootstrap_map_bm(&bi->mods[idx]);
> diff --git a/xen/arch/x86/hvm/dom0_build.c b/xen/arch/x86/hvm/dom0_build.c
> index a038e58c11..96410344a8 100644
> --- a/xen/arch/x86/hvm/dom0_build.c
> +++ b/xen/arch/x86/hvm/dom0_build.c
> @@ -647,10 +647,10 @@ static int __init pvh_load_kernel(
> const struct boot_domain *bd, paddr_t *entry, paddr_t *start_info_addr)
> {
> struct domain *d = bd->d;
> - struct boot_module *image = bd->kernel;
> - struct boot_module *initrd = bd->module;
> + struct bootmodule *image = bd->kernel;
> + struct bootmodule *initrd = bd->module;
> void *image_base = bootstrap_map_bm(image);
> - void *image_start = image_base + image->headroom;
> + void *image_start = image_base + image->arch.headroom;
> unsigned long image_len = image->size;
> unsigned long initrd_len = initrd ? initrd->size : 0;
> size_t cmdline_len = bd->cmdline ? strlen(bd->cmdline) + 1 : 0;
> @@ -721,9 +721,9 @@ static int __init pvh_load_kernel(
> {
> size_t initrd_space = elf_round_up(&elf, initrd_len);
>
> - if ( initrd->cmdline_pa )
> + if ( initrd->arch.cmdline_pa )
> {
> - initrd_cmdline = __va(initrd->cmdline_pa);
> + initrd_cmdline = __va(initrd->arch.cmdline_pa);
> if ( !*initrd_cmdline )
> initrd_cmdline = NULL;
> }
> diff --git a/xen/arch/x86/include/asm/boot-domain.h
> b/xen/arch/x86/include/asm/boot-domain.h
> index d7c6042e25..242e9c9c2b 100644
> --- a/xen/arch/x86/include/asm/boot-domain.h
> +++ b/xen/arch/x86/include/asm/boot-domain.h
> @@ -13,8 +13,8 @@
> struct boot_domain {
> domid_t domid;
>
> - struct boot_module *kernel;
> - struct boot_module *module;
> + struct bootmodule *kernel;
> + struct bootmodule *module;
> const char *cmdline;
>
> struct domain *d;
> diff --git a/xen/arch/x86/include/asm/bootfdt.h
> b/xen/arch/x86/include/asm/bootfdt.h
> new file mode 100644
> index 0000000000..c00de8c09b
> --- /dev/null
> +++ b/xen/arch/x86/include/asm/bootfdt.h
> @@ -0,0 +1,52 @@
> +/* SPDX-License-Identifier: GPL-2.0-only */
> +#ifndef __ARCH_X86_BOOTFDT_H__
> +#define __ARCH_X86_BOOTFDT_H__
With the new convention this is just X86_BOOTFDT_H
> +#include <xen/types.h>
> +
> +struct arch_bootmodule
> +{
> + /*
> + * Module State Flags:
> + * relocated: indicates module has been relocated in memory.
> + * released: indicates module's pages have been freed.
> + * fdt_cmdline: indicates module's cmdline is in the FDT.
> + */
> + bool relocated:1;
> + bool released:1;
> + bool fdt_cmdline:1;
This is not actually used or needed in this patch?
> + /*
> + * A boot module may need decompressing by Xen. Headroom is an estimate
> of
> + * the additional space required to decompress the module.
> + *
> + * Headroom is accounted for at the start of the module. Decompressing
> is
> + * done in-place with input=start, output=start-headroom, expecting the
> + * pointers to become equal (give or take some rounding) when
> decompression
> + * is complete.
> + *
> + * Memory layout at boot:
> + *
> + * start ----+
> + * v
> + * |<-----headroom------>|<------size------->|
> + * +-------------------+
> + * | Compressed Module |
> + * +---------------------+-------------------+
> + * | Decompressed Module |
> + * +-----------------------------------------+
> + */
> + unsigned long headroom;
> + paddr_t cmdline_pa;
> +};
> +
> +#endif /* __ARCH_X86_BOOTFDT_H__ */
> +
> +/*
> + * Local variables:
> + * mode: C
> + * c-file-style: "BSD"
> + * c-basic-offset: 4
> + * indent-tabs-mode: nil
> + * End:
> + */
> diff --git a/xen/arch/x86/include/asm/bootinfo.h
> b/xen/arch/x86/include/asm/bootinfo.h
> index 3afc214c17..f3210b7d6a 100644
> --- a/xen/arch/x86/include/asm/bootinfo.h
> +++ b/xen/arch/x86/include/asm/bootinfo.h
> @@ -8,6 +8,7 @@
> #ifndef X86_BOOTINFO_H
> #define X86_BOOTINFO_H
>
> +#include <xen/bootfdt.h>
> #include <xen/init.h>
> #include <xen/multiboot.h>
> #include <xen/types.h>
> @@ -19,55 +20,6 @@
> /* Max number of boot domains that Xen can construct */
> #define MAX_NR_BOOTDOMS 1
>
> -/* Boot module binary type / purpose */
> -enum bootmod_type {
> - BOOTMOD_UNKNOWN,
> - BOOTMOD_XEN,
> - BOOTMOD_KERNEL,
> - BOOTMOD_RAMDISK,
> - BOOTMOD_MICROCODE,
> - BOOTMOD_XSM_POLICY,
> -};
> -
> -struct boot_module {
> - enum bootmod_type type;
> -
> - /*
> - * Module State Flags:
> - * relocated: indicates module has been relocated in memory.
> - * released: indicates module's pages have been freed.
> - */
> - bool relocated:1;
> - bool released:1;
> -
> - /*
> - * A boot module may need decompressing by Xen. Headroom is an estimate
> of
> - * the additional space required to decompress the module.
> - *
> - * Headroom is accounted for at the start of the module. Decompressing
> is
> - * done in-place with input=start, output=start-headroom, expecting the
> - * pointers to become equal (give or take some rounding) when
> decompression
> - * is complete.
> - *
> - * Memory layout at boot:
> - *
> - * start ----+
> - * v
> - * |<-----headroom------>|<------size------->|
> - * +-------------------+
> - * | Compressed Module |
> - * +---------------------+-------------------+
> - * | Decompressed Module |
> - * +-----------------------------------------+
> - */
> - unsigned long headroom;
> -
> - paddr_t cmdline_pa;
> -
> - paddr_t start;
> - size_t size;
> -};
> -
> /*
> * Xen internal representation of information provided by the
> * bootloader/environment, or derived from the information.
> @@ -81,7 +33,7 @@ struct boot_info {
> size_t memmap_length;
>
> unsigned int nr_modules;
> - struct boot_module mods[MAX_NR_BOOTMODS + 1];
> + struct bootmodule mods[MAX_NR_BOOTMODS + 1];
> struct boot_domain domains[MAX_NR_BOOTDOMS];
> };
>
> @@ -94,16 +46,16 @@ struct boot_info {
> * Failure - a value greater than MAX_NR_BOOTMODS
> */
> static inline unsigned int __init next_boot_module_index(
> - const struct boot_info *bi, enum bootmod_type t, unsigned int start)
> + const struct boot_info *bi, bootmodule_kind k, unsigned int start)
> {
> unsigned int i;
>
> - if ( t == BOOTMOD_XEN )
> + if ( k == BOOTMOD_XEN )
> return bi->nr_modules;
>
> for ( i = start; i < bi->nr_modules; i++ )
> {
> - if ( bi->mods[i].type == t )
> + if ( bi->mods[i].kind == k )
> return i;
> }
>
> diff --git a/xen/arch/x86/include/asm/setup.h
> b/xen/arch/x86/include/asm/setup.h
> index ac34c69855..c7deaba109 100644
> --- a/xen/arch/x86/include/asm/setup.h
> +++ b/xen/arch/x86/include/asm/setup.h
> @@ -36,11 +36,11 @@ extern struct boot_info xen_boot_info;
> unsigned long initial_images_nrpages(nodeid_t node);
> void free_boot_modules(void);
>
> -struct boot_module;
> -void *bootstrap_map_bm(const struct boot_module *bm);
> +struct bootmodule;
> +void *bootstrap_map_bm(const struct bootmodule *bm);
> void bootstrap_unmap(void);
>
> -void release_boot_module(struct boot_module *bm);
> +void release_boot_module(struct bootmodule *bm);
>
> struct rangeset;
> int remove_xen_ranges(struct rangeset *r);
> diff --git a/xen/arch/x86/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
> index e1b78d47c2..e6c77413f5 100644
> --- a/xen/arch/x86/pv/dom0_build.c
> +++ b/xen/arch/x86/pv/dom0_build.c
> @@ -374,8 +374,8 @@ static int __init dom0_construct(const struct boot_domain
> *bd)
> struct domain *d = bd->d;
> struct vcpu *v = d->vcpu[0];
>
> - struct boot_module *image = bd->kernel;
> - struct boot_module *initrd = bd->module;
> + struct bootmodule *image = bd->kernel;
> + struct bootmodule *initrd = bd->module;
> void *image_base;
> unsigned long image_len;
> void *image_start;
> @@ -422,7 +422,7 @@ static int __init dom0_construct(const struct boot_domain
> *bd)
>
> image_base = bootstrap_map_bm(image);
> image_len = image->size;
> - image_start = image_base + image->headroom;
> + image_start = image_base + image->arch.headroom;
>
> d->max_pages = ~0U;
>
> @@ -659,7 +659,7 @@ static int __init dom0_construct(const struct boot_domain
> *bd)
> * pages. Tell the boot_module handling that we've freed it, so
> the
> * memory is left alone.
> */
> - initrd->released = true;
> + initrd->arch.released = true;
> }
>
> iommu_memory_setup(d, "initrd", mfn_to_page(_mfn(initrd_mfn)),
> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> index 5da9df33c9..a6b3dbfc8c 100644
> --- a/xen/arch/x86/setup.c
> +++ b/xen/arch/x86/setup.c
> @@ -298,7 +298,7 @@ struct boot_info __initdata xen_boot_info = {
> .loader = "unknown",
> .cmdline = "",
> .domains = { [0 ... MAX_NR_BOOTDOMS - 1] = { .domid = DOMID_INVALID } },
> - .mods = { [0 ... MAX_NR_BOOTMODS] = { .type = BOOTMOD_UNKNOWN } },
> + .mods = { [0 ... MAX_NR_BOOTMODS] = { .kind = BOOTMOD_UNKNOWN } },
> };
>
> static struct boot_info *__init multiboot_fill_boot_info(
> @@ -333,7 +333,7 @@ static struct boot_info *__init multiboot_fill_boot_info(
> */
> for ( i = 0; i < MAX_NR_BOOTMODS && i < bi->nr_modules; i++ )
> {
> - bi->mods[i].cmdline_pa = mods[i].string;
> + bi->mods[i].arch.cmdline_pa = mods[i].string;
>
> if ( efi_enabled(EFI_LOADER) )
> {
> @@ -356,7 +356,7 @@ static struct boot_info *__init multiboot_fill_boot_info(
> }
>
> /* Variable 'i' should be one entry past the last module. */
> - bi->mods[i].type = BOOTMOD_XEN;
> + bi->mods[i].kind = BOOTMOD_XEN;
>
> return bi;
> }
> @@ -381,13 +381,13 @@ unsigned long __init initial_images_nrpages(nodeid_t
> node)
> return nr;
> }
>
> -void __init release_boot_module(struct boot_module *bm)
> +void __init release_boot_module(struct bootmodule *bm)
> {
> - ASSERT(!bm->released);
> + ASSERT(!bm->arch.released);
>
> init_domheap_pages(bm->start, bm->start + PAGE_ALIGN(bm->size));
>
> - bm->released = true;
> + bm->arch.released = true;
> }
>
> void __init free_boot_modules(void)
> @@ -397,7 +397,7 @@ void __init free_boot_modules(void)
>
> for ( i = 0; i < bi->nr_modules; ++i )
> {
> - if ( bi->mods[i].released )
> + if ( bi->mods[i].arch.released )
> continue;
>
> release_boot_module(&bi->mods[i]);
> @@ -519,7 +519,7 @@ static void *__init bootstrap_map_addr(paddr_t start,
> paddr_t end)
> return ret;
> }
>
> -void *__init bootstrap_map_bm(const struct boot_module *bm)
> +void *__init bootstrap_map_bm(const struct bootmodule *bm)
> {
> return bootstrap_map_addr(bm->start, bm->start + bm->size);
> }
> @@ -689,7 +689,7 @@ static void __init noinline move_xen(void)
> #undef BOOTSTRAP_MAP_LIMIT
>
> static uint64_t __init consider_modules(
> - uint64_t s, uint64_t e, uint32_t size, const struct boot_module *mods,
> + uint64_t s, uint64_t e, uint32_t size, const struct bootmodule mods[],
> unsigned int nr_mods, unsigned int this_mod)
> {
> unsigned int i;
> @@ -985,8 +985,9 @@ static size_t __init domain_cmdline_size(const struct
> boot_info *bi,
> const struct boot_domain *bd)
> {
> size_t s = bi->kextra ? strlen(bi->kextra) : 0;
> + const struct arch_bootmodule *abm = &bd->kernel->arch;
>
> - s += bd->kernel->cmdline_pa ? strlen(__va(bd->kernel->cmdline_pa)) : 0;
> + s += abm->cmdline_pa ? strlen(__va(abm->cmdline_pa)) : 0;
>
> if ( s == 0 )
> return s;
> @@ -1050,9 +1051,10 @@ static struct domain *__init create_dom0(struct
> boot_info *bi)
> if ( !(cmdline = xzalloc_array(char, cmdline_size)) )
> panic("Error allocating cmdline buffer for %pd\n", d);
>
> - if ( bd->kernel->cmdline_pa )
> + if ( bd->kernel->arch.cmdline_pa )
> strlcpy(cmdline,
> - cmdline_cook(__va(bd->kernel->cmdline_pa), bi->loader),
> + cmdline_cook(__va(bd->kernel->arch.cmdline_pa),
> + bi->loader),
> cmdline_size);
>
> if ( bi->kextra )
> @@ -1074,7 +1076,7 @@ static struct domain *__init create_dom0(struct
> boot_info *bi)
> strlcat(cmdline, " acpi=", cmdline_size);
> strlcat(cmdline, acpi_param, cmdline_size);
> }
> - bd->kernel->cmdline_pa = 0;
> + bd->kernel->arch.cmdline_pa = 0;
> bd->cmdline = cmdline;
> }
>
> @@ -1287,7 +1289,7 @@ void asmlinkage __init noreturn __start_xen(void)
> }
>
> /* Dom0 kernel is always first */
> - bi->mods[0].type = BOOTMOD_KERNEL;
> + bi->mods[0].kind = BOOTMOD_KERNEL;
> bi->domains[0].kernel = &bi->mods[0];
>
> if ( pvh_boot )
> @@ -1458,7 +1460,7 @@ void asmlinkage __init noreturn __start_xen(void)
>
> if ( xen_phys_start )
> {
> - struct boot_module *xen = &bi->mods[bi->nr_modules];
> + struct bootmodule *xen = &bi->mods[bi->nr_modules];
>
> relocated = true;
>
> @@ -1471,7 +1473,7 @@ void asmlinkage __init noreturn __start_xen(void)
> xen->size = __2M_rwdata_end - _stext;
> }
>
> - bi->mods[0].headroom =
> + bi->mods[0].arch.headroom =
> bzimage_headroom(bootstrap_map_bm(&bi->mods[0]), bi->mods[0].size);
> bootstrap_unmap();
>
> @@ -1552,10 +1554,10 @@ void asmlinkage __init noreturn __start_xen(void)
> /* Is the region suitable for relocating the multiboot modules? */
> for ( j = bi->nr_modules - 1; j >= 0; j-- )
> {
> - struct boot_module *bm = &bi->mods[j];
> - unsigned long size = PAGE_ALIGN(bm->headroom + bm->size);
> + struct bootmodule *bm = &bi->mods[j];
> + unsigned long size = PAGE_ALIGN(bm->arch.headroom + bm->size);
>
> - if ( bm->relocated )
> + if ( bm->arch.relocated )
> continue;
>
> /* Don't overlap with other modules (or Xen itself). */
> @@ -1565,12 +1567,12 @@ void asmlinkage __init noreturn __start_xen(void)
> if ( highmem_start && end > highmem_start )
> continue;
>
> - if ( s < end && (bm->headroom || (end - size) > bm->start) )
> + if ( s < end && (bm->arch.headroom || (end - size) > bm->start) )
> {
> - move_memory(end - size + bm->headroom, bm->start, bm->size);
> + move_memory(end - size + bm->arch.headroom, bm->start,
> bm->size);
> bm->start = (end - size);
> - bm->size += bm->headroom;
> - bm->relocated = true;
> + bm->size += bm->arch.headroom;
> + bm->arch.relocated = true;
> }
> }
>
> @@ -1596,7 +1598,7 @@ void asmlinkage __init noreturn __start_xen(void)
> #endif
> }
>
> - if ( bi->mods[0].headroom && !bi->mods[0].relocated )
> + if ( bi->mods[0].arch.headroom && !bi->mods[0].arch.relocated )
> panic("Not enough memory to relocate the dom0 kernel image\n");
> for ( i = 0; i < bi->nr_modules; ++i )
> {
> @@ -2154,7 +2156,7 @@ void asmlinkage __init noreturn __start_xen(void)
> initrdidx = first_boot_module_index(bi, BOOTMOD_UNKNOWN);
> if ( initrdidx < MAX_NR_BOOTMODS )
> {
> - bi->mods[initrdidx].type = BOOTMOD_RAMDISK;
> + bi->mods[initrdidx].kind = BOOTMOD_RAMDISK;
> bi->domains[0].module = &bi->mods[initrdidx];
> if ( first_boot_module_index(bi, BOOTMOD_UNKNOWN) < MAX_NR_BOOTMODS )
> printk(XENLOG_WARNING
> diff --git a/xen/include/xen/bootfdt.h b/xen/include/xen/bootfdt.h
> index d503d1bd4b..fa65e8fcf4 100644
> --- a/xen/include/xen/bootfdt.h
> +++ b/xen/include/xen/bootfdt.h
> @@ -7,6 +7,10 @@
> #include <xen/macros.h>
> #include <xen/xmalloc.h>
>
> +#if __has_include(<asm/bootfdt.h>)
> +#include <asm/bootfdt.h>
> +#endif
> +
> #define MIN_FDT_ALIGN 8
>
> #define NR_MEM_BANKS 256
> @@ -106,8 +110,13 @@ struct shared_meminfo {
> struct bootmodule {
> bootmodule_kind kind;
> bool domU;
> +
> paddr_t start;
> paddr_t size;
> +
> +#if __has_include(<asm/bootfdt.h>)
> + struct arch_bootmodule arch;
> +#endif
> };
>
> /* DT_MAX_NAME is the node name max length according the DT spec */
> diff --git a/xen/xsm/xsm_policy.c b/xen/xsm/xsm_policy.c
> index 7f70d860bd..0c2cdea8ed 100644
> --- a/xen/xsm/xsm_policy.c
> +++ b/xen/xsm/xsm_policy.c
> @@ -40,7 +40,7 @@ int __init xsm_multiboot_policy_init(
>
> for_each_boot_module_by_type ( i, bi, BOOTMOD_UNKNOWN )
> {
> - struct boot_module *bm = &bi->mods[i];
> + struct bootmodule *bm = &bi->mods[i];
>
> _policy_start = bootstrap_map_bm(bm);
> _policy_len = bm->size;
> @@ -53,7 +53,7 @@ int __init xsm_multiboot_policy_init(
> printk("Policy len %#lx, start at %p.\n",
> _policy_len,_policy_start);
>
> - bm->type = BOOTMOD_XSM_POLICY;
> + bm->kind = BOOTMOD_XSM;
> break;
>
> }
> --
> 2.43.0
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |