[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 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. > 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. > 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. > + 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. > ("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. Also, don't abort() for configuration error, you need to return an error instead. > +} > + > +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. > +} > + > +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, -- Anthony PERARD
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |