From patchwork Mon Dec 12 16:04:24 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Roger_Pau_Monn=C3=A9?= X-Patchwork-Id: 9470875 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 B19D660476 for ; Mon, 12 Dec 2016 16:06:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 95018284D1 for ; Mon, 12 Dec 2016 16:06:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 89EB6284E7; Mon, 12 Dec 2016 16:06:52 +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 7A21E284F0 for ; Mon, 12 Dec 2016 16:06:50 +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 1cGT5i-0008RY-Ld; Mon, 12 Dec 2016 16:04:38 +0000 Received: from mail6.bemta3.messagelabs.com ([195.245.230.39]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cGT5h-0008RM-5l for xen-devel@lists.xenproject.org; Mon, 12 Dec 2016 16:04:37 +0000 Received: from [85.158.137.68] by server-16.bemta-3.messagelabs.com id E0/38-12362-49ACE485; Mon, 12 Dec 2016 16:04:36 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFlrJIsWRWlGSWpSXmKPExsXitHRDpO7kU34 RBteuy1p83zKZyYHR4/CHKywBjFGsmXlJ+RUJrBmXd59kKfhlU7G75wd7A+NNgy5GTg4JAX+J zTMPMYHYbAI6Ehfn7mTrYuTgEBFQkbi9F6iEi4NZ4CejRGvTVxaQGmEBP4mnvXdYQWwWAVWJW QfPg8V5BSwk7v24ygYxU1fi9rJd7CA2p4ClxM8tzWC2EFDN0d9fmSHqBSVOznwC1sssoCnRuv 03O4QtL9G8dTYzRL2iRP+8B2wTGPlmIWmZhaRlFpKWBYzMqxg1ilOLylKLdA0N9JKKMtMzSnI TM3OAPGO93NTi4sT01JzEpGK95PzcTYzAYKtnYGDcwbity/kQoyQHk5Io75cDfhFCfEn5KZUZ icUZ8UWlOanFhxhlODiUJHjrTwLlBItS01Mr0jJzgGEPk5bg4FES4c09AZTmLS5IzC3OTIdIn WLU5Zj2bPFTJiGWvPy8VClx3gkgMwRAijJK8+BGwGLwEqOslDAvIwMDgxBPQWpRbmYJqvwrRn EORiVh3sUgU3gy80rgNr0COoIJ6Ijn+7xBjihJREhJNTCuM7l7lNfg6DXmBGbdLVKyq3a2MB7 axZvy5qPAJSHmQ83NBbH9OxSdItg/+gsKWVyJWNl0KuaYnFyC4UuvuGeG7g2GD7xPbZ2VVWaU VOXWGm53XmjKmu3Mn9umPM5svFfb5Tlb8npENts95VurTmeWBNfWCmzv+HfjbGOTyNMr9rcrE 7axNiuxFGckGmoxFxUnAgDbTdEovAIAAA== X-Env-Sender: prvs=1477f1691=roger.pau@citrix.com X-Msg-Ref: server-4.tower-31.messagelabs.com!1481558669!17627602!1 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: 9.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 63839 invoked from network); 12 Dec 2016 16:04:34 -0000 Received: from smtp.citrix.com (HELO SMTP.CITRIX.COM) (66.165.176.89) by server-4.tower-31.messagelabs.com with RC4-SHA encrypted SMTP; 12 Dec 2016 16:04:34 -0000 X-IronPort-AV: E=Sophos;i="5.33,337,1477958400"; d="scan'208";a="394302982" From: Roger Pau Monne To: Date: Mon, 12 Dec 2016 16:04:24 +0000 Message-ID: <20161212160425.5704-2-roger.pau@citrix.com> X-Mailer: git-send-email 2.9.3 (Apple Git-75) In-Reply-To: <20161212160425.5704-1-roger.pau@citrix.com> References: <20161212160425.5704-1-roger.pau@citrix.com> MIME-Version: 1.0 Cc: Wei Liu , Andrew Cooper , Ian Jackson , Jan Beulich , boris.ostrovsky@oracle.com, Roger Pau Monne Subject: [Xen-devel] [PATCH v4 1/2] tools/libacpi: update FADT layout to support version 5 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 Update the structure of the FADT table to version 5, and use that version for PVHv2 guests. Note that HVM guests will continue to use FADT 4. In order to do this, add a new field to acpi_config that contains the ACPI revision to use by libacpi. Note that currently this only applies to the FADT. Signed-off-by: Roger Pau Monné Acked-by: Wei Liu --- Cc: Jan Beulich Cc: Andrew Cooper Cc: Ian Jackson Cc: Wei Liu Cc: boris.ostrovsky@oracle.com Cc: konrad.wilk@oracle.com --- Changes since v3: - Add a new field to acpi_config that contains the ACPI revision to use. - Rename acpi_50_fadt acpi_fadt. - Make fadt_size unsigned int. - Don't pre-initialize the length and revision fields of the Fadt static table. - Rebase on top of staging. --- tools/firmware/hvmloader/util.c | 1 + tools/libacpi/acpi2_0.h | 8 +++++--- tools/libacpi/build.c | 35 ++++++++++++++++++++++++++++------- tools/libacpi/libacpi.h | 1 + tools/libacpi/static_tables.c | 6 ++---- tools/libxl/libxl_x86_acpi.c | 1 + 6 files changed, 38 insertions(+), 14 deletions(-) diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index c05de53..f2bec51 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -952,6 +952,7 @@ void hvmloader_acpi_build_tables(struct acpi_config *config, ACPI_HAS_WAET | ACPI_HAS_PMTIMER | ACPI_HAS_BUTTONS | ACPI_HAS_VGA | ACPI_HAS_8042); + config->acpi_revision = 4; config->tis_hdr = (uint16_t *)ACPI_TIS_HDR_ADDRESS; diff --git a/tools/libacpi/acpi2_0.h b/tools/libacpi/acpi2_0.h index 500f95e..5715197 100644 --- a/tools/libacpi/acpi2_0.h +++ b/tools/libacpi/acpi2_0.h @@ -169,7 +169,7 @@ struct acpi_10_fadt { /* * Fixed ACPI Description Table Structure (FADT). */ -struct acpi_20_fadt { +struct acpi_fadt { struct acpi_header header; uint32_t firmware_ctrl; uint32_t dsdt; @@ -222,6 +222,9 @@ struct acpi_20_fadt { struct acpi_20_generic_address x_pm_tmr_blk; struct acpi_20_generic_address x_gpe0_blk; struct acpi_20_generic_address x_gpe1_blk; + /* Only available starting from FADT revision 5. */ + struct acpi_20_generic_address sleep_control; + struct acpi_20_generic_address sleep_status; }; /* @@ -422,7 +425,7 @@ struct acpi_20_slit { */ #define ACPI_2_0_RSDP_SIGNATURE ASCII64('R','S','D',' ','P','T','R',' ') #define ACPI_2_0_FACS_SIGNATURE ASCII32('F','A','C','S') -#define ACPI_2_0_FADT_SIGNATURE ASCII32('F','A','C','P') +#define ACPI_FADT_SIGNATURE ASCII32('F','A','C','P') #define ACPI_2_0_MADT_SIGNATURE ASCII32('A','P','I','C') #define ACPI_2_0_RSDT_SIGNATURE ASCII32('R','S','D','T') #define ACPI_2_0_XSDT_SIGNATURE ASCII32('X','S','D','T') @@ -436,7 +439,6 @@ struct acpi_20_slit { * Table revision numbers. */ #define ACPI_2_0_RSDP_REVISION 0x02 -#define ACPI_2_0_FADT_REVISION 0x04 #define ACPI_2_0_MADT_REVISION 0x02 #define ACPI_2_0_RSDT_REVISION 0x01 #define ACPI_2_0_XSDT_REVISION 0x01 diff --git a/tools/libacpi/build.c b/tools/libacpi/build.c index 2bdfaab..6bd50b3 100644 --- a/tools/libacpi/build.c +++ b/tools/libacpi/build.c @@ -33,7 +33,7 @@ extern struct acpi_20_rsdp Rsdp; extern struct acpi_20_rsdt Rsdt; extern struct acpi_20_xsdt Xsdt; -extern struct acpi_20_fadt Fadt; +extern struct acpi_fadt Fadt; extern struct acpi_20_facs Facs; extern struct acpi_20_waet Waet; @@ -503,12 +503,13 @@ int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) struct acpi_20_rsdp *rsdp; struct acpi_20_rsdt *rsdt; struct acpi_20_xsdt *xsdt; - struct acpi_20_fadt *fadt; + struct acpi_fadt *fadt; struct acpi_10_fadt *fadt_10; struct acpi_20_facs *facs; unsigned char *dsdt; unsigned long secondary_tables[ACPI_MAX_SECONDARY_TABLES]; int nr_secondaries, i; + unsigned int fadt_size; acpi_info = (struct acpi_info *)config->infop; memset(acpi_info, 0, sizeof(*acpi_info)); @@ -572,7 +573,23 @@ int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) offsetof(struct acpi_header, checksum), sizeof(struct acpi_10_fadt)); - fadt = ctxt->mem_ops.alloc(ctxt, sizeof(struct acpi_20_fadt), 16); + switch ( config->acpi_revision ) + { + case 4: + /* + * NB: we can use offsetof because there's no padding between + * x_gpe1_blk and sleep_control. + */ + fadt_size = offsetof(struct acpi_fadt, sleep_control); + break; + case 5: + fadt_size = sizeof(*fadt); + break; + default: + printf("ACPI revision %u not supported\n", config->acpi_revision); + return -1; + } + fadt = ctxt->mem_ops.alloc(ctxt, fadt_size, 16); if (!fadt) goto oom; if ( !(config->table_flags & ACPI_HAS_PMTIMER) ) { @@ -581,7 +598,13 @@ int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) } if ( !(config->table_flags & ACPI_HAS_BUTTONS) ) Fadt.flags |= (ACPI_PWR_BUTTON | ACPI_SLP_BUTTON); - memcpy(fadt, &Fadt, sizeof(struct acpi_20_fadt)); + memcpy(fadt, &Fadt, fadt_size); + /* + * For both ACPI 4 and 5 the revision of the FADT matches the ACPI + * revision. + */ + fadt->header.revision = config->acpi_revision; + fadt->header.length = fadt_size; fadt->dsdt = ctxt->mem_ops.v2p(ctxt, dsdt); fadt->x_dsdt = ctxt->mem_ops.v2p(ctxt, dsdt); fadt->firmware_ctrl = ctxt->mem_ops.v2p(ctxt, facs); @@ -590,9 +613,7 @@ int acpi_build_tables(struct acpi_ctxt *ctxt, struct acpi_config *config) fadt->iapc_boot_arch |= ACPI_FADT_NO_VGA; if ( config->table_flags & ACPI_HAS_8042 ) fadt->iapc_boot_arch |= ACPI_FADT_8042; - set_checksum(fadt, - offsetof(struct acpi_header, checksum), - sizeof(struct acpi_20_fadt)); + set_checksum(fadt, offsetof(struct acpi_header, checksum), fadt_size); nr_secondaries = construct_secondary_tables(ctxt, secondary_tables, config, acpi_info); diff --git a/tools/libacpi/libacpi.h b/tools/libacpi/libacpi.h index db2d7b2..dbc6c8b 100644 --- a/tools/libacpi/libacpi.h +++ b/tools/libacpi/libacpi.h @@ -63,6 +63,7 @@ struct acpi_config { uint64_t pci_hi_start, pci_hi_len; uint32_t table_flags; + uint8_t acpi_revision; uint64_t vm_gid[2]; unsigned long vm_gid_addr; /* OUT parameter */ diff --git a/tools/libacpi/static_tables.c b/tools/libacpi/static_tables.c index 1f6247d..13946aa 100644 --- a/tools/libacpi/static_tables.c +++ b/tools/libacpi/static_tables.c @@ -38,11 +38,9 @@ struct acpi_20_facs Facs = { #define ACPI_PM_TMR_BLK_BIT_WIDTH 0x20 #define ACPI_PM_TMR_BLK_BIT_OFFSET 0x00 -struct acpi_20_fadt Fadt = { +struct acpi_fadt Fadt = { .header = { - .signature = ACPI_2_0_FADT_SIGNATURE, - .length = sizeof(struct acpi_20_fadt), - .revision = ACPI_2_0_FADT_REVISION, + .signature = ACPI_FADT_SIGNATURE, .oem_id = ACPI_OEM_ID, .oem_table_id = ACPI_OEM_TABLE_ID, .oem_revision = ACPI_OEM_REVISION, diff --git a/tools/libxl/libxl_x86_acpi.c b/tools/libxl/libxl_x86_acpi.c index ff0e2df..686ac8e 100644 --- a/tools/libxl/libxl_x86_acpi.c +++ b/tools/libxl/libxl_x86_acpi.c @@ -151,6 +151,7 @@ static int init_acpi_config(libxl__gc *gc, config->lapic_base_address = LAPIC_BASE_ADDRESS; config->lapic_id = acpi_lapic_id; + config->acpi_revision = 5; out: return 0;