From patchwork Wed Jan 20 11:57:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Roger Pau Monne X-Patchwork-Id: 8071441 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 154F59F6FA for ; Wed, 20 Jan 2016 12:00:39 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E99EF20437 for ; Wed, 20 Jan 2016 12:00:37 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 3E9922026F for ; Wed, 20 Jan 2016 12:00:28 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aLrOT-0001aL-5l; Wed, 20 Jan 2016 11:57:45 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aLrOR-0001ZF-Sx for xen-devel@lists.xenproject.org; Wed, 20 Jan 2016 11:57:44 +0000 Received: from [193.109.254.147] by server-5.bemta-14.messagelabs.com id C5/22-23366-7367F965; Wed, 20 Jan 2016 11:57:43 +0000 X-Env-Sender: prvs=820e2e984=roger.pau@citrix.com X-Msg-Ref: server-2.tower-27.messagelabs.com!1453291052!16142636!4 X-Originating-IP: [66.165.176.89] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni44OSA9PiAyMDMwMDc=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 62224 invoked from network); 20 Jan 2016 11:57:42 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-2.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 20 Jan 2016 11:57:42 -0000 X-IronPort-AV: E=Sophos;i="5.22,320,1449532800"; d="scan'208";a="326402006" From: Roger Pau Monne To: Date: Wed, 20 Jan 2016 12:57:24 +0100 Message-ID: <1453291044-83976-6-git-send-email-roger.pau@citrix.com> X-Mailer: git-send-email 1.9.5 (Apple Git-50.3) In-Reply-To: <1453291044-83976-1-git-send-email-roger.pau@citrix.com> References: <1453291044-83976-1-git-send-email-roger.pau@citrix.com> MIME-Version: 1.0 X-DLP: MIA1 Cc: Wei Liu , Ian Jackson , Ian Campbell , Roger Pau Monne Subject: [Xen-devel] [PATCH v3 5/5] libxl: add options to enable/disable emulated devices X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Allow enabling or disabling emulated devices from the libxl domain configuration file. For HVM guests with a device model all the emulated devices are enabled. For HVM guests without a device model no devices are enabled by default, although they can be enabled using the options provided. The arbiter of whether a combination is posible or not is always Xen, libxl doesn't do any kind of check. This set of options is also propagated inside of the libxl migration record as part of the contents of the libxl_domain_build_info struct. Signed-off-by: Roger Pau Monné --- Cc: Ian Jackson Cc: Ian Campbell Cc: Wei Liu --- docs/man/xl.cfg.pod.5 | 39 +++++++++++++++++++++++++++++++++++++++ tools/libxl/libxl.h | 11 +++++++++++ tools/libxl/libxl_create.c | 21 ++++++++++++++++++++- tools/libxl/libxl_types.idl | 6 ++++++ tools/libxl/libxl_x86.c | 33 ++++++++++++++++++++++++++++----- tools/libxl/xl_cmdimpl.c | 7 +++++++ 6 files changed, 111 insertions(+), 6 deletions(-) diff --git a/docs/man/xl.cfg.pod.5 b/docs/man/xl.cfg.pod.5 index 8899f75..46d4529 100644 --- a/docs/man/xl.cfg.pod.5 +++ b/docs/man/xl.cfg.pod.5 @@ -1762,6 +1762,45 @@ See F for more information. =back +=head3 HVM without a device model options + +This options can be used to change the set of emulated devices provided +to guests without a device model. Note that Xen might not support all +possible combinations. By default HVM guests without a device model +don't have any of them enabled. + +=over 4 + +=item B + +Enables or disables the Local APIC. + +=item B + +Enables or disables the IO APIC. + +=item B + +Enables or disables the RTC. + +=item B + +Enables or disables the ACPI power management timer and control interfaces. + +=item B + +Enables or disables the PIC. + +=item B + +Enables or disables the PIT. + +=item B + +Enables or disables the HPET. + +=back + =head2 Device-Model Options The following options control the selection of the device-model. This diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index 7114491..fc4ff1d 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -876,6 +876,17 @@ void libxl_mac_copy(libxl_ctx *ctx, libxl_mac *dst, libxl_mac *src); */ #define LIBXL_HAVE_DEVICE_MODEL_VERSION_NONE 1 +/* + * LIBXL_HAVE_EMULATED_DEVS_OPTIONS + * + * In the case that LIBXL_HAVE_EMULATED_DEVS_OPTIONS is set libxl + * allows enabling or disabling emulated devices for HVM guests + * without a device model. The following fields are added to the + * hvm structure inside of libxl_domain_build_info: lapic, ioapic, + * rtc, power_management, pic, pit. + */ +#define LIBXL_HAVE_EMULATED_DEVS_OPTIONS 1 + typedef char **libxl_string_list; void libxl_string_list_dispose(libxl_string_list *sl); int libxl_string_list_length(const libxl_string_list *sl); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index ba4c9e8..8a76a6b 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -295,13 +295,32 @@ int libxl__domain_build_info_setdefault(libxl__gc *gc, libxl_defbool_setdefault(&b_info->u.hvm.acpi_s4, true); libxl_defbool_setdefault(&b_info->u.hvm.nx, true); libxl_defbool_setdefault(&b_info->u.hvm.viridian, false); - libxl_defbool_setdefault(&b_info->u.hvm.hpet, true); libxl_defbool_setdefault(&b_info->u.hvm.vpt_align, true); libxl_defbool_setdefault(&b_info->u.hvm.nested_hvm, false); libxl_defbool_setdefault(&b_info->u.hvm.altp2m, false); libxl_defbool_setdefault(&b_info->u.hvm.usb, false); libxl_defbool_setdefault(&b_info->u.hvm.xen_platform_pci, true); + if (b_info->type == LIBXL_DOMAIN_TYPE_HVM && + b_info->device_model_version == LIBXL_DEVICE_MODEL_VERSION_NONE) + { + libxl_defbool_setdefault(&b_info->u.hvm.hpet, false); + libxl_defbool_setdefault(&b_info->u.hvm.lapic, false); + libxl_defbool_setdefault(&b_info->u.hvm.ioapic, false); + libxl_defbool_setdefault(&b_info->u.hvm.rtc, false); + libxl_defbool_setdefault(&b_info->u.hvm.power_management, false); + libxl_defbool_setdefault(&b_info->u.hvm.pic, false); + libxl_defbool_setdefault(&b_info->u.hvm.pit, false); + } else { + libxl_defbool_setdefault(&b_info->u.hvm.hpet, true); + libxl_defbool_setdefault(&b_info->u.hvm.lapic, true); + libxl_defbool_setdefault(&b_info->u.hvm.ioapic, true); + libxl_defbool_setdefault(&b_info->u.hvm.rtc, true); + libxl_defbool_setdefault(&b_info->u.hvm.power_management, true); + libxl_defbool_setdefault(&b_info->u.hvm.pic, true); + libxl_defbool_setdefault(&b_info->u.hvm.pit, true); + } + libxl_defbool_setdefault(&b_info->u.hvm.spice.enable, false); if (!libxl_defbool_val(b_info->u.hvm.spice.enable) && (b_info->u.hvm.spice.usbredirection > 0) ){ diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 92c95e5..8a21cda 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -519,6 +519,12 @@ libxl_domain_build_info = Struct("domain_build_info",[ ("serial_list", libxl_string_list), ("rdm", libxl_rdm_reserve), ("rdm_mem_boundary_memkb", MemKB), + ("lapic", libxl_defbool), + ("ioapic", libxl_defbool), + ("rtc", libxl_defbool), + ("power_management", libxl_defbool), + ("pic", libxl_defbool), + ("pit", libxl_defbool), ])), ("pv", Struct(None, [("kernel", string), ("slack_memkb", MemKB), diff --git a/tools/libxl/libxl_x86.c b/tools/libxl/libxl_x86.c index 46cfafb..92f25fd 100644 --- a/tools/libxl/libxl_x86.c +++ b/tools/libxl/libxl_x86.c @@ -7,15 +7,38 @@ int libxl__arch_domain_prepare_config(libxl__gc *gc, libxl_domain_config *d_config, xc_domain_configuration_t *xc_config) { + struct libxl_domain_build_info *info = &d_config->b_info; - if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_HVM && - d_config->b_info.device_model_version != - LIBXL_DEVICE_MODEL_VERSION_NONE) { - /* HVM domains with a device model. */ + if (d_config->c_info.type == LIBXL_DOMAIN_TYPE_PV) { + /* PV guests. */ + xc_config->emulation_flags = XEN_X86_EMU_PIT; + } else if (info->device_model_version != LIBXL_DEVICE_MODEL_VERSION_NONE) { + /* HVM guests with a device model. */ xc_config->emulation_flags = XEN_X86_EMU_ALL; } else { - /* PV or HVM domains without a device model. */ + /* HVM guests without a device model. */ xc_config->emulation_flags = 0; + + if (libxl_defbool_val(info->u.hvm.lapic)) + xc_config->emulation_flags |= XEN_X86_EMU_LAPIC; + if (libxl_defbool_val(info->u.hvm.ioapic)) + xc_config->emulation_flags |= XEN_X86_EMU_IOAPIC; + if (libxl_defbool_val(info->u.hvm.rtc)) + xc_config->emulation_flags |= XEN_X86_EMU_RTC; + if (libxl_defbool_val(info->u.hvm.power_management)) + xc_config->emulation_flags |= XEN_X86_EMU_PM; + if (libxl_defbool_val(info->u.hvm.pic)) + xc_config->emulation_flags |= XEN_X86_EMU_PIC; + if (libxl_defbool_val(info->u.hvm.pit)) + xc_config->emulation_flags |= XEN_X86_EMU_PIT; + if (libxl_defbool_val(info->u.hvm.hpet)) + xc_config->emulation_flags |= XEN_X86_EMU_HPET; + + if (info->u.hvm.vga.kind != LIBXL_VGA_INTERFACE_TYPE_NONE) + xc_config->emulation_flags |= XEN_X86_EMU_VGA; + + if (d_config->num_pcidevs != 0) + xc_config->emulation_flags |= XEN_X86_EMU_IOMMU; } return 0; diff --git a/tools/libxl/xl_cmdimpl.c b/tools/libxl/xl_cmdimpl.c index 25507c7..3654097 100644 --- a/tools/libxl/xl_cmdimpl.c +++ b/tools/libxl/xl_cmdimpl.c @@ -1514,6 +1514,13 @@ static void parse_config_data(const char *config_source, xlu_cfg_get_defbool(config, "acpi_s4", &b_info->u.hvm.acpi_s4, 0); xlu_cfg_get_defbool(config, "nx", &b_info->u.hvm.nx, 0); xlu_cfg_get_defbool(config, "hpet", &b_info->u.hvm.hpet, 0); + xlu_cfg_get_defbool(config, "lapic", &b_info->u.hvm.lapic, 0); + xlu_cfg_get_defbool(config, "ioapic", &b_info->u.hvm.ioapic, 0); + xlu_cfg_get_defbool(config, "rtc", &b_info->u.hvm.rtc, 0); + xlu_cfg_get_defbool(config, "power_management", + &b_info->u.hvm.power_management, 0); + xlu_cfg_get_defbool(config, "pic", &b_info->u.hvm.pic, 0); + xlu_cfg_get_defbool(config, "pit", &b_info->u.hvm.pit, 0); xlu_cfg_get_defbool(config, "vpt_align", &b_info->u.hvm.vpt_align, 0); switch (xlu_cfg_get_list(config, "viridian",