[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86: add bitmap of enabled emulated devices
commit 171946abce06541c1d7465376c05eacb22158437 Author: Roger Pau Monné <roger.pau@xxxxxxxxxx> AuthorDate: Tue Nov 10 12:04:04 2015 +0100 Commit: Jan Beulich <jbeulich@xxxxxxxx> CommitDate: Tue Nov 10 12:04:04 2015 +0100 x86: add bitmap of enabled emulated devices 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.pau@xxxxxxxxxx> Reviewed-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Wei Liu <wei.liu2@xxxxxxxxxx> --- 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 -- generated by git-patchbot for /home/xen/git/xen.git#master _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |