[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v3 06/24] xen/domain: introduce hardware emulation flags
From: Denis Mukhin <dmukhin@xxxxxxxx> Define an architecture-independent location for describing hardware emulation flags for configuring in-hypervisor emulators. Print d->arch.emulation_flags from 'q' keyhandler for better traceability while debugging in-hypervisor hardware emulators. Also, expanded the error message in arch_domain_create() in x86 case when user-defined domain emulation_flags are incompatible w/ platform supported emulation_flags. Signed-off-by: Denis Mukhin <dmukhin@xxxxxxxx> --- tools/helpers/init-xenstore-domain.c | 1 + tools/libs/light/libxl_x86.c | 5 +- tools/ocaml/libs/xc/xenctrl_stubs.c | 1 + tools/python/xen/lowlevel/xc/xc.c | 5 +- tools/tests/paging-mempool/test-paging-mempool.c | 1 + tools/tests/resource/test-resource.c | 1 + tools/tests/tsx/test-tsx.c | 1 + xen/arch/arm/include/asm/domain.h | 2 + xen/arch/ppc/include/asm/domain.h | 2 + xen/arch/riscv/include/asm/domain.h | 2 + xen/arch/x86/domain.c | 11 +++-- xen/arch/x86/include/asm/domain.h | 3 +- xen/common/keyhandler.c | 1 + xen/include/Makefile | 1 + xen/include/public/arch-x86/xen.h | 30 +----------- xen/include/public/virtdev.h | 61 ++++++++++++++++++++++++ xen/include/xen/domain.h | 1 + 17 files changed, 90 insertions(+), 39 deletions(-) diff --git a/tools/helpers/init-xenstore-domain.c b/tools/helpers/init-xenstore-domain.c index 01ca667d25d15032e9acaff025e83b80aefd2ecb..4b64a417def59c92b8bfb828468591d00d16c105 100644 --- a/tools/helpers/init-xenstore-domain.c +++ b/tools/helpers/init-xenstore-domain.c @@ -16,6 +16,7 @@ #include <xen-tools/common-macros.h> #include <xen-xsm/flask/flask.h> #include <xen/io/xenbus.h> +#include <xen/virtdev.h> #include "init-dom-json.h" diff --git a/tools/libs/light/libxl_x86.c b/tools/libs/light/libxl_x86.c index a3164a3077fec7e1b81a34074894dc646954a49a..80a8a4f17a9a2d7f84f94382e110d511b76604a2 100644 --- a/tools/libs/light/libxl_x86.c +++ b/tools/libs/light/libxl_x86.c @@ -1,5 +1,6 @@ #include "libxl_internal.h" #include "libxl_arch.h" +#include <xen/virtdev.h> #include <xen/arch-x86/cpuid.h> int libxl__arch_domain_prepare_config(libxl__gc *gc, @@ -8,7 +9,9 @@ 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); + config->arch.emulation_flags = XEN_X86_EMU_ALL; + config->arch.emulation_flags &= ~XEN_X86_EMU_VPCI; + if (!libxl_defbool_val(d_config->b_info.u.hvm.pirq)) config->arch.emulation_flags &= ~XEN_X86_EMU_USE_PIRQ; break; diff --git a/tools/ocaml/libs/xc/xenctrl_stubs.c b/tools/ocaml/libs/xc/xenctrl_stubs.c index 863ab3c778cd19637d8c52ec67dac7623be848b5..b693f3458629fb956d543d7491348cf953c67d6f 100644 --- a/tools/ocaml/libs/xc/xenctrl_stubs.c +++ b/tools/ocaml/libs/xc/xenctrl_stubs.c @@ -35,6 +35,7 @@ #define XC_WANT_COMPAT_MAP_FOREIGN_API #include <xenctrl.h> #include <xenguest.h> +#include <xen/virtdev.h> #include <xen-tools/common-macros.h> #include "mmap_stubs.h" diff --git a/tools/python/xen/lowlevel/xc/xc.c b/tools/python/xen/lowlevel/xc/xc.c index 9feb12ae2b16e48cb5d0c3c45044ae226f152f2d..d064e9e7af2fcc09dbd6485e8b9ef648b8068d00 100644 --- a/tools/python/xen/lowlevel/xc/xc.c +++ b/tools/python/xen/lowlevel/xc/xc.c @@ -18,6 +18,7 @@ #include <netdb.h> #include <arpa/inet.h> +#include <xen/virtdev.h> #include <xen/elfnote.h> #include <xen/hvm/hvm_info_table.h> #include <xen/hvm/params.h> @@ -159,9 +160,7 @@ static PyObject *pyxc_domain_create(XcObject *self, #if defined (__i386) || defined(__x86_64__) if ( config.flags & XEN_DOMCTL_CDF_hvm ) - config.arch.emulation_flags = XEN_X86_EMU_ALL & - ~(XEN_X86_EMU_VPCI | - XEN_X86_EMU_USE_PIRQ); + config.arch.emulation_flags = XEN_X86_EMU_BASELINE; #elif defined (__arm__) || defined(__aarch64__) config.arch.gic_version = XEN_DOMCTL_CONFIG_GIC_NATIVE; #else diff --git a/tools/tests/paging-mempool/test-paging-mempool.c b/tools/tests/paging-mempool/test-paging-mempool.c index 1ebc13455ac263b8d2067f3676ba324da61abb83..121ffdcd376ddb324130a441352bf2a53d69b1e9 100644 --- a/tools/tests/paging-mempool/test-paging-mempool.c +++ b/tools/tests/paging-mempool/test-paging-mempool.c @@ -9,6 +9,7 @@ #include <xenforeignmemory.h> #include <xengnttab.h> #include <xen-tools/common-macros.h> +#include <xen/virtdev.h> static unsigned int nr_failures; #define fail(fmt, ...) \ diff --git a/tools/tests/resource/test-resource.c b/tools/tests/resource/test-resource.c index 1b10be16a6b43f8448a6f4ccf8fd093b6556b915..e388bfeec57b1f16a6ccd9ede8ff1c02c0448393 100644 --- a/tools/tests/resource/test-resource.c +++ b/tools/tests/resource/test-resource.c @@ -8,6 +8,7 @@ #include <xenforeignmemory.h> #include <xengnttab.h> #include <xen-tools/common-macros.h> +#include <xen/virtdev.h> static unsigned int nr_failures; #define fail(fmt, ...) \ diff --git a/tools/tests/tsx/test-tsx.c b/tools/tests/tsx/test-tsx.c index 5af04953f340febcf56da9b041338237b71617cb..5681b3c846715e913169277ee4a11ca087013fb6 100644 --- a/tools/tests/tsx/test-tsx.c +++ b/tools/tests/tsx/test-tsx.c @@ -29,6 +29,7 @@ #include <xenctrl.h> #include <xenguest.h> #include <xen-tools/common-macros.h> +#include <xen/virtdev.h> #include "xg_private.h" diff --git a/xen/arch/arm/include/asm/domain.h b/xen/arch/arm/include/asm/domain.h index f1d72c6e48dfeba347b4cd091ca33603c368b7c0..3dedf758bbd1f142debbc7c2460398e1bea822d7 100644 --- a/xen/arch/arm/include/asm/domain.h +++ b/xen/arch/arm/include/asm/domain.h @@ -119,6 +119,8 @@ struct arch_domain void *tee; #endif + /* Hardware emulation flags. */ + uint32_t emulation_flags; } __cacheline_aligned; struct arch_vcpu diff --git a/xen/arch/ppc/include/asm/domain.h b/xen/arch/ppc/include/asm/domain.h index 3a447272c6f28586bf0d610929adbf228579e13f..8aa7b4a6ac0d0850542e94cb28e58c62c3a4b156 100644 --- a/xen/arch/ppc/include/asm/domain.h +++ b/xen/arch/ppc/include/asm/domain.h @@ -21,6 +21,8 @@ struct arch_vcpu { struct arch_domain { struct hvm_domain hvm; + /* Hardware emulation flags. */ + uint32_t emulation_flags; }; #include <xen/sched.h> diff --git a/xen/arch/riscv/include/asm/domain.h b/xen/arch/riscv/include/asm/domain.h index c3d965a559b6ce3661bf17166d0c51853ff295a2..b561e6f4f868e1f4a6670b11111eb8cfe84ca385 100644 --- a/xen/arch/riscv/include/asm/domain.h +++ b/xen/arch/riscv/include/asm/domain.h @@ -18,6 +18,8 @@ struct arch_vcpu { struct arch_domain { struct hvm_domain hvm; + /* Hardware emulation flags. */ + uint32_t emulation_flags; }; #include <xen/sched.h> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 78a13e6812c9120901d0a70fb3bc1bd6a8b6917d..9669886ac95cbee27c9eb72b16386705b470e7b1 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -753,9 +753,7 @@ static bool emulation_flags_ok(const struct domain *d, uint32_t emflags) emflags != (X86_EMU_VPCI | X86_EMU_LAPIC | X86_EMU_IOAPIC) ) return false; if ( !is_hardware_domain(d) && - /* HVM PIRQ feature is user-selectable. */ - (emflags & ~X86_EMU_USE_PIRQ) != - (X86_EMU_ALL & ~(X86_EMU_VPCI | X86_EMU_USE_PIRQ)) && + xen_emflags_allowable(emflags) != XEN_X86_EMU_BASELINE && emflags != X86_EMU_LAPIC ) return false; } @@ -818,9 +816,12 @@ int arch_domain_create(struct domain *d, if ( !emulation_flags_ok(d, emflags) ) { - printk(XENLOG_G_ERR "d%d: Xen does not allow %s domain creation " + printk(XENLOG_G_ERR "%pd: Xen does not allow %s %sdomain creation " "with the current selection of emulators: %#x\n", - d->domain_id, is_hvm_domain(d) ? "HVM" : "PV", emflags); + d, + is_hvm_domain(d) ? "HVM" : "PV", + is_hardware_domain(d) ? "(hardware) " : "", + emflags); return -EOPNOTSUPP; } d->arch.emulation_flags = emflags; diff --git a/xen/arch/x86/include/asm/domain.h b/xen/arch/x86/include/asm/domain.h index b79d6badd71c4d96279555df62fad75fe817a2b6..2532616bca015d0aad9abc35e14948937ab39b8f 100644 --- a/xen/arch/x86/include/asm/domain.h +++ b/xen/arch/x86/include/asm/domain.h @@ -9,6 +9,7 @@ #include <asm/mce.h> #include <asm/vpmu.h> #include <asm/x86_emulate.h> +#include <public/virtdev.h> #include <public/vcpu.h> #include <public/hvm/hvm_info_table.h> @@ -456,7 +457,7 @@ struct arch_domain /* Don't unconditionally inject #GP for unhandled MSRs. */ bool msr_relaxed; - /* Emulated devices enabled bitmap. */ + /* Hardware emulation flags. */ uint32_t emulation_flags; } __cacheline_aligned; diff --git a/xen/common/keyhandler.c b/xen/common/keyhandler.c index 6ea54838d434f9788e309c79119f1dab92fba6e3..7c331bc17bf279d4dd95ec5bbb540a70657cc1d1 100644 --- a/xen/common/keyhandler.c +++ b/xen/common/keyhandler.c @@ -302,6 +302,7 @@ static void cf_check dump_domains(unsigned char key) if ( test_bit(i, &d->watchdog_inuse_map) ) printk(" watchdog %d expires in %d seconds\n", i, (u32)((d->watchdog_timer[i].expires - NOW()) >> 30)); + printk(" emulation_flags %#x\n", d->arch.emulation_flags); arch_dump_domain_info(d); diff --git a/xen/include/Makefile b/xen/include/Makefile index 058b0a566b8b97305554add529ede6ba9ac53a7e..a7820e0e99763fbad36c52ba4f95290798e34893 100644 --- a/xen/include/Makefile +++ b/xen/include/Makefile @@ -15,6 +15,7 @@ headers-y := \ compat/sched.h \ compat/vcpu.h \ compat/version.h \ + compat/virtdev.h \ compat/xen.h \ compat/xlat.h headers-$(CONFIG_X86) += compat/arch-x86/pmu.h diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h index fc2487986642a7694578ab9d2f5f16d09761bff8..fdf05875f26e63d7bcce34a1ad4e931ce22dbdc5 100644 --- a/xen/include/public/arch-x86/xen.h +++ b/xen/include/public/arch-x86/xen.h @@ -261,35 +261,7 @@ typedef struct arch_shared_info arch_shared_info_t; * XEN_DOMCTL_INTERFACE_VERSION. */ struct xen_arch_domainconfig { -#define _XEN_X86_EMU_LAPIC 0 -#define XEN_X86_EMU_LAPIC (1U<<_XEN_X86_EMU_LAPIC) -#define _XEN_X86_EMU_HPET 1 -#define XEN_X86_EMU_HPET (1U<<_XEN_X86_EMU_HPET) -#define _XEN_X86_EMU_PM 2 -#define XEN_X86_EMU_PM (1U<<_XEN_X86_EMU_PM) -#define _XEN_X86_EMU_RTC 3 -#define XEN_X86_EMU_RTC (1U<<_XEN_X86_EMU_RTC) -#define _XEN_X86_EMU_IOAPIC 4 -#define XEN_X86_EMU_IOAPIC (1U<<_XEN_X86_EMU_IOAPIC) -#define _XEN_X86_EMU_PIC 5 -#define XEN_X86_EMU_PIC (1U<<_XEN_X86_EMU_PIC) -#define _XEN_X86_EMU_VGA 6 -#define XEN_X86_EMU_VGA (1U<<_XEN_X86_EMU_VGA) -#define _XEN_X86_EMU_IOMMU 7 -#define XEN_X86_EMU_IOMMU (1U<<_XEN_X86_EMU_IOMMU) -#define _XEN_X86_EMU_PIT 8 -#define XEN_X86_EMU_PIT (1U<<_XEN_X86_EMU_PIT) -#define _XEN_X86_EMU_USE_PIRQ 9 -#define XEN_X86_EMU_USE_PIRQ (1U<<_XEN_X86_EMU_USE_PIRQ) -#define _XEN_X86_EMU_VPCI 10 -#define XEN_X86_EMU_VPCI (1U<<_XEN_X86_EMU_VPCI) - -#define XEN_X86_EMU_ALL (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET | \ - XEN_X86_EMU_PM | XEN_X86_EMU_RTC | \ - XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC | \ - XEN_X86_EMU_VGA | XEN_X86_EMU_IOMMU | \ - XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIRQ |\ - XEN_X86_EMU_VPCI) + /* Hardware emulation flags. */ uint32_t emulation_flags; /* diff --git a/xen/include/public/virtdev.h b/xen/include/public/virtdev.h new file mode 100644 index 0000000000000000000000000000000000000000..27434377ecacfe069a91dea3768d14b0c14e08b4 --- /dev/null +++ b/xen/include/public/virtdev.h @@ -0,0 +1,61 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef XEN__PUBLIC_VIRTDEV_H +#define XEN__PUBLIC_VIRTDEV_H + +/* + * Domain hardware emulation flags. + */ +enum { + VIRTDEV_LAPIC = 1U << 0, + VIRTDEV_HPET = 1U << 1, + VIRTDEV_PM = 1U << 2, + VIRTDEV_RTC = 1U << 3, + VIRTDEV_IOAPIC = 1U << 4, + VIRTDEV_PIC = 1U << 5, + VIRTDEV_VGA = 1U << 6, + VIRTDEV_IOMMU = 1U << 7, + VIRTDEV_PIT = 1U << 8, + VIRTDEV_PIRQ = 1U << 9, + VIRTDEV_PCI = 1U << 10, +}; + +#if defined(__i386__) || defined(__x86_64__) +#define XEN_X86_EMU_LAPIC VIRTDEV_LAPIC +#define XEN_X86_EMU_HPET VIRTDEV_HPET +#define XEN_X86_EMU_PM VIRTDEV_PM +#define XEN_X86_EMU_RTC VIRTDEV_RTC +#define XEN_X86_EMU_IOAPIC VIRTDEV_IOAPIC +#define XEN_X86_EMU_PIC VIRTDEV_PIC +#define XEN_X86_EMU_VGA VIRTDEV_VGA +#define XEN_X86_EMU_IOMMU VIRTDEV_IOMMU +#define XEN_X86_EMU_PIT VIRTDEV_PIT +#define XEN_X86_EMU_USE_PIRQ VIRTDEV_PIRQ +#define XEN_X86_EMU_VPCI VIRTDEV_PCI + +#define XEN_X86_EMU_ALL (XEN_X86_EMU_LAPIC | XEN_X86_EMU_HPET | \ + XEN_X86_EMU_PM | XEN_X86_EMU_RTC | \ + XEN_X86_EMU_IOAPIC | XEN_X86_EMU_PIC | \ + XEN_X86_EMU_VGA | XEN_X86_EMU_IOMMU | \ + XEN_X86_EMU_PIT | XEN_X86_EMU_USE_PIRQ |\ + XEN_X86_EMU_VPCI) + +/* PIRQ (HVM) feature is user-selectable (libxl). */ +#define XEN_X86_EMU_OPTIONAL (XEN_X86_EMU_VPCI | \ + XEN_X86_EMU_USE_PIRQ) + +#define XEN_X86_EMU_BASELINE xen_emflags_allowable(XEN_X86_EMU_ALL) + +#define xen_emflags_allowable(x) ( (x) & ~XEN_X86_EMU_OPTIONAL ) +#endif /* #if defined(__i386__) || defined(__x86_64__) */ + +#endif /* XEN__PUBLIC_VIRTDEV_H */ + +/* + * Local variables: + * mode: C + * c-file-style: "BSD" + * c-basic-offset: 4 + * tab-width: 4 + * indent-tabs-mode: nil + * End: + */ diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h index 3de56352911347a54cce310f0211bcc213d8a08d..eec093e9e167c14a536383422d280ed5ee56f698 100644 --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -5,6 +5,7 @@ #include <xen/numa.h> #include <xen/types.h> +#include <public/virtdev.h> #include <public/xen.h> struct guest_area { -- 2.34.1
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |