From patchwork Thu Aug 17 14:57:13 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Igor Druzhinin X-Patchwork-Id: 9906539 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id AAE3160386 for ; Thu, 17 Aug 2017 15:00:18 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 9AC1528B59 for ; Thu, 17 Aug 2017 15:00:18 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 8989628B5C; Thu, 17 Aug 2017 15:00:18 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C43E828B52 for ; Thu, 17 Aug 2017 15:00:17 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1diMEo-0006Kg-DO; Thu, 17 Aug 2017 14:57:34 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1diMEn-0006KK-4q for xen-devel@lists.xen.org; Thu, 17 Aug 2017 14:57:33 +0000 Received: from [193.109.254.147] by server-2.bemta-6.messagelabs.com id FD/EF-27137-CDEA5995; Thu, 17 Aug 2017 14:57:32 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmplkeJIrShJLcpLzFFi42LZKekooXt73dR Ig0d/zSyWfFzM4sDocXT3b6YAxijWzLyk/IoE1ozNFztZCraaVDxv2MzawDhLu4uRk0NCwE/i xu1eJhCbTcBA4tSmRSwgtoiArMTqrjnsIDazwDRGic7JRiC2sECsxJeH8xhBbBYBVYkNbe9ZQ WxeAU+JP993M0HMlJO4ea6TGSIuKHFy5hMWiDkSEgdfvACLCwmoSRzt2sUCUZ8m0X7/GusERp 5ZSFpmIWlZwMi0ilGjOLWoLLVI19BCL6koMz2jJDcxM0fX0MBMLze1uDgxPTUnMalYLzk/dxM jMEgYgGAH482NAYcYJTmYlER5f8+aEinEl5SfUpmRWJwRX1Sak1p8iFGGg0NJgvfM2qmRQoJF qempFWmZOcBwhUlLcPAoifBeBEnzFhck5hZnpkOkTjHqcrya8P8bkxBLXn5eqpQ47z6QIgGQo ozSPLgRsNi5xCgrJczLCHSUEE9BalFuZgmq/CtGcQ5GJWHepSBTeDLzSuA2vQI6ggnoiCvtk0 COKElESEk1MIa8cQrw/XEvsi0qNb32hRQX38fHH6Z7KglNYzBOXJTpUSD2rYPPvrDcb+GRCTn lqeu/rv2y49WSR2uYL/11z6ypYv5idy9+TkbLo+3PjPMq9Bt8m27FdiUsN+ZzP+N2sptbNL++ eP6EOBkhUfPlKVW6bo+XRrjOMDBgWrU64wP37FJmU+s4JZbijERDLeai4kQAniqC1pgCAAA= X-Env-Sender: prvs=3959174b8=igor.druzhinin@citrix.com X-Msg-Ref: server-3.tower-27.messagelabs.com!1502981851!111970325!1 X-Originating-IP: [185.25.65.24] X-SpamReason: No, hits=0.0 required=7.0 tests=received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.4.45; banners=-,-,- X-VirusChecked: Checked Received: (qmail 54379 invoked from network); 17 Aug 2017 14:57:31 -0000 Received: from smtp.eu.citrix.com (HELO SMTP.EU.CITRIX.COM) (185.25.65.24) by server-3.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 17 Aug 2017 14:57:31 -0000 X-IronPort-AV: E=Sophos;i="5.41,388,1498521600"; d="scan'208";a="51147837" From: Igor Druzhinin To: Date: Thu, 17 Aug 2017 15:57:13 +0100 Message-ID: <1502981833-17992-1-git-send-email-igor.druzhinin@citrix.com> X-Mailer: git-send-email 2.7.4 MIME-Version: 1.0 X-ClientProxiedBy: FTLPEX02CAS03.citrite.net (10.13.99.94) To AMSPEX02CL03.citrite.net (10.69.22.127) Cc: Igor Druzhinin , ian.jackson@eu.citrix.com, wei.liu2@citrix.com, jbeulich@suse.com, andrew.cooper3@citrix.com Subject: [Xen-devel] [PATCH v3] hvmloader, libxl: use the correct ACPI settings depending on device model X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP We need to choose ACPI tables and ACPI IO port location properly depending on the device model version we are running. Previously, this decision was made by BIOS type specific code in hvmloader, e.g. always load QEMU traditional specific tables if it's ROMBIOS and always load QEMU Xen specific tables if it's SeaBIOS. This change saves this behavior (for compatibility) but adds an additional way (xenstore key) to specify the correct device model if we happen to run a non-default one. Toolstack bit makes use of it. The enforcement of BIOS type depending on QEMU version will be lifted later when the rest of ROMBIOS compatibility fixes are in place. Signed-off-by: Igor Druzhinin Reviewed-by: Paul Durrant Acked-by: Wei Liu --- Changes in v3: * move ACPI table externs into util.h Changes in v2: * fix insufficient allocation size of localent --- tools/firmware/hvmloader/hvmloader.c | 2 -- tools/firmware/hvmloader/ovmf.c | 5 ++--- tools/firmware/hvmloader/rombios.c | 5 ++--- tools/firmware/hvmloader/seabios.c | 6 +++--- tools/firmware/hvmloader/util.c | 21 +++++++++++++++++++++ tools/firmware/hvmloader/util.h | 3 +++ tools/libxl/libxl_create.c | 4 +++- 7 files changed, 34 insertions(+), 12 deletions(-) diff --git a/tools/firmware/hvmloader/hvmloader.c b/tools/firmware/hvmloader/hvmloader.c index f603f68..db11ab1 100644 --- a/tools/firmware/hvmloader/hvmloader.c +++ b/tools/firmware/hvmloader/hvmloader.c @@ -405,8 +405,6 @@ int main(void) } acpi_enable_sci(); - - hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); } init_vm86_tss(); diff --git a/tools/firmware/hvmloader/ovmf.c b/tools/firmware/hvmloader/ovmf.c index 4ff7f1d..17bd0fe 100644 --- a/tools/firmware/hvmloader/ovmf.c +++ b/tools/firmware/hvmloader/ovmf.c @@ -41,9 +41,6 @@ #define LOWCHUNK_MAXOFFSET 0x0000FFFF #define OVMF_INFO_PHYSICAL_ADDRESS 0x00001000 -extern unsigned char dsdt_anycpu_qemu_xen[]; -extern int dsdt_anycpu_qemu_xen_len; - #define OVMF_INFO_MAX_TABLES 4 struct ovmf_info { char signature[14]; /* XenHVMOVMF\0\0\0\0 */ @@ -127,6 +124,8 @@ static void ovmf_acpi_build_tables(void) .dsdt_15cpu_len = 0 }; + hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); + hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS); } diff --git a/tools/firmware/hvmloader/rombios.c b/tools/firmware/hvmloader/rombios.c index 56b39b7..b14d1f2 100644 --- a/tools/firmware/hvmloader/rombios.c +++ b/tools/firmware/hvmloader/rombios.c @@ -42,9 +42,6 @@ #define ROMBIOS_MAXOFFSET 0x0000FFFF #define ROMBIOS_END (ROMBIOS_BEGIN + ROMBIOS_SIZE) -extern unsigned char dsdt_anycpu[], dsdt_15cpu[]; -extern int dsdt_anycpu_len, dsdt_15cpu_len; - static void rombios_setup_e820(void) { /* @@ -181,6 +178,8 @@ static void rombios_acpi_build_tables(void) .dsdt_15cpu_len = dsdt_15cpu_len, }; + hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0); + hvmloader_acpi_build_tables(&config, ACPI_PHYSICAL_ADDRESS); } diff --git a/tools/firmware/hvmloader/seabios.c b/tools/firmware/hvmloader/seabios.c index 870576a..c8792cd 100644 --- a/tools/firmware/hvmloader/seabios.c +++ b/tools/firmware/hvmloader/seabios.c @@ -28,9 +28,7 @@ #include #include - -extern unsigned char dsdt_anycpu_qemu_xen[]; -extern int dsdt_anycpu_qemu_xen_len; +#include struct seabios_info { char signature[14]; /* XenHVMSeaBIOS\0 */ @@ -99,6 +97,8 @@ static void seabios_acpi_build_tables(void) .dsdt_15cpu_len = 0, }; + hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); + hvmloader_acpi_build_tables(&config, rsdp); add_table(rsdp); } diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index db5f240..934b566 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -897,6 +897,27 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, /* Allocate and initialise the acpi info area. */ mem_hole_populate_ram(ACPI_INFO_PHYSICAL_ADDRESS >> PAGE_SHIFT, 1); + /* If the device model is specified switch to the corresponding tables */ + s = xenstore_read("platform/device-model", ""); + if ( !strncmp(s, "qemu_xen_traditional", 21) ) + { + config->dsdt_anycpu = dsdt_anycpu; + config->dsdt_anycpu_len = dsdt_anycpu_len; + config->dsdt_15cpu = dsdt_15cpu; + config->dsdt_15cpu_len = dsdt_15cpu_len; + + hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 0); + } + else if ( !strncmp(s, "qemu_xen", 9) ) + { + config->dsdt_anycpu = dsdt_anycpu_qemu_xen; + config->dsdt_anycpu_len = dsdt_anycpu_qemu_xen_len; + config->dsdt_15cpu = NULL; + config->dsdt_15cpu_len = 0; + + hvm_param_set(HVM_PARAM_ACPI_IOPORTS_LOCATION, 1); + } + config->lapic_base_address = LAPIC_BASE_ADDRESS; config->lapic_id = acpi_lapic_id; config->ioapic_base_address = ioapic_base_address; diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader/util.h index 6062f0b..874916c 100644 --- a/tools/firmware/hvmloader/util.h +++ b/tools/firmware/hvmloader/util.h @@ -276,6 +276,9 @@ extern struct e820map memory_map; bool check_overlap(uint64_t start, uint64_t size, uint64_t reserved_start, uint64_t reserved_size); +extern unsigned char dsdt_anycpu_qemu_xen[], dsdt_anycpu[], dsdt_15cpu[]; +extern int dsdt_anycpu_qemu_xen_len, dsdt_anycpu_len, dsdt_15cpu_len; + struct acpi_config; void hvmloader_acpi_build_tables(struct acpi_config *config, unsigned int physical); diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 1158303..1d24209 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -451,7 +451,7 @@ int libxl__domain_build(libxl__gc *gc, vments[4] = "start_time"; vments[5] = GCSPRINTF("%lu.%02d", start_time.tv_sec,(int)start_time.tv_usec/10000); - localents = libxl__calloc(gc, 11, sizeof(char *)); + localents = libxl__calloc(gc, 13, sizeof(char *)); i = 0; localents[i++] = "platform/acpi"; localents[i++] = libxl__acpi_defbool_val(info) ? "1" : "0"; @@ -472,6 +472,8 @@ int libxl__domain_build(libxl__gc *gc, info->u.hvm.mmio_hole_memkb << 10); } } + localents[i++] = "platform/device-model"; + localents[i++] = (char *) libxl_device_model_version_to_string(info->device_model_version); break; case LIBXL_DOMAIN_TYPE_PV: