Message ID | 20250408160802.49870-7-agarciav@amd.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Hyperlaunch device tree for dom0 | expand |
On Tuesday, April 8th, 2025 at 9:07 AM, Alejandro Vallejo <agarciav@amd.com> wrote: > > > From: "Daniel P. Smith" dpsmith@apertussolutions.com > > > Introduce the domain builder which is capable of consuming a device tree as the > first boot module. If it finds a device tree as the first boot module, it will > set its type to BOOTMOD_FDT. This change only detects the boot module and > continues to boot with slight change to the boot convention that the dom0 > kernel is no longer first boot module but is the second. > > No functional change intended. > > Signed-off-by: Daniel P. Smith dpsmith@apertussolutions.com > > Signed-off-by: Jason Andryuk jason.andryuk@amd.com > > --- > v3: > * Move obj-y += domain-builder/ > * Remove blank line in Makefile > * const in has_hyperlaunch_fdt() > * CONFIG_LIBFDT rename > * Use boot_info forward declaration > * Rename domainbuilder.h to domain-builder.h > * Add fdt NULL check > --- > xen/arch/x86/Makefile | 1 + > xen/arch/x86/domain-builder/Kconfig | 2 +- > xen/arch/x86/domain-builder/Makefile | 2 + > xen/arch/x86/domain-builder/core.c | 57 +++++++++++++++++++++++ > xen/arch/x86/domain-builder/fdt.c | 37 +++++++++++++++ > xen/arch/x86/domain-builder/fdt.h | 21 +++++++++ I have a general question. Wouldn't that make sense to use arch-independent placeholder for domain builder code right from the starting point? For example something like xen/common/domain-builder ? My understanding is that there's a lot of code in the domain builder which can be potentially shared/re-used with non-x86 architectures. Also, that seems to align with the intention to have common arch-independent subsystems in the code base: https://docs.google.com/presentation/d/1q9cjJZLUxUo1YzMpCxVHuL-ZOGoFaO9haHfRBK4i4Uc/edit?slide=id.g32afc87aef4_0_18#slide=id.g32afc87aef4_0_18 > xen/arch/x86/include/asm/bootinfo.h | 3 ++ > xen/arch/x86/include/asm/domain-builder.h | 8 ++++ > xen/arch/x86/setup.c | 17 ++++--- > 9 files changed, 141 insertions(+), 7 deletions(-) > create mode 100644 xen/arch/x86/domain-builder/Makefile > create mode 100644 xen/arch/x86/domain-builder/core.c > create mode 100644 xen/arch/x86/domain-builder/fdt.c > create mode 100644 xen/arch/x86/domain-builder/fdt.h > create mode 100644 xen/arch/x86/include/asm/domain-builder.h > > diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile > index f59c9665fd..deae31d627 100644 > --- a/xen/arch/x86/Makefile > +++ b/xen/arch/x86/Makefile > @@ -1,6 +1,7 @@ > obj-y += acpi/ > obj-y += boot/ > obj-y += cpu/ > +obj-y += domain-builder/ > obj-y += efi/ > obj-y += genapic/ > obj-$(CONFIG_GUEST) += guest/ > diff --git a/xen/arch/x86/domain-builder/Kconfig b/xen/arch/x86/domain-builder/Kconfig > index 8ed493c3b5..51d549c20d 100644 > --- a/xen/arch/x86/domain-builder/Kconfig > +++ b/xen/arch/x86/domain-builder/Kconfig > @@ -3,7 +3,7 @@ menu "Domain Builder Features" > > config DOMAIN_BUILDER > bool "Domain builder (UNSUPPORTED)" if UNSUPPORTED > - select LIB_DEVICE_TREE > + select LIBFDT > help > Enables the domain builder capability to configure boot domain > construction using a flattened device tree. > diff --git a/xen/arch/x86/domain-builder/Makefile b/xen/arch/x86/domain-builder/Makefile > new file mode 100644 > index 0000000000..b10cd56b28 > --- /dev/null > +++ b/xen/arch/x86/domain-builder/Makefile > @@ -0,0 +1,2 @@ > +obj-$(CONFIG_DOMAIN_BUILDER) += fdt.init.o > +obj-y += core.init.o > diff --git a/xen/arch/x86/domain-builder/core.c b/xen/arch/x86/domain-builder/core.c > new file mode 100644 > index 0000000000..d6ae94f45c > --- /dev/null > +++ b/xen/arch/x86/domain-builder/core.c > @@ -0,0 +1,57 @@ > +/* SPDX-License-Identifier: GPL-2.0-only / > +/ > + * Copyright (C) 2024, Apertus Solutions, LLC > + */ > +#include <xen/err.h> > > +#include <xen/init.h> > > +#include <xen/kconfig.h> > > +#include <xen/lib.h> > > + > +#include <asm/bootinfo.h> > > + > +#include "fdt.h" > + > +void __init builder_init(struct boot_info *bi) > +{ > + if ( IS_ENABLED(CONFIG_DOMAIN_BUILDER) ) > + { > + int ret; > + > + switch ( ret = has_hyperlaunch_fdt(bi) ) > + { > + case 0: > + printk("Hyperlaunch device tree detected\n"); > + bi->hyperlaunch_enabled = true; > > + bi->mods[0].type = BOOTMOD_FDT; > > + break; > + > + case -EINVAL: > + printk("Hyperlaunch device tree was not detected\n"); > + bi->hyperlaunch_enabled = false; > > + break; > + > + case -ENOENT: > + case -ENODATA: > + printk("Device tree found, but not hyperlaunch (%d)\n", ret); > + bi->hyperlaunch_enabled = false; > > + bi->mods[0].type = BOOTMOD_FDT; > > + break; > + > + default: > + printk("Unknown error (%d) occured checking for hyperlaunch device tree\n", > + ret); > + bi->hyperlaunch_enabled = false; > > + break; > + } > + } > +} > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + / > diff --git a/xen/arch/x86/domain-builder/fdt.c b/xen/arch/x86/domain-builder/fdt.c > new file mode 100644 > index 0000000000..aaf8c1cc16 > --- /dev/null > +++ b/xen/arch/x86/domain-builder/fdt.c > @@ -0,0 +1,37 @@ > +/ SPDX-License-Identifier: GPL-2.0-only / > +/ > + * Copyright (C) 2024, Apertus Solutions, LLC > + */ > +#include <xen/err.h> > > +#include <xen/init.h> > > +#include <xen/lib.h> > > +#include <xen/libfdt/libfdt.h> > > + > +#include <asm/bootinfo.h> > > +#include <asm/page.h> > > +#include <asm/setup.h> > > + > +#include "fdt.h" > + > +int __init has_hyperlaunch_fdt(const struct boot_info *bi) > +{ > + int ret = 0; > + const void *fdt = bootstrap_map_bm(&bi->mods[HYPERLAUNCH_MODULE_IDX]); > > + > + if ( !fdt || fdt_check_header(fdt) < 0 ) > + ret = -EINVAL; > + > + bootstrap_unmap(); > + > + return ret; > +} > + > +/* > + * Local variables: > + * mode: C > + * c-file-style: "BSD" > + * c-basic-offset: 4 > + * tab-width: 4 > + * indent-tabs-mode: nil > + * End: > + / > diff --git a/xen/arch/x86/domain-builder/fdt.h b/xen/arch/x86/domain-builder/fdt.h > new file mode 100644 > index 0000000000..8e62cd843e > --- /dev/null > +++ b/xen/arch/x86/domain-builder/fdt.h > @@ -0,0 +1,21 @@ > +/ SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ > +#ifndef XEN_X86_FDT_H > +#define XEN_X86_FDT_H > + > +#include <xen/init.h> > > + > +struct boot_info; > + > +/* hyperlaunch fdt is required to be module 0 */ > +#define HYPERLAUNCH_MODULE_IDX 0 > + > +#ifdef CONFIG_DOMAIN_BUILDER > +int has_hyperlaunch_fdt(const struct boot_info *bi); > +#else > +static inline int __init has_hyperlaunch_fdt(const struct boot_info bi) > +{ > + return -EINVAL; > +} > +#endif > + > +#endif / XEN_X86_FDT_H */ > diff --git a/xen/arch/x86/include/asm/bootinfo.h b/xen/arch/x86/include/asm/bootinfo.h > index 3afc214c17..82c2650fcf 100644 > --- a/xen/arch/x86/include/asm/bootinfo.h > +++ b/xen/arch/x86/include/asm/bootinfo.h > @@ -27,6 +27,7 @@ enum bootmod_type { > BOOTMOD_RAMDISK, > BOOTMOD_MICROCODE, > BOOTMOD_XSM_POLICY, > + BOOTMOD_FDT, > }; > > struct boot_module { > @@ -80,6 +81,8 @@ struct boot_info { > paddr_t memmap_addr; > size_t memmap_length; > > + bool hyperlaunch_enabled; > + > unsigned int nr_modules; > struct boot_module mods[MAX_NR_BOOTMODS + 1]; > struct boot_domain domains[MAX_NR_BOOTDOMS]; > diff --git a/xen/arch/x86/include/asm/domain-builder.h b/xen/arch/x86/include/asm/domain-builder.h > new file mode 100644 > index 0000000000..b6d9ba94de > --- /dev/null > +++ b/xen/arch/x86/include/asm/domain-builder.h > @@ -0,0 +1,8 @@ > +#ifndef XEN_X86_DOMBUILDER_H > +#define XEN_X86_DOMBUILDER_H > + > +struct boot_info; > + > +void builder_init(struct boot_info *bi); > + > +#endif > diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c > index 83cb66e309..e5d78bcb48 100644 > --- a/xen/arch/x86/setup.c > +++ b/xen/arch/x86/setup.c > @@ -36,6 +36,7 @@ > #include <asm/bzimage.h> > > #include <asm/cpu-policy.h> > > #include <asm/desc.h> > > +#include <asm/domain-builder.h> > > #include <asm/e820.h> > > #include <asm/edd.h> > > #include <asm/genapic.h> > > @@ -1281,9 +1282,12 @@ void asmlinkage __init noreturn __start_xen(void) > bi->nr_modules); > > } > > - /* Dom0 kernel is always first */ > - bi->mods[0].type = BOOTMOD_KERNEL; > > - bi->domains[0].kernel = &bi->mods[0]; > > + builder_init(bi); > + > + /* Find first unknown boot module to use as Dom0 kernel */ > + i = first_boot_module_index(bi, BOOTMOD_UNKNOWN); > + bi->mods[i].type = BOOTMOD_KERNEL; > > + bi->domains[0].kernel = &bi->mods[i]; > > > if ( pvh_boot ) > { > @@ -1466,8 +1470,9 @@ void asmlinkage __init noreturn __start_xen(void) > xen->size = __2M_rwdata_end - _stext; > > } > > - bi->mods[0].headroom = > > - bzimage_headroom(bootstrap_map_bm(&bi->mods[0]), bi->mods[0].size); > > + bi->domains[0].kernel->headroom = > > + bzimage_headroom(bootstrap_map_bm(bi->domains[0].kernel), > > + bi->domains[0].kernel->size); > > bootstrap_unmap(); > > #ifndef highmem_start > @@ -1591,7 +1596,7 @@ void asmlinkage __init noreturn __start_xen(void) > #endif > } > > - if ( bi->mods[0].headroom && !bi->mods[0].relocated ) > > + if ( bi->domains[0].kernel->headroom && !bi->domains[0].kernel->relocated ) > > panic("Not enough memory to relocate the dom0 kernel image\n"); > for ( i = 0; i < bi->nr_modules; ++i ) > > { > -- > 2.43.0
On 09.04.2025 20:53, Denis Mukhin wrote: > On Tuesday, April 8th, 2025 at 9:07 AM, Alejandro Vallejo <agarciav@amd.com> wrote: > >> >> >> From: "Daniel P. Smith" dpsmith@apertussolutions.com >> >> >> Introduce the domain builder which is capable of consuming a device tree as the >> first boot module. If it finds a device tree as the first boot module, it will >> set its type to BOOTMOD_FDT. This change only detects the boot module and >> continues to boot with slight change to the boot convention that the dom0 >> kernel is no longer first boot module but is the second. >> >> No functional change intended. >> >> Signed-off-by: Daniel P. Smith dpsmith@apertussolutions.com >> >> Signed-off-by: Jason Andryuk jason.andryuk@amd.com >> >> --- >> v3: >> * Move obj-y += domain-builder/ >> * Remove blank line in Makefile >> * const in has_hyperlaunch_fdt() >> * CONFIG_LIBFDT rename >> * Use boot_info forward declaration >> * Rename domainbuilder.h to domain-builder.h >> * Add fdt NULL check >> --- >> xen/arch/x86/Makefile | 1 + >> xen/arch/x86/domain-builder/Kconfig | 2 +- >> xen/arch/x86/domain-builder/Makefile | 2 + >> xen/arch/x86/domain-builder/core.c | 57 +++++++++++++++++++++++ >> xen/arch/x86/domain-builder/fdt.c | 37 +++++++++++++++ >> xen/arch/x86/domain-builder/fdt.h | 21 +++++++++ > > I have a general question. > > Wouldn't that make sense to use arch-independent placeholder for domain builder > code right from the starting point? > > For example something like xen/common/domain-builder ? > > My understanding is that there's a lot of code in the domain builder which > can be potentially shared/re-used with non-x86 architectures. And indeed this point was already raised before. Jan
On 08.04.2025 18:07, Alejandro Vallejo wrote: > --- a/xen/arch/x86/Makefile > +++ b/xen/arch/x86/Makefile > @@ -1,6 +1,7 @@ > obj-y += acpi/ > obj-y += boot/ > obj-y += cpu/ > +obj-y += domain-builder/ I continue to be irritated that this isn't obj-$(DOMAIN_BUILDER). The sole function in core.c has "if ( IS_ENABLED(CONFIG_DOMAIN_BUILDER) )" around its entire body (which is unhelpful at least from an indentation pov), and the sole function in fdt.c is only used by the one in core.c. builder_init() clearly could have an inline stub alternative as of this patch. If future patches change that picture, imo that would need saying here to justify this unconditional descend into the new subdir. > --- a/xen/arch/x86/domain-builder/Kconfig > +++ b/xen/arch/x86/domain-builder/Kconfig > @@ -3,7 +3,7 @@ menu "Domain Builder Features" > > config DOMAIN_BUILDER > bool "Domain builder (UNSUPPORTED)" if UNSUPPORTED > - select LIB_DEVICE_TREE > + select LIBFDT That's what the earlier patch meant to be doing? > --- /dev/null > +++ b/xen/arch/x86/domain-builder/Makefile > @@ -0,0 +1,2 @@ > +obj-$(CONFIG_DOMAIN_BUILDER) += fdt.init.o > +obj-y += core.init.o *.init.o want enlisting into obj-bin-y. > --- /dev/null > +++ b/xen/arch/x86/domain-builder/core.c > @@ -0,0 +1,57 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Copyright (C) 2024, Apertus Solutions, LLC > + */ > +#include <xen/err.h> > +#include <xen/init.h> > +#include <xen/kconfig.h> > +#include <xen/lib.h> > + > +#include <asm/bootinfo.h> > + > +#include "fdt.h" > + > +void __init builder_init(struct boot_info *bi) > +{ > + if ( IS_ENABLED(CONFIG_DOMAIN_BUILDER) ) > + { > + int ret; > + > + switch ( ret = has_hyperlaunch_fdt(bi) ) > + { > + case 0: > + printk("Hyperlaunch device tree detected\n"); > + bi->hyperlaunch_enabled = true; > + bi->mods[0].type = BOOTMOD_FDT; > + break; > + > + case -EINVAL: > + printk("Hyperlaunch device tree was not detected\n"); > + bi->hyperlaunch_enabled = false; > + break; For people not using hyperlaunch (which for the time being is likely going to be a majority) this log line will be little more than spam. I'd like it to be considered to be dropped. > --- /dev/null > +++ b/xen/arch/x86/domain-builder/fdt.c > @@ -0,0 +1,37 @@ > +/* SPDX-License-Identifier: GPL-2.0-only */ > +/* > + * Copyright (C) 2024, Apertus Solutions, LLC > + */ > +#include <xen/err.h> Was xen/errno.h meant here? > +#include <xen/init.h> > +#include <xen/lib.h> I don't see anything used from there. > +#include <xen/libfdt/libfdt.h> > + > +#include <asm/bootinfo.h> > +#include <asm/page.h> How does page.h come into play here? > --- a/xen/arch/x86/setup.c > +++ b/xen/arch/x86/setup.c > @@ -36,6 +36,7 @@ > #include <asm/bzimage.h> > #include <asm/cpu-policy.h> > #include <asm/desc.h> > +#include <asm/domain-builder.h> > #include <asm/e820.h> > #include <asm/edd.h> > #include <asm/genapic.h> > @@ -1281,9 +1282,12 @@ void asmlinkage __init noreturn __start_xen(void) > bi->nr_modules); > } > > - /* Dom0 kernel is always first */ > - bi->mods[0].type = BOOTMOD_KERNEL; > - bi->domains[0].kernel = &bi->mods[0]; > + builder_init(bi); > + > + /* Find first unknown boot module to use as Dom0 kernel */ > + i = first_boot_module_index(bi, BOOTMOD_UNKNOWN); For this I think it would be quite desirable if in a prereq patch i's type was (finally) changed to unsigned int, which is how it's used effectively everywhere, with one loop requiring a little bit of adjustment. > + bi->mods[i].type = BOOTMOD_KERNEL; Overrunning the array if MAX_NR_BOOTMODS + 1 was returned. Jan
On Wed Apr 9, 2025 at 7:53 PM BST, Denis Mukhin wrote: > On Tuesday, April 8th, 2025 at 9:07 AM, Alejandro Vallejo <agarciav@amd.com> wrote: > >> >> >> From: "Daniel P. Smith" dpsmith@apertussolutions.com >> >> >> Introduce the domain builder which is capable of consuming a device tree as the >> first boot module. If it finds a device tree as the first boot module, it will >> set its type to BOOTMOD_FDT. This change only detects the boot module and >> continues to boot with slight change to the boot convention that the dom0 >> kernel is no longer first boot module but is the second. >> >> No functional change intended. >> >> Signed-off-by: Daniel P. Smith dpsmith@apertussolutions.com >> >> Signed-off-by: Jason Andryuk jason.andryuk@amd.com >> >> --- >> v3: >> * Move obj-y += domain-builder/ >> * Remove blank line in Makefile >> * const in has_hyperlaunch_fdt() >> * CONFIG_LIBFDT rename >> * Use boot_info forward declaration >> * Rename domainbuilder.h to domain-builder.h >> * Add fdt NULL check >> --- >> xen/arch/x86/Makefile | 1 + >> xen/arch/x86/domain-builder/Kconfig | 2 +- >> xen/arch/x86/domain-builder/Makefile | 2 + >> xen/arch/x86/domain-builder/core.c | 57 +++++++++++++++++++++++ >> xen/arch/x86/domain-builder/fdt.c | 37 +++++++++++++++ >> xen/arch/x86/domain-builder/fdt.h | 21 +++++++++ > > I have a general question. > > Wouldn't that make sense to use arch-independent placeholder for domain builder > code right from the starting point? > > For example something like xen/common/domain-builder ? > > My understanding is that there's a lot of code in the domain builder which > can be potentially shared/re-used with non-x86 architectures. > > Also, that seems to align with the intention to have common arch-independent > subsystems in the code base: > > https://docs.google.com/presentation/d/1q9cjJZLUxUo1YzMpCxVHuL-ZOGoFaO9haHfRBK4i4Uc/edit?slide=id.g32afc87aef4_0_18#slide=id.g32afc87aef4_0_18 https://lore.kernel.org/xen-devel/D92Z1LECR2VA.3FW5H7ZIRVXU7@amd.com/ In principle, yes. I'll try to move it, but I suspect making it coexist with dom0less will prove tricky. >> diff --git a/xen/arch/x86/domain-builder/core.c b/xen/arch/x86/domain-builder/core.c >> new file mode 100644 >> index 0000000000..d6ae94f45c >> --- /dev/null >> +++ b/xen/arch/x86/domain-builder/core.c >> @@ -0,0 +1,57 @@ >> +/* SPDX-License-Identifier: GPL-2.0-only / >> +/ >> + * Copyright (C) 2024, Apertus Solutions, LLC >> + */ >> +#include <xen/err.h> >> >> +#include <xen/init.h> >> >> +#include <xen/kconfig.h> >> >> +#include <xen/lib.h> >> >> + >> +#include <asm/bootinfo.h> >> >> + >> +#include "fdt.h" >> + >> +void __init builder_init(struct boot_info *bi) >> +{ >> + if ( IS_ENABLED(CONFIG_DOMAIN_BUILDER) ) >> + { >> + int ret; >> + >> + switch ( ret = has_hyperlaunch_fdt(bi) ) >> + { >> + case 0: >> + printk("Hyperlaunch device tree detected\n"); >> + bi->hyperlaunch_enabled = true; FYI, your email client seems to be collapsing the indentation of the quoted patches. Is that intentional? Cheers, Alejandro
diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile index f59c9665fd..deae31d627 100644 --- a/xen/arch/x86/Makefile +++ b/xen/arch/x86/Makefile @@ -1,6 +1,7 @@ obj-y += acpi/ obj-y += boot/ obj-y += cpu/ +obj-y += domain-builder/ obj-y += efi/ obj-y += genapic/ obj-$(CONFIG_GUEST) += guest/ diff --git a/xen/arch/x86/domain-builder/Kconfig b/xen/arch/x86/domain-builder/Kconfig index 8ed493c3b5..51d549c20d 100644 --- a/xen/arch/x86/domain-builder/Kconfig +++ b/xen/arch/x86/domain-builder/Kconfig @@ -3,7 +3,7 @@ menu "Domain Builder Features" config DOMAIN_BUILDER bool "Domain builder (UNSUPPORTED)" if UNSUPPORTED - select LIB_DEVICE_TREE + select LIBFDT help Enables the domain builder capability to configure boot domain construction using a flattened device tree. diff --git a/xen/arch/x86/domain-builder/Makefile b/xen/arch/x86/domain-builder/Makefile new file mode 100644 index 0000000000..b10cd56b28 --- /dev/null +++ b/xen/arch/x86/domain-builder/Makefile @@ -0,0 +1,2 @@ +obj-$(CONFIG_DOMAIN_BUILDER) += fdt.init.o +obj-y += core.init.o diff --git a/xen/arch/x86/domain-builder/core.c b/xen/arch/x86/domain-builder/core.c new file mode 100644 index 0000000000..d6ae94f45c --- /dev/null +++ b/xen/arch/x86/domain-builder/core.c @@ -0,0 +1,57 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2024, Apertus Solutions, LLC + */ +#include <xen/err.h> +#include <xen/init.h> +#include <xen/kconfig.h> +#include <xen/lib.h> + +#include <asm/bootinfo.h> + +#include "fdt.h" + +void __init builder_init(struct boot_info *bi) +{ + if ( IS_ENABLED(CONFIG_DOMAIN_BUILDER) ) + { + int ret; + + switch ( ret = has_hyperlaunch_fdt(bi) ) + { + case 0: + printk("Hyperlaunch device tree detected\n"); + bi->hyperlaunch_enabled = true; + bi->mods[0].type = BOOTMOD_FDT; + break; + + case -EINVAL: + printk("Hyperlaunch device tree was not detected\n"); + bi->hyperlaunch_enabled = false; + break; + + case -ENOENT: + case -ENODATA: + printk("Device tree found, but not hyperlaunch (%d)\n", ret); + bi->hyperlaunch_enabled = false; + bi->mods[0].type = BOOTMOD_FDT; + break; + + default: + printk("Unknown error (%d) occured checking for hyperlaunch device tree\n", + ret); + bi->hyperlaunch_enabled = false; + break; + } + } +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/x86/domain-builder/fdt.c b/xen/arch/x86/domain-builder/fdt.c new file mode 100644 index 0000000000..aaf8c1cc16 --- /dev/null +++ b/xen/arch/x86/domain-builder/fdt.c @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +/* + * Copyright (C) 2024, Apertus Solutions, LLC + */ +#include <xen/err.h> +#include <xen/init.h> +#include <xen/lib.h> +#include <xen/libfdt/libfdt.h> + +#include <asm/bootinfo.h> +#include <asm/page.h> +#include <asm/setup.h> + +#include "fdt.h" + +int __init has_hyperlaunch_fdt(const struct boot_info *bi) +{ + int ret = 0; + const void *fdt = bootstrap_map_bm(&bi->mods[HYPERLAUNCH_MODULE_IDX]); + + if ( !fdt || fdt_check_header(fdt) < 0 ) + ret = -EINVAL; + + bootstrap_unmap(); + + return ret; +} + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/arch/x86/domain-builder/fdt.h b/xen/arch/x86/domain-builder/fdt.h new file mode 100644 index 0000000000..8e62cd843e --- /dev/null +++ b/xen/arch/x86/domain-builder/fdt.h @@ -0,0 +1,21 @@ +/* SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause) */ +#ifndef __XEN_X86_FDT_H__ +#define __XEN_X86_FDT_H__ + +#include <xen/init.h> + +struct boot_info; + +/* hyperlaunch fdt is required to be module 0 */ +#define HYPERLAUNCH_MODULE_IDX 0 + +#ifdef CONFIG_DOMAIN_BUILDER +int has_hyperlaunch_fdt(const struct boot_info *bi); +#else +static inline int __init has_hyperlaunch_fdt(const struct boot_info *bi) +{ + return -EINVAL; +} +#endif + +#endif /* __XEN_X86_FDT_H__ */ diff --git a/xen/arch/x86/include/asm/bootinfo.h b/xen/arch/x86/include/asm/bootinfo.h index 3afc214c17..82c2650fcf 100644 --- a/xen/arch/x86/include/asm/bootinfo.h +++ b/xen/arch/x86/include/asm/bootinfo.h @@ -27,6 +27,7 @@ enum bootmod_type { BOOTMOD_RAMDISK, BOOTMOD_MICROCODE, BOOTMOD_XSM_POLICY, + BOOTMOD_FDT, }; struct boot_module { @@ -80,6 +81,8 @@ struct boot_info { paddr_t memmap_addr; size_t memmap_length; + bool hyperlaunch_enabled; + unsigned int nr_modules; struct boot_module mods[MAX_NR_BOOTMODS + 1]; struct boot_domain domains[MAX_NR_BOOTDOMS]; diff --git a/xen/arch/x86/include/asm/domain-builder.h b/xen/arch/x86/include/asm/domain-builder.h new file mode 100644 index 0000000000..b6d9ba94de --- /dev/null +++ b/xen/arch/x86/include/asm/domain-builder.h @@ -0,0 +1,8 @@ +#ifndef __XEN_X86_DOMBUILDER_H__ +#define __XEN_X86_DOMBUILDER_H__ + +struct boot_info; + +void builder_init(struct boot_info *bi); + +#endif diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 83cb66e309..e5d78bcb48 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -36,6 +36,7 @@ #include <asm/bzimage.h> #include <asm/cpu-policy.h> #include <asm/desc.h> +#include <asm/domain-builder.h> #include <asm/e820.h> #include <asm/edd.h> #include <asm/genapic.h> @@ -1281,9 +1282,12 @@ void asmlinkage __init noreturn __start_xen(void) bi->nr_modules); } - /* Dom0 kernel is always first */ - bi->mods[0].type = BOOTMOD_KERNEL; - bi->domains[0].kernel = &bi->mods[0]; + builder_init(bi); + + /* Find first unknown boot module to use as Dom0 kernel */ + i = first_boot_module_index(bi, BOOTMOD_UNKNOWN); + bi->mods[i].type = BOOTMOD_KERNEL; + bi->domains[0].kernel = &bi->mods[i]; if ( pvh_boot ) { @@ -1466,8 +1470,9 @@ void asmlinkage __init noreturn __start_xen(void) xen->size = __2M_rwdata_end - _stext; } - bi->mods[0].headroom = - bzimage_headroom(bootstrap_map_bm(&bi->mods[0]), bi->mods[0].size); + bi->domains[0].kernel->headroom = + bzimage_headroom(bootstrap_map_bm(bi->domains[0].kernel), + bi->domains[0].kernel->size); bootstrap_unmap(); #ifndef highmem_start @@ -1591,7 +1596,7 @@ void asmlinkage __init noreturn __start_xen(void) #endif } - if ( bi->mods[0].headroom && !bi->mods[0].relocated ) + if ( bi->domains[0].kernel->headroom && !bi->domains[0].kernel->relocated ) panic("Not enough memory to relocate the dom0 kernel image\n"); for ( i = 0; i < bi->nr_modules; ++i ) {