From patchwork Mon Aug 1 17:10:17 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Sergej Proskurin X-Patchwork-Id: 9254585 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 400BB6089F for ; Mon, 1 Aug 2016 17:13:37 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2A4B02843C for ; Mon, 1 Aug 2016 17:13:37 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 18EB7284AD; Mon, 1 Aug 2016 17:13:37 +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 ACA34284AD for ; Mon, 1 Aug 2016 17:13:36 +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 1bUGkF-0006Q7-M8; Mon, 01 Aug 2016 17:11:15 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1bUGkD-0006LS-FO for xen-devel@lists.xenproject.org; Mon, 01 Aug 2016 17:11:13 +0000 Received: from [85.158.139.211] by server-17.bemta-5.messagelabs.com id F5/68-24990-1B28F975; Mon, 01 Aug 2016 17:11:13 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFrrOLMWRWlGSWpSXmKPExsXSPJ+BQ3dD0/x wgzmPpCy+b5nM5MDocfjDFZYAxijWzLyk/IoE1oy/Sz4xFcwQqrg3TayB8RZvFyMXh5DARkaJ dXcWMEM4yxklurf+Z+9i5ORgEzCQmPJ6JSuILSKgJHFv1WQmkCJmgSZGiXuND9hAEsICfhIHD t1mArFZBFQlpq3ZCtbMK2ArsX7ZArC4hICcRMP5+8wgNidQvO/2chYQW0jARmLx1f3MExi5Fz AyrGLUKE4tKkst0jUy0ksqykzPKMlNzMzRNTQw1ctNLS5OTE/NSUwq1kvOz93ECPRwPQMD4w7 GPe1+hxglOZiURHkTCuaHC/El5adUZiQWZ8QXleakFh9ilOHgUJLg3d4IlBMsSk1PrUjLzAGG GkxagoNHSYS3AyTNW1yQmFucmQ6ROsWoKCXOmwaSEABJZJTmwbXBwvsSo6yUMC8jAwODEE9Ba lFuZgmq/CtGcQ5GJWHe5yBTeDLzSuCmvwJazAS0ONF+DsjikkSElFQD4/GM1tzJzGpmguVm1w 5PufL3Lbf1fx0B8dt3vVa/WnkzhrX6n4fr0oU3LpW1mYbmtcp9TC7vD1OPTtd6tj7PMbyTdUH nukm7LnEX56Q3zFtct8LFeq/3n3oG24sf7q9IXZPT3eQjNPHEnfyS7+r3Ofl5y0K9HukG//gT 4VEiKWxTs+cwz4I7SizFGYmGWsxFxYkAqSCTCWoCAAA= X-Env-Sender: proskurin@sec.in.tum.de X-Msg-Ref: server-15.tower-206.messagelabs.com!1470071472!40344983!1 X-Originating-IP: [131.159.0.8] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 8.77; banners=-,-,- X-VirusChecked: Checked Received: (qmail 49957 invoked from network); 1 Aug 2016 17:11:12 -0000 Received: from mail-out1.informatik.tu-muenchen.de (HELO mail-out1.informatik.tu-muenchen.de) (131.159.0.8) by server-15.tower-206.messagelabs.com with DHE-RSA-AES256-GCM-SHA384 encrypted SMTP; 1 Aug 2016 17:11:12 -0000 Received: from files.sec.in.tum.de (files.sec.in.tum.de [131.159.50.1]) by services.sec.in.tum.de (Postfix) with ESMTP id 55A6710100E97; Mon, 1 Aug 2016 19:11:11 +0200 (CEST) Received: from ker.sec.in.tum.de (ker.sec.in.tum.de [131.159.50.36]) by files.sec.in.tum.de (Postfix) with ESMTP id 494874428; Mon, 1 Aug 2016 19:11:11 +0200 (CEST) From: Sergej Proskurin To: xen-devel@lists.xenproject.org Date: Mon, 1 Aug 2016 19:10:17 +0200 Message-Id: <20160801171028.11615-15-proskurin@sec.in.tum.de> X-Mailer: git-send-email 2.9.0 In-Reply-To: <20160801171028.11615-1-proskurin@sec.in.tum.de> References: <20160801171028.11615-1-proskurin@sec.in.tum.de> Cc: Sergej Proskurin , Julien Grall , Stefano Stabellini Subject: [Xen-devel] [PATCH v2 14/25] arm/altp2m: Make get_page_from_gva ready for altp2m. 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 The function get_page_from_gva uses ARM's hardware support to translate gva's to machine addresses. This function is used, among others, for memory regulation purposes, e.g, within the context of memory ballooning. To ensure correct behavior while altp2m is in use, we use the host's p2m table for the associated gva to ma translation. This is required at this point, as altp2m lazily copies pages from the host's p2m and even might be flushed because of changes to the host's p2m (as it is done within the context of memory ballooning). Signed-off-by: Sergej Proskurin --- Cc: Stefano Stabellini Cc: Julien Grall --- xen/arch/arm/p2m.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index bcad51f..784f8da 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1614,7 +1614,7 @@ struct page_info *get_page_from_gva(struct vcpu *v, vaddr_t va, unsigned long flags) { struct domain *d = v->domain; - struct p2m_domain *p2m = &d->arch.p2m; + struct p2m_domain *p2m = p2m_get_hostp2m(d); struct page_info *page = NULL; paddr_t maddr = 0; int rc; @@ -1628,7 +1628,34 @@ struct page_info *get_page_from_gva(struct vcpu *v, vaddr_t va, p2m_read_lock(p2m); - rc = gvirt_to_maddr(va, &maddr, flags); + /* + * If altp2m is active, we still read the gva from the hostp2m, as it + * contains all valid mappings while the currently active altp2m view might + * not have the required gva mapping yet. + */ + if ( unlikely(altp2m_active(d)) ) + { + unsigned long irq_flags = 0; + uint64_t ovttbr = READ_SYSREG64(VTTBR_EL2); + + if ( ovttbr != p2m->vttbr.vttbr ) + { + local_irq_save(irq_flags); + WRITE_SYSREG64(p2m->vttbr.vttbr, VTTBR_EL2); + isb(); + } + + rc = gvirt_to_maddr(va, &maddr, flags); + + if ( ovttbr != p2m->vttbr.vttbr ) + { + WRITE_SYSREG64(ovttbr, VTTBR_EL2); + isb(); + local_irq_restore(irq_flags); + } + } + else + rc = gvirt_to_maddr(va, &maddr, flags); if ( rc ) goto err;