From patchwork Wed Jan 27 20:06:41 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Tamas K Lengyel X-Patchwork-Id: 8140551 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 59FA99F38B for ; Wed, 27 Jan 2016 20:09:50 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 2FFD520256 for ; Wed, 27 Jan 2016 20:09:49 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id DFA622025B for ; Wed, 27 Jan 2016 20:09:47 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aOWMg-0000Vw-8z; Wed, 27 Jan 2016 20:06:54 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aOWMf-0000Vg-3D for xen-devel@lists.xenproject.org; Wed, 27 Jan 2016 20:06:53 +0000 Received: from [193.109.254.147] by server-8.bemta-14.messagelabs.com id A6/C6-24450-C5329A65; Wed, 27 Jan 2016 20:06:52 +0000 X-Env-Sender: tlengyel@novetta.com X-Msg-Ref: server-6.tower-27.messagelabs.com!1453925210!19653190!1 X-Originating-IP: [209.85.214.176] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 3517 invoked from network); 27 Jan 2016 20:06:51 -0000 Received: from mail-ob0-f176.google.com (HELO mail-ob0-f176.google.com) (209.85.214.176) by server-6.tower-27.messagelabs.com with AES128-GCM-SHA256 encrypted SMTP; 27 Jan 2016 20:06:51 -0000 Received: by mail-ob0-f176.google.com with SMTP id ba1so17097441obb.3 for ; Wed, 27 Jan 2016 12:06:51 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=novetta-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=AOYnJHVyX536aij1MKC2ltTVIs8vQvB1jR/cKBjFstE=; b=uQl7VZujN4kVm4szPwpVtiLKjDFBjMnT5HpMIGSrv0Yl/xSx8gMMpqHptMnRpzZJ8m bBTTd9fAl2srVoR92sJG8Ps5EtMLTdpKQvStT6mZEU9YrXvdGHLB9iQ7qpoK5YELLkvY A/DF0AZdoHzr8B3KgkT5y8qGkXJkzWpJjvj0vN2Xf4SKYmlqc7ZGKk+CkQ5C6UHoWvoi cV8OwqrFd8M5iol1IWgD10pjQh/BIvKI+nmXY1QAtgB7pgWwwvuw8f6udDYRtOc3mhTT DkRAhG6pmq1CQw2TAcmRyAH3UZOkzbG82x18F4GyX8abSaCLY1iAq0I9YqbYvkBp6D8o IZJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=AOYnJHVyX536aij1MKC2ltTVIs8vQvB1jR/cKBjFstE=; b=lhgz+KbzjVG12yPxKcCdk9oCkUWCm0LeoJjNWxXJkwOdKsF55balzVT6hzeBl/iwR2 SNgdfg3uy003CILUs9L1BJWLfpMwvfXrhmkhFy0hARPfLKksBOFu7jXUd8dD05OJlUeL Os4aXouKNX3pd3hqGvwpToDXQhD9nnPtC5Zgb9quMr2NiY6JWm4+yLLylfbyYD20mqP2 Y4orBaJlkoTbArkSfBuVUZRPcg1O6+BucBkJrdXRuduH0gWWqlrhisPBBcUtFQOaeOsp Wyqr5gt5MYp6QmVEvJMHCrTx2w8jFk+uzLCwtaTco+/9XNu5uYHKjyPWrRgd1sR8qsYA nw2w== X-Gm-Message-State: AG10YOThfutTNPuIcV0MQs8f7PMucw5CwsXN0G1zzv7kcYHS4Y8Sq/PMqMycxq5zkAIbhjbi X-Received: by 10.182.73.225 with SMTP id o1mr24669434obv.80.1453925210035; Wed, 27 Jan 2016 12:06:50 -0800 (PST) Received: from localhost.localdomain (c-73-14-35-59.hsd1.co.comcast.net. [73.14.35.59]) by smtp.gmail.com with ESMTPSA id a65sm3660186oib.23.2016.01.27.12.06.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 27 Jan 2016 12:06:49 -0800 (PST) From: Tamas K Lengyel To: xen-devel@lists.xenproject.org Date: Wed, 27 Jan 2016 13:06:41 -0700 Message-Id: <1453925201-15926-2-git-send-email-tlengyel@novetta.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1453925201-15926-1-git-send-email-tlengyel@novetta.com> References: <1453925201-15926-1-git-send-email-tlengyel@novetta.com> Cc: Wei Liu , Ian Campbell , Razvan Cojocaru , Stefano Stabellini , George Dunlap , Andrew Cooper , Ian Jackson , Stefano Stabellini , Jan Beulich , Tamas K Lengyel , Keir Fraser Subject: [Xen-devel] [PATCH 2/2] altp2m: Implement p2m_get_mem_access for altp2m views X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED, T_DKIM_INVALID, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Extend the existing get_mem_access memop to allow querying permissions in altp2m views as well. Signed-off-by: Tamas K Lengyel Cc: Ian Jackson Cc: Stefano Stabellini Cc: Ian Campbell Cc: Wei Liu Cc: Razvan Cojocaru Cc: Stefano Stabellini Cc: George Dunlap Cc: Keir Fraser Cc: Jan Beulich Cc: Andrew Cooper Acked-by: Razvan Cojocaru --- tools/libxc/include/xenctrl.h | 3 ++- tools/libxc/xc_mem_access.c | 8 +++++--- tools/tests/xen-access/xen-access.c | 5 ++++- xen/arch/arm/p2m.c | 4 ++-- xen/arch/x86/mm/p2m.c | 23 +++++++++++++++++++---- xen/common/mem_access.c | 2 +- xen/include/xen/p2m-common.h | 3 ++- 7 files changed, 35 insertions(+), 13 deletions(-) diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index b4e57d8..09d9f62 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -2065,7 +2065,8 @@ int xc_set_mem_access(xc_interface *xch, domid_t domain_id, * Gets the mem access for the given page (returned in access on success) */ int xc_get_mem_access(xc_interface *xch, domid_t domain_id, - uint64_t pfn, xenmem_access_t *access); + uint64_t pfn, uint16_t altp2m_idx, + xenmem_access_t *access); /* * Instructions causing a mem_access violation can be emulated by Xen diff --git a/tools/libxc/xc_mem_access.c b/tools/libxc/xc_mem_access.c index d6fb409..a44865d 100644 --- a/tools/libxc/xc_mem_access.c +++ b/tools/libxc/xc_mem_access.c @@ -46,14 +46,16 @@ int xc_set_mem_access(xc_interface *xch, int xc_get_mem_access(xc_interface *xch, domid_t domain_id, uint64_t pfn, + uint16_t altp2m_idx, xenmem_access_t *access) { int rc; xen_mem_access_op_t mao = { - .op = XENMEM_access_op_get_access, - .domid = domain_id, - .pfn = pfn + .op = XENMEM_access_op_get_access, + .domid = domain_id, + .pfn = pfn, + .altp2m_idx = altp2m_idx }; rc = do_memory_op(xch, XENMEM_access_op, &mao, sizeof(mao)); diff --git a/tools/tests/xen-access/xen-access.c b/tools/tests/xen-access/xen-access.c index 2300e9a..d9dda62 100644 --- a/tools/tests/xen-access/xen-access.c +++ b/tools/tests/xen-access/xen-access.c @@ -571,7 +571,10 @@ int main(int argc, char *argv[]) switch (req.reason) { case VM_EVENT_REASON_MEM_ACCESS: - rc = xc_get_mem_access(xch, domain_id, req.u.mem_access.gfn, &access); + rc = xc_get_mem_access(xch, domain_id, req.u.mem_access.gfn, + ((req.flags & VM_EVENT_FLAG_ALTERNATE_P2M) ? req.altp2m_idx : 0), + &access + ); if (rc < 0) { ERROR("Error %d getting mem_access event\n", rc); diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c index 8e9b4be..932c6e2 100644 --- a/xen/arch/arm/p2m.c +++ b/xen/arch/arm/p2m.c @@ -1666,7 +1666,7 @@ bool_t p2m_mem_access_check(paddr_t gpa, vaddr_t gla, const struct npfec npfec) if ( !p2m->mem_access_enabled ) return true; - rc = p2m_get_mem_access(v->domain, _gfn(paddr_to_pfn(gpa)), &xma); + rc = p2m_get_mem_access(v->domain, _gfn(paddr_to_pfn(gpa)), 0, &xma); if ( rc ) return true; @@ -1847,7 +1847,7 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr, return 0; } -int p2m_get_mem_access(struct domain *d, gfn_t gfn, +int p2m_get_mem_access(struct domain *d, gfn_t gfn, unsigned long altp2m_idx, xenmem_access_t *access) { int ret; diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c index 95bf7ce..18068e8 100644 --- a/xen/arch/x86/mm/p2m.c +++ b/xen/arch/x86/mm/p2m.c @@ -1572,7 +1572,9 @@ void p2m_mem_access_emulate_check(struct vcpu *v, bool_t violation = 1; const struct vm_event_mem_access *data = &rsp->u.mem_access; - if ( p2m_get_mem_access(v->domain, _gfn(data->gfn), &access) == 0 ) + if ( p2m_get_mem_access(v->domain, _gfn(data->gfn), + altp2m_active(v->domain) ? vcpu_altp2m(v).p2midx : 0, + &access) == 0 ) { switch ( access ) { @@ -1918,9 +1920,10 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr, * Get access type for a gfn. * If gfn == INVALID_GFN, gets the default access type. */ -int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access) +int p2m_get_mem_access(struct domain *d, gfn_t gfn, unsigned long altp2m_idx, + xenmem_access_t *access) { - struct p2m_domain *p2m = p2m_get_hostp2m(d); + struct p2m_domain *hp2m = p2m_get_hostp2m(d), *p2m = NULL; p2m_type_t t; p2m_access_t a; mfn_t mfn; @@ -1943,10 +1946,22 @@ int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access) /* If request to get default access. */ if ( gfn_x(gfn) == INVALID_GFN ) { - *access = memaccess[p2m->default_access]; + *access = memaccess[hp2m->default_access]; return 0; } + /* altp2m view 0 is treated as the hostp2m */ + if ( altp2m_idx ) + { + if ( altp2m_idx >= MAX_ALTP2M || + d->arch.altp2m_eptp[altp2m_idx] == INVALID_MFN ) + return -EINVAL; + + p2m = d->arch.altp2m_p2m[altp2m_idx]; + } + else + p2m = hp2m; + gfn_lock(p2m, gfn, 0); mfn = p2m->get_entry(p2m, gfn_x(gfn), &t, &a, 0, NULL, NULL); gfn_unlock(p2m, gfn, 0); diff --git a/xen/common/mem_access.c b/xen/common/mem_access.c index 0411443..a0345a6 100644 --- a/xen/common/mem_access.c +++ b/xen/common/mem_access.c @@ -88,7 +88,7 @@ int mem_access_memop(unsigned long cmd, if ( (mao.pfn > domain_get_maximum_gpfn(d)) && mao.pfn != ~0ull ) break; - rc = p2m_get_mem_access(d, _gfn(mao.pfn), &access); + rc = p2m_get_mem_access(d, _gfn(mao.pfn), mao.altp2m_idx, &access); if ( rc != 0 ) break; diff --git a/xen/include/xen/p2m-common.h b/xen/include/xen/p2m-common.h index 0643ad5..2835f24 100644 --- a/xen/include/xen/p2m-common.h +++ b/xen/include/xen/p2m-common.h @@ -56,6 +56,7 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr, * Get access type for a gfn. * If gfn == INVALID_GFN, gets the default access type. */ -int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access); +int p2m_get_mem_access(struct domain *d, gfn_t gfn, unsigned long altp2m_idx, + xenmem_access_t *access); #endif /* _XEN_P2M_COMMON_H */