Introduce a bitmap in x86 xen_arch_domainconfig that allows enabling or disabling specific devices emulated inside of Xen for HVM guests.
Signed-off-by: Roger Pau Monné <roger....@citrix.com> Reviewed-by: Andrew Cooper <andrew.coop...@citrix.com> Acked-by: Wei Liu <wei.l...@citrix.com> Cc: Ian Jackson <ian.jack...@eu.citrix.com> Cc: Stefano Stabellini <stefano.stabell...@eu.citrix.com> Cc: Ian Campbell <ian.campb...@citrix.com> Cc: Wei Liu <wei.l...@citrix.com> Cc: Jan Beulich <jbeul...@suse.com> Cc: Andrew Cooper <andrew.coop...@citrix.com> Cc: George Dunlap <george.dun...@eu.citrix.com> --- Changes since v7: - Make the has_* macros actual booleans. - Allow the idle domain to be created without an arch specific config. - Check that PVH guests don't try to enable any emulated devices. - Add a flag for disabling the PIT. - Rename XEN_X86_EMU_PMTIMER into XEN_X86_EMU_PM and also rename the related macro. Changes since v6: - Define XEN_X86_EMU_ALL to contain all the possible emulated devices. - Remove full stops form the printks added to arch_domain_create. - Add Wei Liu Acked-by. - Added a check to x86 arch_domain_create in order to make sure a non-null config is always provided. - Check that emulation_flags is always 0 for PV guests. - Fix x86 callers of domain_create in order to make sure a non-null arch config is always provided. - Removed XEN_X86_EMU_PMU. - Removed Andrew Cooper's Reviewed-by, since the hypervisor side code has changed substantially. Changes since v4: - Add a check to make sure the emulation bitmap is sane (undefined bits are all 0s). - Add Andrew Cooper Reviewed-by. Changes since v3: - Return EOPNOTSUPP instead of ENOPERM if an invalid emulation mask is used. - Fix error messages (prefix them with d%d and use %#x instead of 0x%x). - Clearly state in the public header that emulation_flags should only be used with HVM guests. - Add a XEN_X86 prefix to the emulation flags defines. - Properly parenthese the has_* marcos. --- tools/libxl/libxl_x86.c | 5 ++++- xen/arch/x86/domain.c | 27 +++++++++++++++++++++++++++ xen/arch/x86/setup.c | 3 ++- xen/common/schedule.c | 1 - xen/include/asm-x86/domain.h | 13 +++++++++++++ xen/include/public/arch-x86/xen.h | 26 +++++++++++++++++++++++++- 6 files changed, 71 insertions(+), 4 deletions(-) diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index c992261..183b6c2 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -7,7 +7,10 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, libxl_domain_config *d_config, xc_domain_configuration_t *xc_config) { - /* No specific configuration right now */ + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM) + xc_config->emulation_flags = XEN_X86_EMU_ALL; + else + xc_config->emulation_flags = 0; return 0; } diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index fe3be30..3f9e5d2 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -496,6 +496,9 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags, int i, paging_initialised = 0; int rc = -ENOMEM; + if ( config == NULL && !is_idle_domain(d) ) + return -EINVAL; + d->arch.s3_integrity = !!(domcr_flags & DOMCRF_s3_integrity); INIT_LIST_HEAD(&d->arch.pdev_list); @@ -517,6 +520,30 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags, d->domain_id); } + if ( is_idle_domain(d) ) + { + d->arch.emulation_flags = 0; + } + else + { + if ( (config->emulation_flags & ~XEN_X86_EMU_ALL) != 0 ) + { + printk(XENLOG_G_ERR "d%d: Invalid emulation bitmap: %#x\n", + d->domain_id, config->emulation_flags); + return -EINVAL; + } + if ( is_hvm_domain(d) ? (config->emulation_flags != XEN_X86_EMU_ALL) + : (config->emulation_flags != 0) ) + { + printk(XENLOG_G_ERR "d%d: Xen does not allow %s domain creation " + "with the current selection of emulators: %#x\n", + d->domain_id, is_hvm_domain(d) ? "HVM" : "PV", + config->emulation_flags); + return -EOPNOTSUPP; + } + d->arch.emulation_flags = config->emulation_flags; + } + if ( has_hvm_container_domain(d) ) { d->arch.hvm_domain.hap_enabled = diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 4ed0110..6714473 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -582,6 +582,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) .parity = 'n', .stop_bits = 1 }; + struct xen_arch_domainconfig config = { .emulation_flags = 0 }; /* Critical region without IDT or TSS. Any fault is deadly! */ @@ -1390,7 +1391,7 @@ void __init noreturn __start_xen(unsigned long mbi_p) * x86 doesn't support arch-configuration. So it's fine to pass * NULL. */ - dom0 = domain_create(0, domcr_flags, 0, NULL); + dom0 = domain_create(0, domcr_flags, 0, &config); if ( IS_ERR(dom0) || (alloc_dom0_vcpu0(dom0) == NULL) ) panic("Error creating domain 0"); diff --git a/xen/common/schedule.c b/xen/common/schedule.c index 292e9a0..20f5f56 100644 --- a/xen/common/schedule.c +++ b/xen/common/schedule.c @@ -1474,7 +1474,6 @@ void __init scheduler_init(void) sched_ratelimit_us = SCHED_DEFAULT_RATELIMIT_US; } - /* There is no need of arch-specific configuration for an idle domain */ idle_domain = domain_create(DOMID_IDLE, 0, 0, NULL); BUG_ON(IS_ERR(idle_domain)); idle_domain->vcpu = idle_vcpu; diff --git a/xen/include/asm-x86/domain.h b/xen/include/asm-x86/domain.h index f1d7ed6..c825975 100644 --- a/xen/include/asm-x86/domain.h +++ b/xen/include/asm-x86/domain.h @@ -387,8 +387,21 @@ struct arch_domain /* Mem_access emulation control */ bool_t mem_access_emulate_enabled; bool_t mem_access_emulate_each_rep; + + /* Emulated devices enabled bitmap. */ + uint32_t emulation_flags; } __cacheline_aligned; +#define has_vlapic(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_LAPIC)) +#define has_vhpet(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_HPET)) +#define has_vpm(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_PM)) +#define has_vrtc(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_RTC)) +#define has_vioapic(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_IOAPIC)) +#define has_vpic(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_PIC)) +#define has_vvga(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_VGA)) +#define has_viommu(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_IOMMU)) +#define has_vpit(d) (!!((d)->arch.emulation_flags & XEN_X86_EMU_PIT)) + #define has_arch_pdevs(d) (!list_empty(&(d)->arch.pdev_list)) #define gdt_ldt_pt_idx(v) \ diff --git a/xen/include/public/arch-x86/xen.h b/xen/include/public/arch-x86/xen.h index 5187560..cdd93c1 100644 --- a/xen/include/public/arch-x86/xen.h +++ b/xen/include/public/arch-x86/xen.h @@ -265,7 +265,31 @@ typedef struct arch_shared_info arch_shared_info_t; * XEN_DOMCTL_INTERFACE_VERSION. */ struct xen_arch_domainconfig { - char dummy; +#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_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) + uint32_t emulation_flags; }; #endif -- 1.9.5 (Apple Git-50.3) _______________________________________________ Xen-devel mailing list Xen-devel@lists.xen.org http://lists.xen.org/xen-devel