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.
While doing this, s/BOOTMOD_XSM/BOOTMOD_XSM_POLICY/, as it was on x86.
XSM doesn't support external modules, so don't let the name imply it
through ambiguity.
No functional change intended.
Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@amd.com>
Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
Acked-by: Jan Beulich <jbeulich@suse.com>
---
v8:
* s/BOOTMOD_XSM/BOOTMOD_XSM_POLICY/
---
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/common/device-tree/bootfdt.c | 4 +--
xen/common/device-tree/bootinfo.c | 2 +-
xen/include/xen/bootfdt.h | 10 +++++-
xen/xsm/xsm_policy.c | 4 +--
10 files changed, 98 insertions(+), 88 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 9964068387..6be26cc66f 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 c6890669b9..58fd806072 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/common/device-tree/bootfdt.c b/xen/common/device-tree/bootfdt.c
index 08d919aba6..01f475510e 100644
--- a/xen/common/device-tree/bootfdt.c
+++ b/xen/common/device-tree/bootfdt.c
@@ -349,7 +349,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
fdt_node_check_compatible(fdt, node, "multiboot,ramdisk") == 0 )
kind = BOOTMOD_RAMDISK;
else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 )
- kind = BOOTMOD_XSM;
+ kind = BOOTMOD_XSM_POLICY;
else if ( fdt_node_check_compatible(fdt, node, "multiboot,device-tree") == 0 )
kind = BOOTMOD_GUEST_DTB;
else if ( fdt_node_check_compatible(fdt, node, "multiboot,microcode") == 0 )
@@ -377,7 +377,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
default: break;
}
if ( kind_guess > 1 && has_xsm_magic(start) )
- kind = BOOTMOD_XSM;
+ kind = BOOTMOD_XSM_POLICY;
}
domU = fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0;
diff --git a/xen/common/device-tree/bootinfo.c b/xen/common/device-tree/bootinfo.c
index 2a27d1318b..eb1b2b729d 100644
--- a/xen/common/device-tree/bootinfo.c
+++ b/xen/common/device-tree/bootinfo.c
@@ -29,7 +29,7 @@ const char * __init boot_module_kind_as_string(boot_module_kind kind)
case BOOTMOD_FDT: return "Device Tree";
case BOOTMOD_KERNEL: return "Kernel";
case BOOTMOD_RAMDISK: return "Ramdisk";
- case BOOTMOD_XSM: return "XSM";
+ case BOOTMOD_XSM_POLICY: return "XSM Policy";
case BOOTMOD_GUEST_DTB: return "DTB";
case BOOTMOD_MICROCODE: return "Microcode";
case BOOTMOD_UNKNOWN: return "Unknown";
diff --git a/xen/include/xen/bootfdt.h b/xen/include/xen/bootfdt.h
index 7f49d0ccdd..1218b23bb4 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
@@ -19,7 +23,7 @@ typedef enum {
BOOTMOD_FDT,
BOOTMOD_KERNEL,
BOOTMOD_RAMDISK,
- BOOTMOD_XSM,
+ BOOTMOD_XSM_POLICY,
BOOTMOD_GUEST_DTB,
BOOTMOD_MICROCODE,
BOOTMOD_UNKNOWN
@@ -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..27bfc3b995 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_POLICY;
break;
}
@@ -68,7 +68,7 @@ int __init xsm_multiboot_policy_init(
#ifdef CONFIG_HAS_DEVICE_TREE
int __init xsm_dt_policy_init(void **policy_buffer, size_t *policy_size)
{
- struct boot_module *mod = boot_module_find_by_kind(BOOTMOD_XSM);
+ struct boot_module *mod = boot_module_find_by_kind(BOOTMOD_XSM_POLICY);
paddr_t paddr, len;
if ( !mod || !mod->size )
--
2.43.0
On 7/21/25 20:05, 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.
>
> While doing this, s/BOOTMOD_XSM/BOOTMOD_XSM_POLICY/, as it was on x86.
> XSM doesn't support external modules, so don't let the name imply it
> through ambiguity.
>
> No functional change intended.
>
> Signed-off-by: Alejandro Vallejo <alejandro.garciavallejo@amd.com>
> Reviewed-by: Stefano Stabellini <sstabellini@kernel.org>
> Acked-by: Jan Beulich <jbeulich@suse.com>
> ---
> v8:
> * s/BOOTMOD_XSM/BOOTMOD_XSM_POLICY/
> ---
> 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/common/device-tree/bootfdt.c | 4 +--
> xen/common/device-tree/bootinfo.c | 2 +-
> xen/include/xen/bootfdt.h | 10 +++++-
> xen/xsm/xsm_policy.c | 4 +--
> 10 files changed, 98 insertions(+), 88 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 9964068387..6be26cc66f 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 c6890669b9..58fd806072 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/common/device-tree/bootfdt.c b/xen/common/device-tree/bootfdt.c
> index 08d919aba6..01f475510e 100644
> --- a/xen/common/device-tree/bootfdt.c
> +++ b/xen/common/device-tree/bootfdt.c
> @@ -349,7 +349,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
> fdt_node_check_compatible(fdt, node, "multiboot,ramdisk") == 0 )
> kind = BOOTMOD_RAMDISK;
> else if ( fdt_node_check_compatible(fdt, node, "xen,xsm-policy") == 0 )
> - kind = BOOTMOD_XSM;
> + kind = BOOTMOD_XSM_POLICY;
> else if ( fdt_node_check_compatible(fdt, node, "multiboot,device-tree") == 0 )
> kind = BOOTMOD_GUEST_DTB;
> else if ( fdt_node_check_compatible(fdt, node, "multiboot,microcode") == 0 )
> @@ -377,7 +377,7 @@ static void __init process_multiboot_node(const void *fdt, int node,
> default: break;
> }
> if ( kind_guess > 1 && has_xsm_magic(start) )
> - kind = BOOTMOD_XSM;
> + kind = BOOTMOD_XSM_POLICY;
> }
>
> domU = fdt_node_check_compatible(fdt, parent_node, "xen,domain") == 0;
> diff --git a/xen/common/device-tree/bootinfo.c b/xen/common/device-tree/bootinfo.c
> index 2a27d1318b..eb1b2b729d 100644
> --- a/xen/common/device-tree/bootinfo.c
> +++ b/xen/common/device-tree/bootinfo.c
> @@ -29,7 +29,7 @@ const char * __init boot_module_kind_as_string(boot_module_kind kind)
> case BOOTMOD_FDT: return "Device Tree";
> case BOOTMOD_KERNEL: return "Kernel";
> case BOOTMOD_RAMDISK: return "Ramdisk";
> - case BOOTMOD_XSM: return "XSM";
> + case BOOTMOD_XSM_POLICY: return "XSM Policy";
> case BOOTMOD_GUEST_DTB: return "DTB";
> case BOOTMOD_MICROCODE: return "Microcode";
> case BOOTMOD_UNKNOWN: return "Unknown";
> diff --git a/xen/include/xen/bootfdt.h b/xen/include/xen/bootfdt.h
> index 7f49d0ccdd..1218b23bb4 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
> @@ -19,7 +23,7 @@ typedef enum {
> BOOTMOD_FDT,
> BOOTMOD_KERNEL,
> BOOTMOD_RAMDISK,
> - BOOTMOD_XSM,
> + BOOTMOD_XSM_POLICY,
> BOOTMOD_GUEST_DTB,
> BOOTMOD_MICROCODE,
> BOOTMOD_UNKNOWN
> @@ -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..27bfc3b995 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_POLICY;
> break;
>
> }
> @@ -68,7 +68,7 @@ int __init xsm_multiboot_policy_init(
> #ifdef CONFIG_HAS_DEVICE_TREE
> int __init xsm_dt_policy_init(void **policy_buffer, size_t *policy_size)
> {
> - struct boot_module *mod = boot_module_find_by_kind(BOOTMOD_XSM);
> + struct boot_module *mod = boot_module_find_by_kind(BOOTMOD_XSM_POLICY);
> paddr_t paddr, len;
>
> if ( !mod || !mod->size )
Acked-by: Daniel P. Smith <dpsmith@apertussolutions.com>
© 2016 - 2025 Red Hat, Inc.