From patchwork Mon Mar 20 00:12:42 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Haozhong Zhang X-Patchwork-Id: 9632859 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 EC2F56020B for ; Mon, 20 Mar 2017 00:15:32 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id DDD5427F8C for ; Mon, 20 Mar 2017 00:15:32 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id D0D0A2808C; Mon, 20 Mar 2017 00:15:32 +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.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID 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 22BE427F8C for ; Mon, 20 Mar 2017 00:15:31 +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 1cpkwf-0006Re-LQ; Mon, 20 Mar 2017 00:13:09 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cpkwe-0006QM-5u for xen-devel@lists.xenproject.org; Mon, 20 Mar 2017 00:13:08 +0000 Received: from [85.158.143.35] by server-11.bemta-6.messagelabs.com id 80/33-04971-39E1FC85; Mon, 20 Mar 2017 00:13:07 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmphkeJIrShJLcpLzFFi42I5YG5SoTtZ7ny EwQUVi+9bJjM5MHoc/nCFJYAxijUzLym/IoE142fDE6aCreoVq3q+MzUwrpTtYuTiYBG4xSTx /doGRhBHSGA6o8STv42sXYycHBICvBJHls2Asv0kfn5/yghiCwn0MkpMeaMGYrMJ6EuseHwQq IaDQ0TAWKLtpjPIHGaB/4wSF48sZAKpERYIkGiftIodxGYRUJV4eOg8E0g9r4CtRO92N4jx8h IXrp5iAQlzCthJdMx2g9hkK/Fj1WSWCYx8CxgZVjFqFKcWlaUW6Rqa6iUVZaZnlOQmZuboGhq Y6eWmFhcnpqfmJCYV6yXn525iBIYIAxDsYPy2LOAQoyQHk5Ior4rgiQghvqT8lMqMxOKM+KLS nNTiQ4wyHBxKErybc4BygkWp6akVaZk5wGCFSUtw8CiJ8L4HSfMWFyTmFmemQ6ROMepyzJm9+ w2TEEtefl6qlDjvEZAiAZCijNI8uBGwyLnEKCslzMsIdJQQT0FqUW5mCar8K0ZxDkYlYV7DXK ApPJl5JXCbXgEdwQR0ROLPIyBHlCQipKQaGGO1eF2FTrxaW5iXtfnPlezO6Qy3SxiKv2v997g dFCzw/fCO9InL8o789y3S1De1PToxPjjwsUaRNAf/t4s9+U5BSqdeldlVf3//jyvfeq/3Pw0t 6z9fJyn/N57qbbtN7xvz6ZnlwkfvTowSiGyt3fju5fvOW3unJ5Xymakr1KkUHp8z8e/HdUosx RmJhlrMRcWJAMrrv12XAgAA X-Env-Sender: haozhong.zhang@intel.com X-Msg-Ref: server-13.tower-21.messagelabs.com!1489968783!57234334!2 X-Originating-IP: [192.55.52.120] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.2.3; banners=-,-,- X-VirusChecked: Checked Received: (qmail 30571 invoked from network); 20 Mar 2017 00:13:06 -0000 Received: from mga04.intel.com (HELO mga04.intel.com) (192.55.52.120) by server-13.tower-21.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 20 Mar 2017 00:13:06 -0000 DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=intel.com; i=@intel.com; q=dns/txt; s=intel; t=1489968786; x=1521504786; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=ZkG9XEfNFConRl5HDkM+Yp9IINl4yhwE99RfjmrL4FU=; b=DJPd82+abO6e07UQIPDZy9sj9DZGeTFBi63L9DXjlMQzIwcB5CMZgQTr owqDluauIqDcnlO/nfbSoSCXq2nwDA==; Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga104.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Mar 2017 17:13:05 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.36,191,1486454400"; d="scan'208";a="78799151" Received: from hz-desktop.sh.intel.com (HELO localhost) ([10.239.159.153]) by fmsmga006.fm.intel.com with ESMTP; 19 Mar 2017 17:13:03 -0700 From: Haozhong Zhang To: qemu-devel@nongnu.org, xen-devel@lists.xen.org Date: Mon, 20 Mar 2017 08:12:42 +0800 Message-Id: <20170320001249.25521-4-haozhong.zhang@intel.com> X-Mailer: git-send-email 2.10.1 In-Reply-To: <20170320001249.25521-1-haozhong.zhang@intel.com> References: <20170320001249.25521-1-haozhong.zhang@intel.com> Cc: Haozhong Zhang , Stefano Stabellini , xen-devel@lists.xenproject.org, Anthony Perard , Konrad Rzeszutek Wilk , Dan Williams Subject: [Xen-devel] [RFC QEMU PATCH v2 03/10] xen-hvm: support copying ACPI to guest memory 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 Signed-off-by: Haozhong Zhang --- Cc: Stefano Stabellini Cc: Anthony Perard Cc: xen-devel@lists.xenproject.org --- include/hw/xen/xen.h | 18 ++++++++ xen-hvm-stub.c | 6 +++ xen-hvm.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 137 insertions(+) diff --git a/include/hw/xen/xen.h b/include/hw/xen/xen.h index 09c2ce5170..d67cdd8c7d 100644 --- a/include/hw/xen/xen.h +++ b/include/hw/xen/xen.h @@ -47,4 +47,22 @@ void xen_modified_memory(ram_addr_t start, ram_addr_t length); void xen_register_framebuffer(struct MemoryRegion *mr); +/* + * Copy an ACPI blob from QEMU to HVM guest. + * + * Parameters: + * name: a unique name of the data blob; for XEN_DM_ACPI_BLOB_TYPE_NSDEV, + * name should be less then 4 characters + * blob: the ACPI blob to be copied + * length: the length in bytes of the ACPI blob + * type: the type of content in the ACPI blob + * + * Return: + * 0 on success; a non-zero error code on failures. + */ +#define XEN_DM_ACPI_BLOB_TYPE_TABLE 0 /* ACPI table */ +#define XEN_DM_ACPI_BLOB_TYPE_NSDEV 1 /* AML of ACPI namespace device */ +int xen_acpi_copy_to_guest(const char *name, const void *blob, size_t length, + int type); + #endif /* QEMU_HW_XEN_H */ diff --git a/xen-hvm-stub.c b/xen-hvm-stub.c index c5003251cb..a6c018505c 100644 --- a/xen-hvm-stub.c +++ b/xen-hvm-stub.c @@ -61,3 +61,9 @@ void xen_hvm_init(PCMachineState *pcms, MemoryRegion **ram_memory) void qmp_xen_set_global_dirty_log(bool enable, Error **errp) { } + +int xen_acpi_copy_to_guest(const char *name, const void *blob, size_t length, + int type) +{ + return -1; +} diff --git a/xen-hvm.c b/xen-hvm.c index c42c958a0a..4ddc47e5f1 100644 --- a/xen-hvm.c +++ b/xen-hvm.c @@ -1252,6 +1252,20 @@ static int dm_acpi_buf_init(XenIOState *state) return 0; } +static ram_addr_t dm_acpi_buf_alloc(size_t length) +{ + ram_addr_t addr; + + if (dm_acpi_buf->length - dm_acpi_buf->used < length) { + return 0; + } + + addr = dm_acpi_buf->base + dm_acpi_buf->used; + dm_acpi_buf->used += length; + + return addr; +} + static int xen_dm_acpi_required(PCMachineState *pcms) { return 0; @@ -1486,3 +1500,102 @@ void qmp_xen_set_global_dirty_log(bool enable, Error **errp) memory_global_dirty_log_stop(); } } + +static int xs_write_dm_acpi_blob_entry(const char *name, + const char *entry, const char *value) +{ + XenIOState *state = container_of(dm_acpi_buf, XenIOState, dm_acpi_buf); + char path[80]; + + snprintf(path, sizeof(path), + "/local/domain/%d"HVM_XS_DM_ACPI_ROOT"/%s/%s", + xen_domid, name, entry); + if (!xs_write(state->xenstore, 0, path, value, strlen(value))) { + return -EIO; + } + + return 0; +} + +static size_t xen_memcpy_to_guest(ram_addr_t gpa, + const void *buf, size_t length) +{ + size_t copied = 0, size; + ram_addr_t s, e, offset, cur = gpa; + xen_pfn_t cur_pfn; + void *page; + + if (!buf || !length) { + return 0; + } + + s = gpa & TARGET_PAGE_MASK; + e = gpa + length; + if (e < s) { + return 0; + } + + while (cur < e) { + cur_pfn = cur >> TARGET_PAGE_BITS; + offset = cur - (cur_pfn << TARGET_PAGE_BITS); + size = (length >= TARGET_PAGE_SIZE - offset) ? + TARGET_PAGE_SIZE - offset : length; + + page = xenforeignmemory_map(xen_fmem, xen_domid, PROT_READ | PROT_WRITE, + 1, &cur_pfn, NULL); + if (!page) { + break; + } + + memcpy(page + offset, buf, size); + xenforeignmemory_unmap(xen_fmem, page, 1); + + copied += size; + buf += size; + cur += size; + length -= size; + } + + return copied; +} + +int xen_acpi_copy_to_guest(const char *name, const void *blob, size_t length, + int type) +{ + char value[21]; + ram_addr_t buf_addr; + int rc; + + if (type != XEN_DM_ACPI_BLOB_TYPE_TABLE && + type != XEN_DM_ACPI_BLOB_TYPE_NSDEV) { + return -EINVAL; + } + + buf_addr = dm_acpi_buf_alloc(length); + if (!buf_addr) { + return -ENOMEM; + } + if (xen_memcpy_to_guest(buf_addr, blob, length) != length) { + return -EIO; + } + + snprintf(value, sizeof(value), "%d", type); + rc = xs_write_dm_acpi_blob_entry(name, "type", value); + if (rc) { + return rc; + } + + snprintf(value, sizeof(value), "%"PRIu64, buf_addr - dm_acpi_buf->base); + rc = xs_write_dm_acpi_blob_entry(name, "offset", value); + if (rc) { + return rc; + } + + snprintf(value, sizeof(value), "%"PRIu64, length); + rc = xs_write_dm_acpi_blob_entry(name, "length", value); + if (rc) { + return rc; + } + + return 0; +}