From patchwork Wed Nov 9 14:39:50 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Boris Ostrovsky X-Patchwork-Id: 9419539 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 B4248601C0 for ; Wed, 9 Nov 2016 14:42:52 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id A3DCA2892A for ; Wed, 9 Nov 2016 14:42:52 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 98A0028972; Wed, 9 Nov 2016 14:42: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, UNPARSEABLE_RELAY 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 EA17428B1B for ; Wed, 9 Nov 2016 14:42:51 +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 1c4U2z-0007Fl-MJ; Wed, 09 Nov 2016 14:40:17 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c4U2x-0007Dt-Ld for xen-devel@lists.xen.org; Wed, 09 Nov 2016 14:40:15 +0000 Received: from [85.158.143.35] by server-2.bemta-6.messagelabs.com id 7B/E1-27874-E4533285; Wed, 09 Nov 2016 14:40:14 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrLLMWRWlGSWpSXmKPExsUyZ7p8oK6fqXK EwbS9whZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8bH+fOZC/aaV9za94CtgbFNp4uRi0NIYBKT RHfbMlYI5w+jxO7ra5i7GDmBnA2MEkcvG0MkJjBKPGhbzQqSYBMwkjh7dDojiC0iIC1x7fNlR pAiZoGJTBKLp3SBJYQF3CVe7uxjAbFZBFQlTv9sArN5Bbwk1qx/BmZLCMhJ3DzXCbaNU8BbYs uXf6wQm70kGq9NY4KoMZZof3uRbQIj3wJGhlWMGsWpRWWpRbpGJnpJRZnpGSW5iZk5uoYGZnq 5qcXFiempOYlJxXrJ+bmbGIHBwgAEOxhXrgs8xCjJwaQkylvxXClCiC8pP6UyI7E4I76oNCe1 +BCjDAeHkgQvh4lyhJBgUWp6akVaZg4wbGHSEhw8SiK8TCBp3uKCxNzizHSI1ClGRSlxXmaQh ABIIqM0D64NFiuXGGWlhHkZgQ4R4ilILcrNLEGVf8UozsGoJMz70xhoCk9mXgnc9FdAi5mAFl fFKIAsLklESEk1ME40nXW5Ns9pabXymfxfa2Yo5GzsMc09KWKv8KD5wFWu4zmrS8IeuRq92G7 18fbRhv7psckr+AS8pjG+8UicVJYYkCFgnPXRW+hcVNKXGFZPgdfcy2ec4rdWXWT9bMXuwyeF g29HB7C6Wrpf3bJI4GfYsknvhTYVH8k87G4hbyX1sGplnb+0rRJLcUaioRZzUXEiAN8uO7SQA gAA X-Env-Sender: boris.ostrovsky@oracle.com X-Msg-Ref: server-15.tower-21.messagelabs.com!1478702412!42363707!1 X-Originating-IP: [156.151.31.81] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogMTU2LjE1MS4zMS44MSA9PiAyODgzMzk=\n X-StarScan-Received: X-StarScan-Version: 9.0.13; banners=-,-,- X-VirusChecked: Checked Received: (qmail 59872 invoked from network); 9 Nov 2016 14:40:14 -0000 Received: from userp1040.oracle.com (HELO userp1040.oracle.com) (156.151.31.81) by server-15.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 9 Nov 2016 14:40:14 -0000 Received: from aserv0022.oracle.com (aserv0022.oracle.com [141.146.126.234]) by userp1040.oracle.com (Sentrion-MTA-4.3.2/Sentrion-MTA-4.3.2) with ESMTP id uA9Ee5ic002406 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 9 Nov 2016 14:40:06 GMT Received: from aserv0122.oracle.com (aserv0122.oracle.com [141.146.126.236]) by aserv0022.oracle.com (8.14.4/8.13.8) with ESMTP id uA9Ee5bI031894 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 9 Nov 2016 14:40:05 GMT Received: from abhmp0013.oracle.com (abhmp0013.oracle.com [141.146.116.19]) by aserv0122.oracle.com (8.14.4/8.14.4) with ESMTP id uA9Ee5C0019074; Wed, 9 Nov 2016 14:40:05 GMT Received: from ostr-laptop.us.oracle.com (/10.152.23.90) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Wed, 09 Nov 2016 06:40:05 -0800 From: Boris Ostrovsky To: xen-devel@lists.xen.org Date: Wed, 9 Nov 2016 09:39:50 -0500 Message-Id: <1478702399-14538-3-git-send-email-boris.ostrovsky@oracle.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1478702399-14538-1-git-send-email-boris.ostrovsky@oracle.com> References: <1478702399-14538-1-git-send-email-boris.ostrovsky@oracle.com> X-Source-IP: aserv0022.oracle.com [141.146.126.234] Cc: wei.liu2@citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, Julien Grall , Paul Durrant , jbeulich@suse.com, Boris Ostrovsky , roger.pau@citrix.com Subject: [Xen-devel] [PATCH v2 02/11] acpi: Define ACPI IO registers for PVH guests 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: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP ACPI hotplug-related IO accesses (to GPE0 block) are handled by qemu for HVM guests. Since PVH guests don't have qemu these accesses will need to be procesed by the hypervisor. Because ACPI event model expects pm1a block to be present we need to have the hypervisor emulate it as well. Signed-off-by: Boris Ostrovsky Reviewed-by: Paul Durrant --- CC: Julien Grall CC: Paul Durrant --- Changes in v2: * Added public macros for ACPI CPU bitmap (at 0xaf00). Note: PRST region shrinks from 32 bytes to 16 (when 128 VCPUs are supported). tools/libacpi/mk_dsdt.c | 4 +++- tools/libacpi/static_tables.c | 28 +++++++++++----------------- xen/include/asm-x86/hvm/domain.h | 6 ++++++ xen/include/public/arch-arm.h | 11 ++++++++--- xen/include/public/hvm/ioreq.h | 13 +++++++++++++ 5 files changed, 41 insertions(+), 21 deletions(-) diff --git a/tools/libacpi/mk_dsdt.c b/tools/libacpi/mk_dsdt.c index 4ae68bc..2b8234d 100644 --- a/tools/libacpi/mk_dsdt.c +++ b/tools/libacpi/mk_dsdt.c @@ -19,6 +19,7 @@ #include #if defined(__i386__) || defined(__x86_64__) #include +#include #elif defined(__aarch64__) #include #endif @@ -244,7 +245,8 @@ int main(int argc, char **argv) #endif /* Operation Region 'PRST': bitmask of online CPUs. */ - stmt("OperationRegion", "PRST, SystemIO, 0xaf00, 32"); + stmt("OperationRegion", "PRST, SystemIO, 0x%x, %d", + ACPI_CPU_MAP, ACPI_CPU_MAP_LEN); push_block("Field", "PRST, ByteAcc, NoLock, Preserve"); indent(); printf("PRS, %u\n", max_cpus); pop_block(); diff --git a/tools/libacpi/static_tables.c b/tools/libacpi/static_tables.c index 617bf68..413abcc 100644 --- a/tools/libacpi/static_tables.c +++ b/tools/libacpi/static_tables.c @@ -20,6 +20,8 @@ * Firmware ACPI Control Structure (FACS). */ +#define ACPI_REG_BIT_OFFSET 0 + struct acpi_20_facs Facs = { .signature = ACPI_2_0_FACS_SIGNATURE, .length = sizeof(struct acpi_20_facs), @@ -30,14 +32,6 @@ struct acpi_20_facs Facs = { /* * Fixed ACPI Description Table (FADT). */ - -#define ACPI_PM1A_EVT_BLK_BIT_WIDTH 0x20 -#define ACPI_PM1A_EVT_BLK_BIT_OFFSET 0x00 -#define ACPI_PM1A_CNT_BLK_BIT_WIDTH 0x10 -#define ACPI_PM1A_CNT_BLK_BIT_OFFSET 0x00 -#define ACPI_PM_TMR_BLK_BIT_WIDTH 0x20 -#define ACPI_PM_TMR_BLK_BIT_OFFSET 0x00 - struct acpi_20_fadt Fadt = { .header = { .signature = ACPI_2_0_FADT_SIGNATURE, @@ -56,9 +50,9 @@ struct acpi_20_fadt Fadt = { .pm1a_cnt_blk = ACPI_PM1A_CNT_BLK_ADDRESS_V1, .pm_tmr_blk = ACPI_PM_TMR_BLK_ADDRESS_V1, .gpe0_blk = ACPI_GPE0_BLK_ADDRESS_V1, - .pm1_evt_len = ACPI_PM1A_EVT_BLK_BIT_WIDTH / 8, - .pm1_cnt_len = ACPI_PM1A_CNT_BLK_BIT_WIDTH / 8, - .pm_tmr_len = ACPI_PM_TMR_BLK_BIT_WIDTH / 8, + .pm1_evt_len = ACPI_PM1A_EVT_BLK_LEN, + .pm1_cnt_len = ACPI_PM1A_CNT_BLK_LEN, + .pm_tmr_len = ACPI_PM_TMR_BLK_LEN, .gpe0_blk_len = ACPI_GPE0_BLK_LEN_V1, .p_lvl2_lat = 0x0fff, /* >100, means we do not support C2 state */ @@ -79,22 +73,22 @@ struct acpi_20_fadt Fadt = { .x_pm1a_evt_blk = { .address_space_id = ACPI_SYSTEM_IO, - .register_bit_width = ACPI_PM1A_EVT_BLK_BIT_WIDTH, - .register_bit_offset = ACPI_PM1A_EVT_BLK_BIT_OFFSET, + .register_bit_width = ACPI_PM1A_EVT_BLK_LEN * 8, + .register_bit_offset = ACPI_REG_BIT_OFFSET, .address = ACPI_PM1A_EVT_BLK_ADDRESS_V1, }, .x_pm1a_cnt_blk = { .address_space_id = ACPI_SYSTEM_IO, - .register_bit_width = ACPI_PM1A_CNT_BLK_BIT_WIDTH, - .register_bit_offset = ACPI_PM1A_CNT_BLK_BIT_OFFSET, + .register_bit_width = ACPI_PM1A_CNT_BLK_LEN * 8, + .register_bit_offset = ACPI_REG_BIT_OFFSET, .address = ACPI_PM1A_CNT_BLK_ADDRESS_V1, }, .x_pm_tmr_blk = { .address_space_id = ACPI_SYSTEM_IO, - .register_bit_width = ACPI_PM_TMR_BLK_BIT_WIDTH, - .register_bit_offset = ACPI_PM_TMR_BLK_BIT_OFFSET, + .register_bit_width = ACPI_PM_TMR_BLK_LEN * 8, + .register_bit_offset = ACPI_REG_BIT_OFFSET, .address = ACPI_PM_TMR_BLK_ADDRESS_V1, } }; diff --git a/xen/include/asm-x86/hvm/domain.h b/xen/include/asm-x86/hvm/domain.h index f34d784..f492a2b 100644 --- a/xen/include/asm-x86/hvm/domain.h +++ b/xen/include/asm-x86/hvm/domain.h @@ -87,6 +87,12 @@ struct hvm_domain { } ioreq_server; struct hvm_ioreq_server *default_ioreq_server; + /* PVH guests */ + struct { + uint8_t pm1a[ACPI_PM1A_EVT_BLK_LEN]; + uint8_t gpe[ACPI_GPE0_BLK_LEN_V1]; + } acpi_io; + /* Cached CF8 for guest PCI config cycles */ uint32_t pci_cf8; diff --git a/xen/include/public/arch-arm.h b/xen/include/public/arch-arm.h index bd974fb..b793774 100644 --- a/xen/include/public/arch-arm.h +++ b/xen/include/public/arch-arm.h @@ -383,6 +383,9 @@ typedef uint64_t xen_callback_t; * should instead use the FDT. */ +/* Current supported guest VCPUs */ +#define GUEST_MAX_VCPUS 128 + /* Physical Address Space */ /* @@ -410,6 +413,11 @@ typedef uint64_t xen_callback_t; #define GUEST_ACPI_BASE 0x20000000ULL #define GUEST_ACPI_SIZE 0x02000000ULL +/* Location of online VCPU bitmap. */ +#define ACPI_CPU_MAP 0xaf00 +#define ACPI_CPU_MAP_LEN ((GUEST_MAX_VCPUS / 8) + \ + ((GUEST_MAX_VCPUS & 7) ? 1 : 0)) + /* * 16MB == 4096 pages reserved for guest to use as a region to map its * grant table in. @@ -435,9 +443,6 @@ typedef uint64_t xen_callback_t; #define GUEST_RAM_BANK_BASES { GUEST_RAM0_BASE, GUEST_RAM1_BASE } #define GUEST_RAM_BANK_SIZES { GUEST_RAM0_SIZE, GUEST_RAM1_SIZE } -/* Current supported guest VCPUs */ -#define GUEST_MAX_VCPUS 128 - /* Interrupts */ #define GUEST_TIMER_VIRT_PPI 27 #define GUEST_TIMER_PHYS_S_PPI 29 diff --git a/xen/include/public/hvm/ioreq.h b/xen/include/public/hvm/ioreq.h index 2e5809b..e3fa704 100644 --- a/xen/include/public/hvm/ioreq.h +++ b/xen/include/public/hvm/ioreq.h @@ -24,6 +24,8 @@ #ifndef _IOREQ_H_ #define _IOREQ_H_ +#include "hvm_info_table.h" /* HVM_MAX_VCPUS */ + #define IOREQ_READ 1 #define IOREQ_WRITE 0 @@ -124,6 +126,17 @@ typedef struct buffered_iopage buffered_iopage_t; #define ACPI_GPE0_BLK_ADDRESS ACPI_GPE0_BLK_ADDRESS_V0 #define ACPI_GPE0_BLK_LEN ACPI_GPE0_BLK_LEN_V0 +#define ACPI_PM1A_EVT_BLK_LEN 0x04 +#define ACPI_PM1A_CNT_BLK_LEN 0x02 +#define ACPI_PM_TMR_BLK_LEN 0x04 + +/* Location of online VCPU bitmap. */ +#define ACPI_CPU_MAP 0xaf00 +#define ACPI_CPU_MAP_LEN ((HVM_MAX_VCPUS / 8) + \ + ((HVM_MAX_VCPUS & 7) ? 1 : 0)) +#if ACPI_CPU_MAP + ACPI_CPU_MAP_LEN >= ACPI_GPE0_BLK_ADDRESS_V1 +#error "ACPI_CPU_MAP is too big" +#endif #endif /* _IOREQ_H_ */