On Tue Jul 22, 2025 at 12:27 AM CEST, Daniel P. Smith wrote:
> On 7/15/25 12:10, Alejandro Vallejo wrote:
>> These types resemble each other very closely in layout and intent,
>> and with "struct boot_module" already in common code it makes perfect
>> sense to merge them. In order to do so, rename identical fields with
>> conflicting names.
>> 
>> No functional change intended.
>> 
>> Signed-off-by: Alejandro Vallejo <alejandro.garciavall...@amd.com>
>> Reviewed-by: Stefano Stabellini <sstabell...@kernel.org>
>> Acked-by: Jan Beulich <jbeul...@suse.com>
>> ---
>>   xen/arch/x86/cpu/microcode/core.c   |  7 ++--
>>   xen/arch/x86/hvm/dom0_build.c       |  6 ++--
>>   xen/arch/x86/include/asm/bootfdt.h  | 50 ++++++++++++++++++++++++++
>>   xen/arch/x86/include/asm/bootinfo.h | 56 +++--------------------------
>>   xen/arch/x86/pv/dom0_build.c        |  4 +--
>>   xen/arch/x86/setup.c                | 43 +++++++++++-----------
>>   xen/include/xen/bootfdt.h           |  8 +++++
>>   xen/xsm/xsm_policy.c                |  2 +-
>>   8 files changed, 93 insertions(+), 83 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..816e9bfe40 100644
>> --- a/xen/arch/x86/cpu/microcode/core.c
>> +++ b/xen/arch/x86/cpu/microcode/core.c
>> @@ -764,8 +764,7 @@ static int __init early_microcode_load(struct boot_info 
>> *bi)
>>               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..2bb8ef355c 100644
>> --- a/xen/arch/x86/hvm/dom0_build.c
>> +++ b/xen/arch/x86/hvm/dom0_build.c
>> @@ -650,7 +650,7 @@ static int __init pvh_load_kernel(
>>       struct boot_module *image = bd->kernel;
>>       struct boot_module *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/bootfdt.h 
>> b/xen/arch/x86/include/asm/bootfdt.h
>> new file mode 100644
>> index 0000000000..a4c4bf30b9
>> --- /dev/null
>> +++ b/xen/arch/x86/include/asm/bootfdt.h
>> @@ -0,0 +1,50 @@
>> +/* SPDX-License-Identifier: GPL-2.0-only */
>> +#ifndef X86_BOOTFDT_H
>> +#define X86_BOOTFDT_H
>> +
>> +#include <xen/types.h>
>> +
>> +struct arch_boot_module
>> +{
>> +    /*
>> +     * 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;
>> +};
>> +
>> +#endif /* 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..d33b100e04 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.
>> @@ -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, boot_module_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/pv/dom0_build.c b/xen/arch/x86/pv/dom0_build.c
>> index e1b78d47c2..a4b5362357 100644
>> --- a/xen/arch/x86/pv/dom0_build.c
>> +++ b/xen/arch/x86/pv/dom0_build.c
>> @@ -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 24e4f5ac7f..7e70b46332 100644
>> --- a/xen/arch/x86/setup.c
>> +++ b/xen/arch/x86/setup.c
>> @@ -303,7 +303,7 @@ struct boot_info __initdata xen_boot_info = {
>>        *
>>        * The extra entry exists to be able to add the Xen image as a module.
>>        */
>> -    .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(
>> @@ -338,7 +338,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) )
>>           {
>> @@ -361,7 +361,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;
>>   }
>> @@ -388,11 +388,11 @@ unsigned long __init initial_images_nrpages(nodeid_t 
>> node)
>>   
>>   void __init release_boot_module(struct boot_module *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)
>> @@ -402,7 +402,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]);
>> @@ -997,8 +997,8 @@ static size_t __init domain_cmdline_size(const struct 
>> boot_info *bi,
>>   {
>>       size_t s = 0;
>>   
>> -    if ( bd->kernel->cmdline_pa )
>> -        s += strlen(__va(bd->kernel->cmdline_pa));
>> +    if ( bd->kernel->arch.cmdline_pa )
>> +        s += strlen(__va(bd->kernel->arch.cmdline_pa));
>>   
>>       if ( bi->kextra )
>>           s += strlen(bi->kextra);
>> @@ -1065,9 +1065,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 )
>> @@ -1089,7 +1090,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;
>>       }
>>   
>> @@ -1302,7 +1303,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 )
>> @@ -1486,7 +1487,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();
>>   
>> @@ -1568,9 +1569,9 @@ void asmlinkage __init noreturn __start_xen(void)
>>           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);
>> +            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). */
>> @@ -1580,12 +1581,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;
>>               }
>>           }
>>   
>> @@ -1611,7 +1612,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 )
>>       {
>> @@ -2169,7 +2170,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 7f49d0ccdd..1b19069833 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
>> @@ -110,6 +114,10 @@ struct boot_module {
>>   #endif
>>       paddr_t start;
>>       paddr_t size;
>> +
>> +#if __has_include(<asm/bootfdt.h>)
>> +    struct arch_boot_module 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 1f88b4fc5a..1b4030edb4 100644
>> --- a/xen/xsm/xsm_policy.c
>> +++ b/xen/xsm/xsm_policy.c
>> @@ -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;
>
> I would ask the change be made the other direction, for the three usages 
> in the device-tree code. This isn't just a personal like, naming matters 
> and XSM does not support external modules, which this insinuates. It 
> only supports loadable policy and shorting this name creates ambiguity 
> in something already confusing to many.
>
> v/r,
> dps

Sounds good to me. Will do. I'll re-send it in a jiffy.

Cheers,
Alejandro

Reply via email to