From patchwork Wed Mar 14 18:20:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 131717 Delivered-To: patch@linaro.org Received: by 10.46.84.17 with SMTP id i17csp157269ljb; Wed, 14 Mar 2018 11:22:49 -0700 (PDT) X-Google-Smtp-Source: AG47ELuBmd4I6LPeaUmpymUYY+YmOMOL5E9TYDEPb8lwFnt4isazi+GVPa9gtXptKXWWaIvhIEeh X-Received: by 2002:a24:2e4e:: with SMTP id i75-v6mr2998816ita.96.1521051769680; Wed, 14 Mar 2018 11:22:49 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1521051769; cv=none; d=google.com; s=arc-20160816; b=vhF4M6YboQzqKRx4q72a9n2NYoXsME0WSdS4DaIRzcq7I3/+T8Qau2taCfHnMz0WnV bgEvnoqxrOzpEdEZO9SU0CGrudqw/ILVCV7nLwibn7Om6pmJfpjUKDRKZ5Urw0ABk578 SPl8ja8h0elVzcq4gx5ydA39fgANNKLYpR5dFq/8x6SBQA1H3aSUW7+CZvj8vglvuUBp F/b41pAYK8sLJRHANkvZaFXgS/2q2IhaoIkhzBLCrqJuz80TO7OpFFic2Z/oIGkRnanU y/0sRGSI6aE1N/zRCwGu7M6Nk0ZZv5SLxTc73uyoRboZ+qvdMb6TyMrWOB7MKygOsI0n tpgg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version :list-subscribe:list-help:list-post:list-unsubscribe:list-id :precedence:subject:cc:references:in-reply-to:message-id:date:to :from:arc-authentication-results; bh=dtHQw+iLj4qhOni6TqNrD5a14hdp/MhAm2HFjsQqjKM=; b=F07zMtlZSOg1rlohYwSBh/QexP5NoTO+B3HHEOt4l6kUc1w40BuZlY5Kp4ZXeA2lrk 3I/a+qZvLo4w0Q3dbfNtJvMlrhC6rWZ0lliVJXrPqrt26HFCAaQ309UfTC+pyLTsvXpr TpiXPvUDatVQ+6JgA7rsP6ECM+O2rVunOixjjRt7tQVzFJ5Sb3qP6OmekiWJQO7qzNwI Ou7yDXmu2v4MFXQlnGm/XL/I+DDa2alguBIV5MF3Jzyd6KlV/OGDKGOVcYREZ+e90kUI 5Zi+HBLl57aWNo8x9EnRNAxRj8kASx1quBADztE0Fc6fW4ZLTZDVinghA9jjjwelScBl iTfw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Return-Path: Received: from lists.xenproject.org (lists.xenproject.org. [192.237.175.120]) by mx.google.com with ESMTPS id k81si2037211iof.200.2018.03.14.11.22.49 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 14 Mar 2018 11:22:49 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) client-ip=192.237.175.120; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of xen-devel-bounces@lists.xenproject.org designates 192.237.175.120 as permitted sender) smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ewB14-0007Cg-6k; Wed, 14 Mar 2018 18:20:46 +0000 Received: from all-amaz-eas1.inumbo.com ([34.197.232.57]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ewB13-00073o-AT for xen-devel@lists.xen.org; Wed, 14 Mar 2018 18:20:45 +0000 X-Inumbo-ID: 69a51c47-27b4-11e8-8248-2fda3a446a53 Received: from foss.arm.com (unknown [217.140.101.70]) by us1-amaz-eas1.inumbo.com (Halon) with ESMTP id 69a51c47-27b4-11e8-8248-2fda3a446a53; Wed, 14 Mar 2018 18:20:45 +0000 (UTC) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 3D948164F; Wed, 14 Mar 2018 11:20:38 -0700 (PDT) Received: from e108454-lin.cambridge.arm.com (e108454-lin.cambridge.arm.com [10.1.206.53]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 725B03F53D; Wed, 14 Mar 2018 11:20:36 -0700 (PDT) From: julien.grall@arm.com To: xen-devel@lists.xen.org Date: Wed, 14 Mar 2018 18:20:06 +0000 Message-Id: <20180314182009.14274-14-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180314182009.14274-1-julien.grall@arm.com> References: <20180314182009.14274-1-julien.grall@arm.com> Cc: Stefano Stabellini , Wei Liu , George Dunlap , Andrew Cooper , Ian Jackson , Tim Deegan , Julien Grall , Jan Beulich Subject: [Xen-devel] [PATCH v5 13/16] xen/grant: Switch {create, replace}_grant_p2m_mapping to typesafe MFN X-BeenThere: xen-devel@lists.xenproject.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.xenproject.org Sender: "Xen-devel" From: Julien Grall The current prototype is slightly confusing because it takes a guest physical address and a machine physical frame (not address!). Switching to MFN will improve safety and reduce the chance to mistakenly invert the 2 parameters. Signed-off-by: Julien grall Reviewed-by: Wei Liu Reviewed-by: Jan Beulich --- Cc: Stefano Stabellini Cc: Julien Grall Cc: Andrew Cooper Cc: George Dunlap Cc: Ian Jackson Cc: Jan Beulich Cc: Konrad Rzeszutek Wilk Cc: Tim Deegan Cc: Wei Liu Changes in v5: - Add Wei's and Jan's reviewed-by Changes in v4: - Patch added --- xen/arch/arm/mm.c | 10 +++++----- xen/arch/x86/hvm/grant_table.c | 14 +++++++------- xen/arch/x86/pv/grant_table.c | 10 +++++----- xen/common/grant_table.c | 8 ++++---- xen/include/asm-arm/grant_table.h | 9 ++++----- xen/include/asm-x86/grant_table.h | 4 ++-- xen/include/asm-x86/hvm/grant_table.h | 8 ++++---- xen/include/asm-x86/pv/grant_table.h | 8 ++++---- 8 files changed, 35 insertions(+), 36 deletions(-) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index f17907ace8..4268dd5c2d 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -1423,7 +1423,7 @@ void gnttab_mark_dirty(struct domain *d, unsigned long l) } } -int create_grant_host_mapping(unsigned long addr, unsigned long frame, +int create_grant_host_mapping(unsigned long addr, mfn_t frame, unsigned int flags, unsigned int cache_flags) { int rc; @@ -1436,7 +1436,7 @@ int create_grant_host_mapping(unsigned long addr, unsigned long frame, t = p2m_grant_map_ro; rc = guest_physmap_add_entry(current->domain, gaddr_to_gfn(addr), - _mfn(frame), 0, t); + frame, 0, t); if ( rc ) return GNTST_general_error; @@ -1444,8 +1444,8 @@ int create_grant_host_mapping(unsigned long addr, unsigned long frame, return GNTST_okay; } -int replace_grant_host_mapping(unsigned long addr, unsigned long mfn, - unsigned long new_addr, unsigned int flags) +int replace_grant_host_mapping(unsigned long addr, mfn_t mfn, + unsigned long new_addr, unsigned int flags) { gfn_t gfn = gaddr_to_gfn(addr); struct domain *d = current->domain; @@ -1454,7 +1454,7 @@ int replace_grant_host_mapping(unsigned long addr, unsigned long mfn, if ( new_addr != 0 || (flags & GNTMAP_contains_pte) ) return GNTST_general_error; - rc = guest_physmap_remove_page(d, gfn, _mfn(mfn), 0); + rc = guest_physmap_remove_page(d, gfn, mfn, 0); return rc ? GNTST_general_error : GNTST_okay; } diff --git a/xen/arch/x86/hvm/grant_table.c b/xen/arch/x86/hvm/grant_table.c index 9ca9fe0425..ecd7d078ab 100644 --- a/xen/arch/x86/hvm/grant_table.c +++ b/xen/arch/x86/hvm/grant_table.c @@ -25,7 +25,7 @@ #include -int create_grant_p2m_mapping(uint64_t addr, unsigned long frame, +int create_grant_p2m_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags) { @@ -41,14 +41,14 @@ int create_grant_p2m_mapping(uint64_t addr, unsigned long frame, p2mt = p2m_grant_map_rw; rc = guest_physmap_add_entry(current->domain, _gfn(addr >> PAGE_SHIFT), - _mfn(frame), PAGE_ORDER_4K, p2mt); + frame, PAGE_ORDER_4K, p2mt); if ( rc ) return GNTST_general_error; else return GNTST_okay; } -int replace_grant_p2m_mapping(uint64_t addr, unsigned long frame, +int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags) { unsigned long gfn = (unsigned long)(addr >> PAGE_SHIFT); @@ -60,15 +60,15 @@ int replace_grant_p2m_mapping(uint64_t addr, unsigned long frame, return GNTST_general_error; old_mfn = get_gfn(d, gfn, &type); - if ( !p2m_is_grant(type) || mfn_x(old_mfn) != frame ) + if ( !p2m_is_grant(type) || !mfn_eq(old_mfn, frame) ) { put_gfn(d, gfn); gdprintk(XENLOG_WARNING, - "old mapping invalid (type %d, mfn %" PRI_mfn ", frame %lx)\n", - type, mfn_x(old_mfn), frame); + "old mapping invalid (type %d, mfn %" PRI_mfn ", frame %"PRI_mfn")\n", + type, mfn_x(old_mfn), mfn_x(frame)); return GNTST_general_error; } - if ( guest_physmap_remove_page(d, _gfn(gfn), _mfn(frame), PAGE_ORDER_4K) ) + if ( guest_physmap_remove_page(d, _gfn(gfn), frame, PAGE_ORDER_4K) ) { put_gfn(d, gfn); return GNTST_general_error; diff --git a/xen/arch/x86/pv/grant_table.c b/xen/arch/x86/pv/grant_table.c index 4dbc550366..458085e1b6 100644 --- a/xen/arch/x86/pv/grant_table.c +++ b/xen/arch/x86/pv/grant_table.c @@ -50,7 +50,7 @@ static unsigned int grant_to_pte_flags(unsigned int grant_flags, return pte_flags; } -int create_grant_pv_mapping(uint64_t addr, unsigned long frame, +int create_grant_pv_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags) { struct vcpu *curr = current; @@ -60,7 +60,7 @@ int create_grant_pv_mapping(uint64_t addr, unsigned long frame, mfn_t gl1mfn; int rc = GNTST_general_error; - nl1e = l1e_from_pfn(frame, grant_to_pte_flags(flags, cache_flags)); + nl1e = l1e_from_mfn(frame, grant_to_pte_flags(flags, cache_flags)); nl1e = adjust_guest_l1e(nl1e, currd); /* @@ -192,7 +192,7 @@ static bool steal_linear_address(unsigned long linear, l1_pgentry_t *out) * new_addr has only ever been available via GNTABOP_unmap_and_replace, and * only when !(flags & GNTMAP_contains_pte). */ -int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, +int replace_grant_pv_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags) { struct vcpu *curr = current; @@ -282,14 +282,14 @@ int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, * Check that the address supplied is actually mapped to frame (with * appropriate permissions). */ - if ( unlikely(l1e_get_pfn(ol1e) != frame) || + if ( unlikely(!mfn_eq(l1e_get_mfn(ol1e), frame)) || unlikely((l1e_get_flags(ol1e) ^ grant_pte_flags) & (_PAGE_PRESENT | _PAGE_RW)) ) { gdprintk(XENLOG_ERR, "PTE %"PRIpte" for %"PRIx64" doesn't match grant (%"PRIpte")\n", l1e_get_intpte(ol1e), addr, - l1e_get_intpte(l1e_from_pfn(frame, grant_pte_flags))); + l1e_get_intpte(l1e_from_mfn(frame, grant_pte_flags))); goto out_unlock; } diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c index 18201912e4..f9e3d1bb95 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1071,7 +1071,7 @@ map_grant_ref( if ( op->flags & GNTMAP_host_map ) { - rc = create_grant_host_mapping(op->host_addr, frame, op->flags, + rc = create_grant_host_mapping(op->host_addr, _mfn(frame), op->flags, cache_flags); if ( rc != GNTST_okay ) goto undo_out; @@ -1111,7 +1111,7 @@ map_grant_ref( typecnt++; } - rc = create_grant_host_mapping(op->host_addr, frame, op->flags, 0); + rc = create_grant_host_mapping(op->host_addr, _mfn(frame), op->flags, 0); if ( rc != GNTST_okay ) goto undo_out; @@ -1188,7 +1188,7 @@ map_grant_ref( undo_out: if ( host_map_created ) { - replace_grant_host_mapping(op->host_addr, frame, 0, op->flags); + replace_grant_host_mapping(op->host_addr, _mfn(frame), 0, op->flags); gnttab_flush_tlb(ld); } @@ -1374,7 +1374,7 @@ unmap_common( if ( op->host_addr && (flags & GNTMAP_host_map) ) { if ( (rc = replace_grant_host_mapping(op->host_addr, - op->frame, op->new_addr, + _mfn(op->frame), op->new_addr, flags)) < 0 ) goto act_release_out; diff --git a/xen/include/asm-arm/grant_table.h b/xen/include/asm-arm/grant_table.h index 5b8994cbd5..b05e5ca22d 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -14,12 +14,11 @@ struct grant_table_arch { }; void gnttab_clear_flag(unsigned long nr, uint16_t *addr); -int create_grant_host_mapping(unsigned long gpaddr, - unsigned long mfn, unsigned int flags, unsigned int - cache_flags); +int create_grant_host_mapping(unsigned long gpaddr, mfn_t mfn, + unsigned int flags, unsigned int cache_flags); #define gnttab_host_mapping_get_page_type(ro, ld, rd) (0) -int replace_grant_host_mapping(unsigned long gpaddr, unsigned long mfn, - unsigned long new_gpaddr, unsigned int flags); +int replace_grant_host_mapping(unsigned long gpaddr, mfn_t mfn, + unsigned long new_gpaddr, unsigned int flags); void gnttab_mark_dirty(struct domain *d, unsigned long l); #define gnttab_create_status_page(d, t, i) do {} while (0) #define gnttab_release_host_mappings(domain) 1 diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-x86/grant_table.h index 66e9742003..05a457b7eb 100644 --- a/xen/include/asm-x86/grant_table.h +++ b/xen/include/asm-x86/grant_table.h @@ -21,7 +21,7 @@ struct grant_table_arch { * Caller must own caller's BIGLOCK, is responsible for flushing the TLB, and * must hold a reference to the page. */ -static inline int create_grant_host_mapping(uint64_t addr, unsigned long frame, +static inline int create_grant_host_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags) { @@ -30,7 +30,7 @@ static inline int create_grant_host_mapping(uint64_t addr, unsigned long frame, return create_grant_pv_mapping(addr, frame, flags, cache_flags); } -static inline int replace_grant_host_mapping(uint64_t addr, unsigned long frame, +static inline int replace_grant_host_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags) { diff --git a/xen/include/asm-x86/hvm/grant_table.h b/xen/include/asm-x86/hvm/grant_table.h index 711ce9b560..a5612585b3 100644 --- a/xen/include/asm-x86/hvm/grant_table.h +++ b/xen/include/asm-x86/hvm/grant_table.h @@ -23,24 +23,24 @@ #ifdef CONFIG_HVM -int create_grant_p2m_mapping(uint64_t addr, unsigned long frame, +int create_grant_p2m_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags); -int replace_grant_p2m_mapping(uint64_t addr, unsigned long frame, +int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags); #else #include -static inline int create_grant_p2m_mapping(uint64_t addr, unsigned long frame, +static inline int create_grant_p2m_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags) { return GNTST_general_error; } -static inline int replace_grant_p2m_mapping(uint64_t addr, unsigned long frame, +static inline int replace_grant_p2m_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags) { return GNTST_general_error; diff --git a/xen/include/asm-x86/pv/grant_table.h b/xen/include/asm-x86/pv/grant_table.h index 556e68f0eb..85442b6074 100644 --- a/xen/include/asm-x86/pv/grant_table.h +++ b/xen/include/asm-x86/pv/grant_table.h @@ -23,23 +23,23 @@ #ifdef CONFIG_PV -int create_grant_pv_mapping(uint64_t addr, unsigned long frame, +int create_grant_pv_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags); -int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, +int replace_grant_pv_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags); #else #include -static inline int create_grant_pv_mapping(uint64_t addr, unsigned long frame, +static inline int create_grant_pv_mapping(uint64_t addr, mfn_t frame, unsigned int flags, unsigned int cache_flags) { return GNTST_general_error; } -static inline int replace_grant_pv_mapping(uint64_t addr, unsigned long frame, +static inline int replace_grant_pv_mapping(uint64_t addr, mfn_t frame, uint64_t new_addr, unsigned int flags) { return GNTST_general_error;