|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4 6/8] tools/xl: enable NS16550-compatible UART emulator for HVM (x86)
From: Denis Mukhin <dmukhin@xxxxxxxx>
Enable UART emulator to be individually configured per HVM-domain.
Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx>
---
Changes since v3:
- new patch
---
docs/man/xl.cfg.5.pod.in | 9 ++++--
tools/golang/xenlight/helpers.gen.go | 4 +--
tools/golang/xenlight/types.gen.go | 3 +-
tools/libs/light/libxl_arm.c | 26 ++++++++++++-----
tools/libs/light/libxl_create.c | 2 +-
tools/libs/light/libxl_types.idl | 3 +-
tools/libs/light/libxl_x86.c | 42 ++++++++++++++++++++++++++++
tools/ocaml/libs/xc/xenctrl.ml | 1 +
tools/ocaml/libs/xc/xenctrl.mli | 1 +
tools/xl/xl_parse.c | 2 +-
xen/arch/x86/domain.c | 5 ++--
11 files changed, 80 insertions(+), 18 deletions(-)
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" ]>
To enable vuart console, user must specify the following option in the
-VM config file:
+VM config file, e.g:
+```
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/golang/xenlight/helpers.gen.go
b/tools/golang/xenlight/helpers.gen.go
index b43aad7d0064..e56af8a8a8c5 100644
--- a/tools/golang/xenlight/helpers.gen.go
+++ b/tools/golang/xenlight/helpers.gen.go
@@ -1160,7 +1160,6 @@ x.TypeUnion = &typePvh
default:
return fmt.Errorf("invalid union key '%v'", x.Type)}
x.ArchArm.GicVersion = GicVersion(xc.arch_arm.gic_version)
-x.ArchArm.Vuart = VuartType(xc.arch_arm.vuart)
x.ArchArm.SveVl = SveType(xc.arch_arm.sve_vl)
x.ArchArm.NrSpis = uint32(xc.arch_arm.nr_spis)
if err := x.ArchX86.MsrRelaxed.fromC(&xc.arch_x86.msr_relaxed);err != nil {
@@ -1169,6 +1168,7 @@ return fmt.Errorf("converting field ArchX86.MsrRelaxed:
%v", err)
x.Altp2M = Altp2MMode(xc.altp2m)
x.Altp2MCount = uint32(xc.altp2m_count)
x.VmtraceBufKb = int(xc.vmtrace_buf_kb)
+x.Vuart = VuartType(xc.vuart)
if err := x.Vpmu.fromC(&xc.vpmu);err != nil {
return fmt.Errorf("converting field Vpmu: %v", err)
}
@@ -1695,7 +1695,6 @@ break
default:
return fmt.Errorf("invalid union key '%v'", x.Type)}
xc.arch_arm.gic_version = C.libxl_gic_version(x.ArchArm.GicVersion)
-xc.arch_arm.vuart = C.libxl_vuart_type(x.ArchArm.Vuart)
xc.arch_arm.sve_vl = C.libxl_sve_type(x.ArchArm.SveVl)
xc.arch_arm.nr_spis = C.uint32_t(x.ArchArm.NrSpis)
if err := x.ArchX86.MsrRelaxed.toC(&xc.arch_x86.msr_relaxed); err != nil {
@@ -1704,6 +1703,7 @@ return fmt.Errorf("converting field ArchX86.MsrRelaxed:
%v", err)
xc.altp2m = C.libxl_altp2m_mode(x.Altp2M)
xc.altp2m_count = C.uint32_t(x.Altp2MCount)
xc.vmtrace_buf_kb = C.int(x.VmtraceBufKb)
+xc.vuart = C.libxl_vuart_type(x.Vuart)
if err := x.Vpmu.toC(&xc.vpmu); err != nil {
return fmt.Errorf("converting field Vpmu: %v", err)
}
diff --git a/tools/golang/xenlight/types.gen.go
b/tools/golang/xenlight/types.gen.go
index 4777f528b52c..2f4153d2510b 100644
--- a/tools/golang/xenlight/types.gen.go
+++ b/tools/golang/xenlight/types.gen.go
@@ -253,6 +253,7 @@ type VuartType int
const(
VuartTypeUnknown VuartType = 0
VuartTypeSbsaUart VuartType = 1
+VuartTypeNs16550 VuartType = 2
)
type VkbBackend int
@@ -596,7 +597,6 @@ Type DomainType
TypeUnion DomainBuildInfoTypeUnion
ArchArm struct {
GicVersion GicVersion
-Vuart VuartType
SveVl SveType
NrSpis uint32
}
@@ -608,6 +608,7 @@ Altp2MCount uint32
VmtraceBufKb int
Vpmu Defbool
TrapUnmappedAccesses Defbool
+Vuart VuartType
}
type DomainBuildInfoTypeUnion interface {
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);
+ abort();
+ break;
+
+ case LIBXL_VUART_TYPE_UNKNOWN:
+ default:
+ break;
}
for (i = 0; i < d_config->num_disks; i++) {
@@ -1372,7 +1384,7 @@ next_resize:
FDT( make_timer_node(gc, fdt, ainfo, state->clock_frequency) );
FDT( make_hypervisor_node(gc, fdt, vers) );
- if (info->arch_arm.vuart == LIBXL_VUART_TYPE_SBSA_UART)
+ if (info->vuart == LIBXL_VUART_TYPE_SBSA_UART)
FDT( make_vpl011_uart_node(gc, fdt, ainfo, dom) );
if (info->tee == LIBXL_TEE_TYPE_OPTEE)
@@ -1725,7 +1737,7 @@ int libxl__arch_build_dom_finish(libxl__gc *gc,
{
int rc = 0, ret;
- if (info->arch_arm.vuart != LIBXL_VUART_TYPE_SBSA_UART) {
+ if (info->vuart != LIBXL_VUART_TYPE_SBSA_UART) {
rc = 0;
goto out;
}
diff --git a/tools/libs/light/libxl_create.c b/tools/libs/light/libxl_create.c
index 4042ae1a8957..cfd7e827867a 100644
--- a/tools/libs/light/libxl_create.c
+++ b/tools/libs/light/libxl_create.c
@@ -1815,7 +1815,7 @@ static void domcreate_launch_dm(libxl__egc *egc,
libxl__multidev *multidev,
&d_config->vfbs[i]);
}
- if (d_config->b_info.arch_arm.vuart == LIBXL_VUART_TYPE_SBSA_UART) {
+ if (d_config->b_info.vuart == LIBXL_VUART_TYPE_SBSA_UART) {
init_console_info(gc, &vuart, 0);
vuart.backend_domid = state->console_domid;
libxl__device_vuart_add(gc, domid, &vuart, state);
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),
("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();
+}
+
+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);
+}
+
+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();
diff --git a/tools/ocaml/libs/xc/xenctrl.ml b/tools/ocaml/libs/xc/xenctrl.ml
index 7e1aabad6cba..4539e78bb283 100644
--- a/tools/ocaml/libs/xc/xenctrl.ml
+++ b/tools/ocaml/libs/xc/xenctrl.ml
@@ -47,6 +47,7 @@ type x86_arch_emulation_flags =
| X86_EMU_PIT
| X86_EMU_USE_PIRQ
| X86_EMU_VPCI
+ | X86_EMU_NS16550
type x86_arch_misc_flags =
| X86_MSR_RELAXED
diff --git a/tools/ocaml/libs/xc/xenctrl.mli b/tools/ocaml/libs/xc/xenctrl.mli
index f44dba61aeab..66a98180d99b 100644
--- a/tools/ocaml/libs/xc/xenctrl.mli
+++ b/tools/ocaml/libs/xc/xenctrl.mli
@@ -41,6 +41,7 @@ type x86_arch_emulation_flags =
| X86_EMU_PIT
| X86_EMU_USE_PIRQ
| X86_EMU_VPCI
+ | X86_EMU_NS16550
type x86_arch_misc_flags =
| X86_MSR_RELAXED
diff --git a/tools/xl/xl_parse.c b/tools/xl/xl_parse.c
index 28cdbf07c213..b0d266b5bf63 100644
--- a/tools/xl/xl_parse.c
+++ b/tools/xl/xl_parse.c
@@ -1498,7 +1498,7 @@ void parse_config_data(const char *config_source,
b_info->max_vcpus = l;
if (!xlu_cfg_get_string(config, "vuart", &buf, 0)) {
- if (libxl_vuart_type_from_string(buf, &b_info->arch_arm.vuart)) {
+ if (libxl_vuart_type_from_string(buf, &b_info->vuart)) {
fprintf(stderr, "ERROR: invalid value \"%s\" for \"vuart\"\n",
buf);
exit(1);
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 7fd4f7a831dc..6a010a509a60 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -780,9 +780,10 @@ static bool emulation_flags_ok(const struct domain *d,
uint32_t emflags)
/* HVM domU */
{
.caps = CAP_HVM | CAP_DOMU,
- .min = X86_EMU_ALL & ~(X86_EMU_VPCI | X86_EMU_USE_PIRQ),
+ .min = X86_EMU_ALL & ~(X86_EMU_VPCI | X86_EMU_USE_PIRQ |
+ X86_EMU_NS16550),
/* HVM PIRQ feature is user-selectable. */
- .opt = X86_EMU_USE_PIRQ,
+ .opt = X86_EMU_USE_PIRQ | X86_EMU_NS16550,
},
#endif /* #ifdef CONFIG_HVM */
};
--
2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |