From patchwork Wed Feb 21 14:02:56 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Julien Grall X-Patchwork-Id: 129070 Delivered-To: patch@linaro.org Received: by 10.46.124.24 with SMTP id x24csp662588ljc; Wed, 21 Feb 2018 06:06:00 -0800 (PST) X-Google-Smtp-Source: AH8x225rbgxsiRlrI6ZgBxn4TMrALWBzTUoVm1x85QMuyz1Nm4GOT2EnlDnHfaENzut/Ppbo/o+0 X-Received: by 10.176.16.230 with SMTP id x38mr2326083uab.15.1519221960092; Wed, 21 Feb 2018 06:06:00 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519221960; cv=none; d=google.com; s=arc-20160816; b=sR/2Mwt9yaDkU5bTaDUMDQ/yIGs2KClunOBKTdqaoONltxcNzPTenJNE+wMsbQnyQF QMr7BKtNANySzgevGfTZXPEXMz9DtXgDGqCLNrjzbfZmejYIcmbLzgyPjNB5xVJZg5px 01vB2kS9rJZ/G8uE534L04lJ4mFh0OeRoUQvMYiVwfnxGplcXCMf18oCKN4Gwxw5/XXS uiuzWW76CW7229/qvLNnXQdNWHFNlz41jfAnWCcmS3RPv+SGSjGPy4a+CbbuNPRTpZS/ fVOnyL3gSGWRMx8eOeGOc/Cv+k1robuUu/KTAFjIbTD4/Nsa5jLsFXWsm+pT4UhHZIvg G/xw== 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=W3uvnYY3ZAKKudlNMp15q/A2d2O/F2PWoWrub8nr7vU=; b=qflGJ1tbIntGzzVCLSHSbnu6PjoiTMO7Zn8r57/M1Lrd/qh3aN6N/GhKu2w0+uc8tL uuy8EmpDPCKkfSa74wNn4Qhs7lwvwKubXv4Ypl43x72tdn62g1PnrlE7cgaksv3gb7M+ +V4rJJt3a27hpFmqrEWULCGC5hitWtM9UcOmdTWU2qOjVR2DnZr9aiDtHI5g4rh0N6Cy udWW7tTRPF+hmbq4s2q7uoUR3Cy/6DO5zeakISkQDp3C1HuvcoH7SbWnw5z+iShEbUTD FvqxUHC+pk/KI+qDOZZsnhzWAsz2HZpc7BVooFXWpxv9TH/fGEcIE8gtKWp2HgB5pHgE zZFw== 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 a4si3294156uae.75.2018.02.21.06.05.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 21 Feb 2018 06:05:59 -0800 (PST) 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 1eoUzg-0004Zh-Gy; Wed, 21 Feb 2018 14:03:36 +0000 Received: from us1-rack-dfw2.inumbo.com ([104.130.134.6]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1eoUzf-0004YX-8g for xen-devel@lists.xen.org; Wed, 21 Feb 2018 14:03:35 +0000 X-Inumbo-ID: e4da7e5d-170f-11e8-ba59-bc764e045a96 Received: from foss.arm.com (unknown [217.140.101.70]) by us1-rack-dfw2.inumbo.com (Halon) with ESMTP id e4da7e5d-170f-11e8-ba59-bc764e045a96; Wed, 21 Feb 2018 15:02:46 +0100 (CET) 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 63CE41435; Wed, 21 Feb 2018 06:03:33 -0800 (PST) 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 96E4E3F318; Wed, 21 Feb 2018 06:03:31 -0800 (PST) From: Julien Grall To: xen-devel@lists.xen.org Date: Wed, 21 Feb 2018 14:02:56 +0000 Message-Id: <20180221140259.29360-14-julien.grall@arm.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20180221140259.29360-1-julien.grall@arm.com> References: <20180221140259.29360-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 v4 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" 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 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 48c547930c..c555c1d451 100644 --- a/xen/common/grant_table.c +++ b/xen/common/grant_table.c @@ -1036,7 +1036,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; @@ -1076,7 +1076,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; @@ -1153,7 +1153,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); } @@ -1339,7 +1339,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 0dfdc5577f..ffff18d456 100644 --- a/xen/include/asm-arm/grant_table.h +++ b/xen/include/asm-arm/grant_table.h @@ -13,12 +13,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_status_gmfn(d, t, i) (0) diff --git a/xen/include/asm-x86/grant_table.h b/xen/include/asm-x86/grant_table.h index d9157e4417..e40ac8e3e7 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;