Le 12/11/2025 à 15:51, Teddy Astie a écrit :
> Introduce a new option to start the BSP vCPU in x2APIC mode instead
> of xAPIC mode. Expose this in xl through a new "x2apic_mode" option.
>
> Signed-off-by: Teddy Astie <[email protected]>
> ---
> Cc: Andrew Cooper <[email protected]>
> Cc: Jan Beulich <[email protected]>
> Cc: Alejandro Vallejo <[email protected]>
> Cc: Grygorii Strashko <[email protected]>
>
> Later on, we could consider with this option to use x2APIC ACPI
> tables instead of xAPIC ones.
>
> There is also some room into introducing a new Kconfig option to
> only support x2apic mode, which would change how the "Xen default"
> would behave.
>
> changed in v2:
>   - only pre-enable instead of forcing
>   - use domain builder to pre-enable instead of introducing a new domain 
> creation flag
>
> v1:
> - 
> https://lore.kernel.org/xen-devel/d498a50f6187b362ac5da3c6a7a7c348f35dc4b3.1761761288.git.teddy.as...@vates.tech/
> ---
>   docs/man/xl.cfg.5.pod.in         | 16 ++++++++++++
>   tools/include/libxl.h            |  8 ++++++
>   tools/include/xenguest.h         |  4 +++
>   tools/libs/guest/xg_dom_x86.c    | 42 ++++++++++++++++++++++++++++++++
>   tools/libs/light/libxl_types.idl |  1 +
>   tools/libs/light/libxl_x86.c     |  4 +++
>   tools/xl/xl_parse.c              | 11 +++++++++
>   7 files changed, 86 insertions(+)
>
> diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in
> index ad1553c5e9..0f7a89fe92 100644
> --- a/docs/man/xl.cfg.5.pod.in
> +++ b/docs/man/xl.cfg.5.pod.in
> @@ -3198,6 +3198,22 @@ option.
>
>   If using this option is necessary to fix an issue, please report a bug.
>
> +=item B<x2apic_mode="MODE">
> +
> +Sets the x2apic mode of the domain. The valid values are as follows:
> +
> +=over 4
> +
> +=item B<"default">
> +
> +Use default Xen LAPIC behavior.
> +
> +=item B<"pre_enable">
> +
> +Initially enable x2apic for the BSP of the domain.
> +
> +=back
> +
>   =back
>
>   =head1 SEE ALSO
> diff --git a/tools/include/libxl.h b/tools/include/libxl.h
> index bc35e412da..9850e8aa41 100644
> --- a/tools/include/libxl.h
> +++ b/tools/include/libxl.h
> @@ -1537,6 +1537,14 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, 
> const libxl_mac *src);
>    */
>   #define LIBXL_HAVE_XEN_PLATFORM_PCI_BAR_UC
>
> +/*
> + * LIBXL_HAVE_X2APIC_PREENABLE
> + *
> + * libxl_domain_build_info contains a boolean 'arch_x86.x2apic_preenable' 
> field
> + * to initially set the BSP LAPIC in x2APIC mode.
> + */
> +#define LIBXL_HAVE_X2APIC_PREENABLE
> +
>   typedef char **libxl_string_list;
>   void libxl_string_list_dispose(libxl_string_list *sl);
>   int libxl_string_list_length(const libxl_string_list *sl);
> diff --git a/tools/include/xenguest.h b/tools/include/xenguest.h
> index c88958faa9..408a0c77e8 100644
> --- a/tools/include/xenguest.h
> +++ b/tools/include/xenguest.h
> @@ -223,6 +223,10 @@ struct xc_dom_image {
>       /* If unset disables the setup of the IOREQ pages. */
>       bool device_model;
>
> +#if defined(__i386__) || defined(__x86_64__)
> +    bool preenable_x2apic; /* 1 makes x2APIC enabled initially, 0 keeps 
> default Xen behavior */
> +#endif
> +
>       /* BIOS/Firmware passed to HVMLOADER */
>       struct xc_hvm_firmware_module system_firmware_module;
>
> diff --git a/tools/libs/guest/xg_dom_x86.c b/tools/libs/guest/xg_dom_x86.c
> index a82b481a12..43ada5a6ac 100644
> --- a/tools/libs/guest/xg_dom_x86.c
> +++ b/tools/libs/guest/xg_dom_x86.c
> @@ -58,6 +58,9 @@
>   #define MTRR_TYPE_WRBACK     6
>   #define MTRR_DEF_TYPE_ENABLE (1u << 11)
>
> +#define APIC_BASE_EXTD   (1UL << 10)
> +#define APIC_BASE_ENABLE (1UL << 11)
> +
>   #define SPECIALPAGE_PAGING   0
>   #define SPECIALPAGE_ACCESS   1
>   #define SPECIALPAGE_SHARING  2
> @@ -1131,6 +1134,45 @@ static int vcpu_hvm(struct xc_dom_image *dom)
>           }
>       }
>
> +    if ( dom->preenable_x2apic )
> +    {
> +        struct {
> +            struct hvm_save_descriptor header_d;
> +            HVM_SAVE_TYPE(HEADER) header;
> +            struct hvm_save_descriptor lapic_d;
> +            HVM_SAVE_TYPE(LAPIC) lapic;
> +            struct hvm_save_descriptor end_d;
> +            HVM_SAVE_TYPE(END) end;
> +        } lapic = {
> +            .header_d = bsp_ctx.header_d,
> +            .header = bsp_ctx.header,
> +            .lapic_d.typecode = HVM_SAVE_CODE(LAPIC),
> +            .lapic_d.length = HVM_SAVE_LENGTH(LAPIC),
> +            .end_d = bsp_ctx.end_d,
> +            .end = bsp_ctx.end,
> +        };
> +        const HVM_SAVE_TYPE(LAPIC) *lapic_record =
> +            hvm_get_save_record(full_ctx, HVM_SAVE_CODE(LAPIC), 0);
> +
> +        if ( !lapic_record )
> +        {
> +            xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> +                         "%s: unable to get LAPIC save record", __func__);
> +            goto out;
> +        }
> +
> +        memcpy(&lapic.lapic, lapic_record, sizeof(lapic.lapic));
> +
> +        lapic.lapic.apic_base_msr |= APIC_BASE_ENABLE | APIC_BASE_EXTD;
> +
> +        rc = xc_domain_hvm_setcontext(dom->xch, dom->guest_domid,
> +                                      (uint8_t *)&lapic, sizeof(lapic));
> +
> +        if ( rc != 0 )
> +            xc_dom_panic(dom->xch, XC_INTERNAL_ERROR,
> +                         "%s: SETHVMCONTEXT failed (rc=%d)", __func__, rc);
> +    }
> +
>       /*
>        * Loading the BSP context should be done in the last call to 
> setcontext,
>        * since each setcontext call will put all vCPUs down.
> diff --git a/tools/libs/light/libxl_types.idl 
> b/tools/libs/light/libxl_types.idl
> index d64a573ff3..9fdf89d88b 100644
> --- a/tools/libs/light/libxl_types.idl
> +++ b/tools/libs/light/libxl_types.idl
> @@ -738,6 +738,7 @@ libxl_domain_build_info = Struct("domain_build_info",[
>                                  ("arm_sci", libxl_arm_sci),
>                                 ])),
>       ("arch_x86", Struct(None, [("msr_relaxed", libxl_defbool),
> +                               ("x2apic_preenable", libxl_defbool)
>                                 ])),
>       # Alternate p2m is not bound to any architecture or guest type, as it is
>       # supported by x86 HVM and ARM support is planned.
> diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c
> index 60d4e8661c..f9725f069a 100644
> --- a/tools/libs/light/libxl_x86.c
> +++ b/tools/libs/light/libxl_x86.c
> @@ -555,6 +555,9 @@ int libxl__arch_domain_init_hw_description(libxl__gc *gc,
>                                              libxl__domain_build_state *state,
>                                              struct xc_dom_image *dom)
>   {
> +    if (libxl_defbool_val(d_config->b_info.arch_x86.x2apic_preenable))
> +        dom->preenable_x2apic = true;
> +
>       return 0;
>   }
>
> @@ -818,6 +821,7 @@ int libxl__arch_domain_build_info_setdefault(libxl__gc 
> *gc,
>   {
>       libxl_defbool_setdefault(&b_info->acpi, true);
>       libxl_defbool_setdefault(&b_info->arch_x86.msr_relaxed, false);
> +    libxl_defbool_setdefault(&b_info->arch_x86.x2apic_preenable, false);
>       libxl_defbool_setdefault(&b_info->trap_unmapped_accesses, false);
>
>       if (b_info->type == LIBXL_DOMAIN_TYPE_HVM) {
> diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
> index af86d3186d..92bf9d2ad5 100644
> --- a/tools/xl/xl_parse.c
> +++ b/tools/xl/xl_parse.c
> @@ -3040,6 +3040,17 @@ skip_usbdev:
>                       "WARNING: msr_relaxed will be removed in future 
> versions.\n"
>                       "If it fixes an issue you are having please report to "
>                       "[email protected].\n");
> +
> +    if (!xlu_cfg_get_string(config, "x2apic_mode", &buf, 1)) {
> +        if (!strcmp(buf, "pre_enable"))
> +            libxl_defbool_set(&b_info->arch_x86.x2apic_preenable, true);
> +        else if (!strcmp(buf, "default"))
> +            libxl_defbool_set(&b_info->arch_x86.x2apic_preenable, false);
> +        else {
> +            fprintf(stderr, "Unknown x2apic mode \"%s\" specified\n", buf);
> +            exit(EXIT_FAILURE);
> +        }
> +    }
>
>       xlu_cfg_get_defbool(config, "vpmu", &b_info->vpmu, 0);
>

I haven't received a feedback on this. Aside the eventual future use of
x2APIC ACPI tables, are there objections for this patch ?


--
Teddy Astie | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech



Reply via email to