[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v4 6/8] tools/xl: enable NS16550-compatible UART emulator for HVM (x86)
On Mon, Aug 25, 2025 at 04:49:58PM +0200, Anthony PERARD wrote: > On Thu, Jul 31, 2025 at 07:22:12PM +0000, dmkhn@xxxxxxxxx wrote: > > diff --git a/docs/man/xl.cfg.5.pod.in b/docs/man/xl.cfg.5.pod.in > > index 5362fb0e9a6f..e1d012274eaf 100644 > > --- a/docs/man/xl.cfg.5.pod.in > > +++ b/docs/man/xl.cfg.5.pod.in > > @@ -3032,14 +3032,17 @@ the domain was created. > > This requires hardware compatibility with the requested version, either > > natively or via hardware backwards compatibility support. > > > > -=item B<vuart="uart"> > > +=item B<vuart=[ "sbsa_uart", "ns16550" ]> > > This syntax here would inditace that `vuart` takes a list of items. You > could write instead: > > vuart="UART" > > which seems more in line with the rest of the man page. Then you can add > some thing like "with UART been one of "sbsa_uart" or "ns16550". It's > possible to also have a sublist, like the `tee` option have. OK, will do. > > > > To enable vuart console, user must specify the following option in the > > -VM config file: > > +VM config file, e.g: > > > > +``` > > This file isn't in markdown, it's in perlpod. Whoops, muscle memory. Thanks. > > > vuart = "sbsa_uart" > > +``` > > > > -Currently, only the "sbsa_uart" model is supported for ARM. > > +Currently, "sbsa_uart" (ARM) and "ns16550" (x86) are the only supported > > +UART models. > > > > =back > > > > diff --git a/tools/libs/light/libxl_arm.c b/tools/libs/light/libxl_arm.c > > index 4a19a8d22bdf..f4721b24763c 100644 > > --- a/tools/libs/light/libxl_arm.c > > +++ b/tools/libs/light/libxl_arm.c > > @@ -92,14 +92,26 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, > > uint32_t virtio_mmio_irq = GUEST_VIRTIO_MMIO_SPI_FIRST; > > int rc; > > > > - /* > > - * If pl011 vuart is enabled then increment the nr_spis to allow > > allocation > > - * of SPI VIRQ for pl011. > > - */ > > - if (d_config->b_info.arch_arm.vuart == LIBXL_VUART_TYPE_SBSA_UART) { > > + switch ( d_config->b_info.vuart ) > > + { > > + case LIBXL_VUART_TYPE_SBSA_UART: > > + /* > > + * If pl011 vuart is enabled then increment the nr_spis to allow > > + * allocation of SPI VIRQ for pl011. > > + */ > > nr_spis += (GUEST_VPL011_SPI - 32) + 1; > > vuart_irq = GUEST_VPL011_SPI; > > vuart_enabled = true; > > + break; > > + > > + case LIBXL_VUART_TYPE_NS16550: > > + LOG(ERROR, "unsupported UART emulator %d\n", > > d_config->b_info.vuart); > > This seems too late in libxl. I think checking if the config value is > correct could be done in one of the *_setdefault() like many other > config check are done. There's > libxl__arch_domain_build_info_setdefault() that could be used. Thanks for the pointer. > > > + abort(); > > + break; > > + > > + case LIBXL_VUART_TYPE_UNKNOWN: > > + default: > > + break; > > } > > > > for (i = 0; i < d_config->num_disks; i++) { > > diff --git a/tools/libs/light/libxl_types.idl > > b/tools/libs/light/libxl_types.idl > > index fe251649f346..fd60c2b26764 100644 > > --- a/tools/libs/light/libxl_types.idl > > +++ b/tools/libs/light/libxl_types.idl > > @@ -276,6 +276,7 @@ libxl_checkpointed_stream = > > Enumeration("checkpointed_stream", [ > > libxl_vuart_type = Enumeration("vuart_type", [ > > (0, "unknown"), > > (1, "sbsa_uart"), > > + (2, "ns16550"), > > ]) > > > > libxl_vkb_backend = Enumeration("vkb_backend", [ > > @@ -722,7 +723,6 @@ libxl_domain_build_info = Struct("domain_build_info",[ > > > > > > ("arch_arm", Struct(None, [("gic_version", libxl_gic_version), > > - ("vuart", libxl_vuart_type), > > arch_arm.vuart is part of libxl's API, it can't be removed. There's some > explanation about "libxl API compatibility" at the top of "libxl.h". > But for this change, you could add `vuart` to `arch_x86`, or if you want > to add `vuart` at the root like you did, you'll need to check that both > `arch_arm.vuart` and `vuart` aren't set at the same time, and have one > of the *_setdefault() function do the work of migrating the option. > > You'll need also a LIBXL_HAVE_* macro in libxl.h, probably named > LIBXL_HAVE_VUART_NS16550. Thanks for details, I will proceed with option 2, adding `vuart` at the root. > > > ("sve_vl", libxl_sve_type), > > ("nr_spis", uint32, {'init_val': > > 'LIBXL_NR_SPIS_DEFAULT'}), > > ])), > > @@ -739,6 +739,7 @@ libxl_domain_build_info = Struct("domain_build_info",[ > > > > ("vpmu", libxl_defbool), > > ("trap_unmapped_accesses", libxl_defbool), > > + ("vuart", libxl_vuart_type), > > > > ], dir=DIR_IN, > > copy_deprecated_fn="libxl__domain_build_info_copy_deprecated", > > diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c > > index 60d4e8661c93..0f039ca65a88 100644 > > --- a/tools/libs/light/libxl_x86.c > > +++ b/tools/libs/light/libxl_x86.c > > @@ -2,6 +2,45 @@ > > #include "libxl_arch.h" > > #include <xen/arch-x86/cpuid.h> > > > > +static void libxl__arch_domain_vuart_assert( > > + libxl__gc *gc, > > + libxl_domain_config *d_config, > > + struct xen_domctl_createdomain *config) > > +{ > > + LOG(ERROR, "unsupported UART emulator %d\n", d_config->b_info.vuart); > > + abort(); > > The name of the function is wrong. It doens't assert anything, and just > abort... > I don't think this function is useful. Yeah, I mostly added it to avoid typing the same error message several times. Will remove. > > Also, don't abort() for configuration error, you need to return an error > instead. Ack. > > > +} > > + > > +static void libxl__arch_domain_vuart_unsupported( > > + libxl__gc *gc, > > + libxl_domain_config *d_config, > > + struct xen_domctl_createdomain *config) > > +{ > > + if ( d_config->b_info.vuart != LIBXL_VUART_TYPE_UNKNOWN ) > > + libxl__arch_domain_vuart_assert(gc, d_config, config); > > This function have also a bad name, it doesn't check if a uart is > unsupported. Will rework. > > > +} > > + > > +static void libxl__arch_domain_vuart_enable( > > + libxl__gc *gc, > > + libxl_domain_config *d_config, > > + struct xen_domctl_createdomain *config) > > +{ > > + switch ( d_config->b_info.vuart ) > > + { > > + case LIBXL_VUART_TYPE_SBSA_UART: > > + libxl__arch_domain_vuart_assert(gc, d_config, config); > > + break; > > + > > + case LIBXL_VUART_TYPE_NS16550: > > + config->arch.emulation_flags |= XEN_X86_EMU_NS16550; > > + break; > > + > > + case LIBXL_VUART_TYPE_UNKNOWN: > > + default: > > + break; > > + } > > +} > > + > > int libxl__arch_domain_prepare_config(libxl__gc *gc, > > libxl_domain_config *d_config, > > struct xen_domctl_createdomain > > *config) > > @@ -9,14 +48,17 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, > > switch(d_config->c_info.type) { > > case LIBXL_DOMAIN_TYPE_HVM: > > config->arch.emulation_flags = (XEN_X86_EMU_ALL & > > ~XEN_X86_EMU_VPCI); > > + libxl__arch_domain_vuart_enable(gc, d_config, config); > > if (!libxl_defbool_val(d_config->b_info.u.hvm.pirq)) > > config->arch.emulation_flags &= ~XEN_X86_EMU_USE_PIRQ; > > break; > > case LIBXL_DOMAIN_TYPE_PVH: > > config->arch.emulation_flags = XEN_X86_EMU_LAPIC; > > + libxl__arch_domain_vuart_unsupported(gc, d_config, config); > > break; > > case LIBXL_DOMAIN_TYPE_PV: > > config->arch.emulation_flags = 0; > > + libxl__arch_domain_vuart_unsupported(gc, d_config, config); > > break; > > default: > > abort(); > > Thanks, Thanks for review! -- Denis > > -- > Anthony PERARD
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |