|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH 05/10] xsm: switch XSM init to boot info structures
On Sat, 8 Jul 2023, Stefano Stabellini wrote:
> On Sat, 1 Jul 2023, Christopher Clark wrote:
> > Change the XSM implementation to use the boot info structure instead of
> > the multiboot module_map.
> >
> > Drops a dependency on CONFIG_MULTIBOOT, so boot module logic is now
> > used whenever the DEVICE_TREE specific logic (for Arm) is not, with the
> > bootinfo header conditionally included to ensure no change on Arm.
>
> Given that device tree is used for ARM but also for the Hyperlaunch
> configuration, I think this is very confusing.
>
> Ideally I think we should use struct bootinfo (ideally the same version
> currently under xen/arch/arm/include/asm/setup.h) for both ARM and x86,
> getting rid of any need of any #ifdefs. We should be able to get
> xsm_dt_policy_init to work with Hyperlaunch x86 pretty easily?
>
> If that is too much work, then please use #ifdef CONFIG_ARM so at least
> it is clear what the difference is.
Wait, is it the case that xsm_bootmodule_init is for the old grub
multiboot protocol? And xsm_dt_init will be used by both Dom0less ARM
and Hyperlaunch x86?
Wouldn't it be better to have a "detect" or "pre-init" function per
module-type (one for xsm, one for microcode, etc.) that configure the
bootinfo and bootmodules correctly and then we can reuse a single xsm
init function in all cases:
- dom0less arm
- hyperlaunch x86
- legacy grub multiboot x86
> > Adds a multiboot header inclusion into guest/xen/pvh-boot.c
> > since it is no longer provided via transitive inclusion and the source
> > in that file uses multiboot structures.
> >
> > Signed-off-by: Christopher Clark <christopher.w.clark@xxxxxxxxx>
> > Signed-off-by: Daniel P. Smith <dpsmith@xxxxxxxxxxxxxxxxxxxx>
> >
> > ---
> > Changes since v1: patch is a subset of v1 series patches 2 and 3.
> > - Added the <xen/multiboot.h> inclusion to pvh-boot.c
> > - Use conditional inclusion for <xen/bootinfo.h>
> >
> > xen/arch/x86/guest/xen/pvh-boot.c | 1 +
> > xen/arch/x86/setup.c | 2 +-
> > xen/include/xsm/xsm.h | 28 +++++++--------
> > xen/xsm/xsm_core.c | 47 +++++++++++++++---------
> > xen/xsm/xsm_policy.c | 59 ++++++++++++++++---------------
> > 5 files changed, 77 insertions(+), 60 deletions(-)
> >
> > diff --git a/xen/arch/x86/guest/xen/pvh-boot.c
> > b/xen/arch/x86/guest/xen/pvh-boot.c
> > index 9cbe87b61b..1ed04d035c 100644
> > --- a/xen/arch/x86/guest/xen/pvh-boot.c
> > +++ b/xen/arch/x86/guest/xen/pvh-boot.c
> > @@ -9,6 +9,7 @@
> > #include <xen/init.h>
> > #include <xen/lib.h>
> > #include <xen/mm.h>
> > +#include <xen/multiboot.h>
> >
> > #include <asm/e820.h>
> > #include <asm/guest.h>
> > diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c
> > index f9b04daebd..a616ccc0a8 100644
> > --- a/xen/arch/x86/setup.c
> > +++ b/xen/arch/x86/setup.c
> > @@ -1835,7 +1835,7 @@ void __init noreturn __start_xen(unsigned long mbi_p)
> > mmio_ro_ranges = rangeset_new(NULL, "r/o mmio ranges",
> > RANGESETF_prettyprint_hex);
> >
> > - xsm_multiboot_init(module_map, mbi);
> > + xsm_bootmodule_init(boot_info);
> >
> > /*
> > * IOMMU-related ACPI table parsing may require some of the system
> > domains
> > diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h
> > index 8dad03fd3d..d409c30be6 100644
> > --- a/xen/include/xsm/xsm.h
> > +++ b/xen/include/xsm/xsm.h
> > @@ -16,8 +16,10 @@
> > #define __XSM_H__
> >
> > #include <xen/alternative-call.h>
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +# include <xen/bootinfo.h>
> > +#endif
> > #include <xen/sched.h>
> > -#include <xen/multiboot.h>
> >
> > /* policy magic number (defined by XSM_MAGIC) */
> > typedef uint32_t xsm_magic_t;
> > @@ -776,15 +778,14 @@ static inline int xsm_argo_send(const struct domain
> > *d, const struct domain *t)
> >
> > #endif /* XSM_NO_WRAPPERS */
> >
> > -#ifdef CONFIG_MULTIBOOT
> > -int xsm_multiboot_init(
> > - unsigned long *module_map, const multiboot_info_t *mbi);
> > -int xsm_multiboot_policy_init(
> > - unsigned long *module_map, const multiboot_info_t *mbi,
> > - void **policy_buffer, size_t *policy_size);
> > -#endif
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +int xsm_bootmodule_init(const struct boot_info *info);
> > +int xsm_bootmodule_policy_init(
> > + const struct boot_info *info, const unsigned char **policy_buffer,
> > + size_t *policy_size);
> > +
> > +#else
> >
> > -#ifdef CONFIG_HAS_DEVICE_TREE
> > /*
> > * Initialize XSM
> > *
> > @@ -826,15 +827,14 @@ static const inline struct xsm_ops *silo_init(void)
> >
> > #include <xsm/dummy.h>
> >
> > -#ifdef CONFIG_MULTIBOOT
> > -static inline int xsm_multiboot_init (
> > - unsigned long *module_map, const multiboot_info_t *mbi)
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +static inline int xsm_bootmodule_init(const struct boot_info *info)
> > {
> > return 0;
> > }
> > -#endif
> >
> > -#ifdef CONFIG_HAS_DEVICE_TREE
> > +#else
> > +
> > static inline int xsm_dt_init(void)
> > {
> > return 0;
> > diff --git a/xen/xsm/xsm_core.c b/xen/xsm/xsm_core.c
> > index eaa028109b..301ae4dc8b 100644
> > --- a/xen/xsm/xsm_core.c
> > +++ b/xen/xsm/xsm_core.c
> > @@ -10,8 +10,12 @@
> > * as published by the Free Software Foundation.
> > */
> >
> > -#include <xen/init.h>
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +# include <xen/bootinfo.h>
> > +#endif
> > #include <xen/errno.h>
> > +#include <xen/hypercall.h>
> > +#include <xen/init.h>
> > #include <xen/lib.h>
> > #include <xen/param.h>
> >
> > @@ -138,26 +142,35 @@ static int __init xsm_core_init(const void
> > *policy_buffer, size_t policy_size)
> > return 0;
> > }
> >
> > -#ifdef CONFIG_MULTIBOOT
> > -int __init xsm_multiboot_init(
> > - unsigned long *module_map, const multiboot_info_t *mbi)
> > +/*
> > + * ifdef'ing this against multiboot is no longer valid as the boot module
> > + * is agnostic and it will be possible to dropped the ifndef should Arm
> > + * adopt boot info
> > + */
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +int __init xsm_bootmodule_init(const struct boot_info *bootinfo)
> > {
> > int ret = 0;
> > - void *policy_buffer = NULL;
> > + const unsigned char *policy_buffer = NULL;
> > size_t policy_size = 0;
> >
> > printk("XSM Framework v" XSM_FRAMEWORK_VERSION " initialized\n");
> >
> > if ( XSM_MAGIC )
> > {
> > - ret = xsm_multiboot_policy_init(module_map, mbi, &policy_buffer,
> > - &policy_size);
> > - if ( ret )
> > - {
> > - bootstrap_map(NULL);
> > - printk(XENLOG_ERR "Error %d initializing XSM policy\n", ret);
> > - return -EINVAL;
> > - }
> > + int ret = xsm_bootmodule_policy_init(bootinfo, &policy_buffer,
> > + &policy_size);
> > + bootstrap_map(NULL);
> > +
> > + if ( ret == -ENOENT )
> > + /*
> > + * The XSM module needs a policy file but one was not located.
> > + * Report as a warning and continue as the XSM module may late
> > + * load a policy file.
> > + */
> > + printk(XENLOG_WARNING "xsm: starting without a policy
> > loaded!\n");
> > + else if ( ret )
> > + panic("Error %d initializing XSM policy\n", ret);
> > }
> >
> > ret = xsm_core_init(policy_buffer, policy_size);
> > @@ -165,9 +178,9 @@ int __init xsm_multiboot_init(
> >
> > return 0;
> > }
> > -#endif
> >
> > -#ifdef CONFIG_HAS_DEVICE_TREE
> > +#else
> > +
> > int __init xsm_dt_init(void)
> > {
> > int ret = 0;
> > @@ -215,9 +228,9 @@ bool __init has_xsm_magic(paddr_t start)
> >
> > return false;
> > }
> > -#endif
> > +#endif /* CONFIG_HAS_DEVICE_TREE */
> >
> > -#endif
> > +#endif /* CONFIG_XSM */
> >
> > long do_xsm_op(XEN_GUEST_HANDLE_PARAM(void) op)
> > {
> > diff --git a/xen/xsm/xsm_policy.c b/xen/xsm/xsm_policy.c
> > index c6df8c6e06..f1970c8964 100644
> > --- a/xen/xsm/xsm_policy.c
> > +++ b/xen/xsm/xsm_policy.c
> > @@ -18,62 +18,65 @@
> > *
> > */
> >
> > -#include <xsm/xsm.h>
> > -#ifdef CONFIG_MULTIBOOT
> > -#include <asm/boot.h>
> > -#include <xen/multiboot.h>
> > -#include <asm/setup.h>
> > -#endif
> > #include <xen/bitops.h>
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +# include <xen/bootinfo.h>
> > +#endif
> > +#include <xsm/xsm.h>
> > #ifdef CONFIG_HAS_DEVICE_TREE
> > -# include <asm/setup.h>
> > # include <xen/device_tree.h>
> > +#else
> > +#include <asm/boot.h>
> > #endif
> >
> > -#ifdef CONFIG_MULTIBOOT
> > -int __init xsm_multiboot_policy_init(
> > - unsigned long *module_map, const multiboot_info_t *mbi,
> > - void **policy_buffer, size_t *policy_size)
> > +#include <asm/setup.h>
> > +
> > +#ifndef CONFIG_HAS_DEVICE_TREE
> > +int __init xsm_bootmodule_policy_init(
> > + const struct boot_info *bootinfo, const unsigned char **policy_buffer,
> > + size_t *policy_size)
> > {
> > - int i;
> > - module_t *mod = (module_t *)__va(mbi->mods_addr);
> > - int rc = 0;
> > + unsigned long i;
> > + int rc = -ENOENT;
> > u32 *_policy_start;
> > unsigned long _policy_len;
> >
> > - /*
> > - * Try all modules and see whichever could be the binary policy.
> > - * Adjust module_map for the module that is the binary policy.
> > - */
> > - for ( i = mbi->mods_count-1; i >= 1; i-- )
> > - {
> > - if ( !test_bit(i, module_map) )
> > - continue;
> > +#ifdef CONFIG_XSM_FLASK_POLICY
> > + /* Initially set to builtin policy, overriden if boot module is found.
> > */
> > + *policy_buffer = xsm_flask_init_policy;
> > + *policy_size = xsm_flask_init_policy_size;
> > + rc = 0;
> > +#endif
> >
> > - _policy_start = bootstrap_map_multiboot(mod + i);
> > - _policy_len = mod[i].mod_end;
> > + i = bootmodule_index(bootinfo, BOOTMOD_UNKNOWN, 0);
> > + while ( i < bootinfo->nr_mods )
> > + {
> > + _policy_start = bootstrap_map(&bootinfo->mods[i]);
> > + _policy_len = bootinfo->mods[i].size;
> >
> > if ( (xsm_magic_t)(*_policy_start) == XSM_MAGIC )
> > {
> > - *policy_buffer = _policy_start;
> > + *policy_buffer = (unsigned char *)_policy_start;
> > *policy_size = _policy_len;
> >
> > printk("Policy len %#lx, start at %p.\n",
> > _policy_len,_policy_start);
> >
> > - __clear_bit(i, module_map);
> > + bootinfo->mods[i].bootmod_type = BOOTMOD_XSM;
> > + rc = 0;
> > break;
> >
> > }
> >
> > bootstrap_map(NULL);
> > + i = bootmodule_index(bootinfo, BOOTMOD_UNKNOWN, ++i);
> > }
> >
> > return rc;
> > }
> > -#endif
> >
> > -#ifdef CONFIG_HAS_DEVICE_TREE
> > +#else
> > +
> > int __init xsm_dt_policy_init(void **policy_buffer, size_t *policy_size)
> > {
> > struct bootmodule *mod = boot_module_find_by_kind(BOOTMOD_XSM);
> > --
> > 2.25.1
> >
> >
>
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |