All of lore.kernel.org
 help / color / mirror / Atom feed
From: Julien Grall <julien.grall@arm.com>
To: xen-devel@lists.xen.org
Cc: Julien Grall <julien.grall@arm.com>,
	sstabellini@kernel.org, punit.agrawal@arm.com
Subject: [PATCH 16/24] xen/arm: mm: Use typesafe mfn for xenheap_mfn_*
Date: Tue, 13 Jun 2017 17:13:15 +0100	[thread overview]
Message-ID: <20170613161323.25196-17-julien.grall@arm.com> (raw)
In-Reply-To: <20170613161323.25196-1-julien.grall@arm.com>

Add more safety when using xenheap_mfn_*.

Signed-off-by: Julien Grall <julien.grall@arm.com>
---
 xen/arch/arm/mm.c        | 16 ++++++++--------
 xen/arch/arm/setup.c     | 18 +++++++++---------
 xen/include/asm-arm/mm.h | 11 ++++++-----
 3 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 0014c24ecc..fb01f01879 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -138,8 +138,8 @@ uint64_t init_ttbr;
 static paddr_t phys_offset;
 
 /* Limits of the Xen heap */
-unsigned long xenheap_mfn_start __read_mostly = ~0UL;
-unsigned long xenheap_mfn_end __read_mostly;
+mfn_t xenheap_mfn_start __read_mostly = INVALID_MFN;
+mfn_t xenheap_mfn_end __read_mostly;
 vaddr_t xenheap_virt_end __read_mostly;
 #ifdef CONFIG_ARM_64
 vaddr_t xenheap_virt_start __read_mostly;
@@ -801,8 +801,8 @@ void __init setup_xenheap_mappings(unsigned long base_mfn,
 
     /* Record where the xenheap is, for translation routines. */
     xenheap_virt_end = XENHEAP_VIRT_START + nr_mfns * PAGE_SIZE;
-    xenheap_mfn_start = base_mfn;
-    xenheap_mfn_end = base_mfn + nr_mfns;
+    xenheap_mfn_start = _mfn(base_mfn);
+    xenheap_mfn_end = _mfn(base_mfn + nr_mfns);
 }
 #else /* CONFIG_ARM_64 */
 void __init setup_xenheap_mappings(unsigned long base_mfn,
@@ -816,16 +816,16 @@ void __init setup_xenheap_mappings(unsigned long base_mfn,
     mfn = base_mfn & ~((FIRST_SIZE>>PAGE_SHIFT)-1);
 
     /* First call sets the xenheap physical and virtual offset. */
-    if ( xenheap_mfn_start == ~0UL )
+    if ( mfn_eq(xenheap_mfn_start, INVALID_MFN) )
     {
-        xenheap_mfn_start = base_mfn;
+        xenheap_mfn_start = _mfn(base_mfn);
         xenheap_virt_start = DIRECTMAP_VIRT_START +
             (base_mfn - mfn) * PAGE_SIZE;
     }
 
-    if ( base_mfn < xenheap_mfn_start )
+    if ( base_mfn < mfn_x(xenheap_mfn_start) )
         panic("cannot add xenheap mapping at %lx below heap start %lx",
-              base_mfn, xenheap_mfn_start);
+              base_mfn, mfn_x(xenheap_mfn_start));
 
     end_mfn = base_mfn + nr_mfns;
 
diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
index ab4d8e4218..3b34855668 100644
--- a/xen/arch/arm/setup.c
+++ b/xen/arch/arm/setup.c
@@ -555,8 +555,8 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
      * and enough mapped pages for copying the DTB.
      */
     dtb_pages = (dtb_size + PAGE_SIZE-1) >> PAGE_SHIFT;
-    boot_mfn_start = xenheap_mfn_end - dtb_pages - 1;
-    boot_mfn_end = xenheap_mfn_end;
+    boot_mfn_start = mfn_x(xenheap_mfn_end) - dtb_pages - 1;
+    boot_mfn_end = mfn_x(xenheap_mfn_end);
 
     init_boot_pages(pfn_to_paddr(boot_mfn_start), pfn_to_paddr(boot_mfn_end));
 
@@ -591,11 +591,11 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
                 e = bank_end;
 
             /* Avoid the xenheap */
-            if ( s < pfn_to_paddr(xenheap_mfn_start+xenheap_pages)
-                 && pfn_to_paddr(xenheap_mfn_start) < e )
+            if ( s < mfn_to_maddr(mfn_add(xenheap_mfn_start, xenheap_pages))
+                 && mfn_to_maddr(xenheap_mfn_start) < e )
             {
-                e = pfn_to_paddr(xenheap_mfn_start);
-                n = pfn_to_paddr(xenheap_mfn_start+xenheap_pages);
+                e = mfn_to_maddr(xenheap_mfn_start);
+                n = mfn_to_maddr(mfn_add(xenheap_mfn_start, xenheap_pages));
             }
 
             dt_unreserved_regions(s, e, init_boot_pages, 0);
@@ -610,7 +610,7 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
 
     /* Add xenheap memory that was not already added to the boot
        allocator. */
-    init_xenheap_pages(pfn_to_paddr(xenheap_mfn_start),
+    init_xenheap_pages(mfn_to_maddr(xenheap_mfn_start),
                        pfn_to_paddr(boot_mfn_start));
 }
 #else /* CONFIG_ARM_64 */
@@ -662,8 +662,8 @@ static void __init setup_mm(unsigned long dtb_paddr, size_t dtb_size)
     total_pages += ram_size >> PAGE_SHIFT;
 
     xenheap_virt_end = XENHEAP_VIRT_START + ram_end - ram_start;
-    xenheap_mfn_start = ram_start >> PAGE_SHIFT;
-    xenheap_mfn_end = ram_end >> PAGE_SHIFT;
+    xenheap_mfn_start = maddr_to_mfn(ram_start);
+    xenheap_mfn_end = maddr_to_mfn(ram_end);
 
     /*
      * Need enough mapped pages for copying the DTB.
diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h
index a42da20f0a..3dab6dc9a1 100644
--- a/xen/include/asm-arm/mm.h
+++ b/xen/include/asm-arm/mm.h
@@ -115,7 +115,7 @@ struct page_info
 #define PGC_count_width   PG_shift(9)
 #define PGC_count_mask    ((1UL<<PGC_count_width)-1)
 
-extern unsigned long xenheap_mfn_start, xenheap_mfn_end;
+extern mfn_t xenheap_mfn_start, xenheap_mfn_end;
 extern vaddr_t xenheap_virt_end;
 #ifdef CONFIG_ARM_64
 extern vaddr_t xenheap_virt_start;
@@ -125,7 +125,8 @@ extern vaddr_t xenheap_virt_start;
 #define is_xen_heap_page(page) is_xen_heap_mfn(page_to_mfn(page))
 #define is_xen_heap_mfn(mfn) ({                                 \
     unsigned long _mfn = (mfn);                                 \
-    (_mfn >= xenheap_mfn_start && _mfn < xenheap_mfn_end);      \
+    (_mfn >= mfn_x(xenheap_mfn_start) &&                        \
+     _mfn < mfn_x(xenheap_mfn_end));                            \
 })
 #else
 #define is_xen_heap_page(page) ((page)->count_info & PGC_xen_heap)
@@ -235,7 +236,7 @@ static inline paddr_t __virt_to_maddr(vaddr_t va)
 static inline void *maddr_to_virt(paddr_t ma)
 {
     ASSERT(is_xen_heap_mfn(ma >> PAGE_SHIFT));
-    ma -= pfn_to_paddr(xenheap_mfn_start);
+    ma -= mfn_to_maddr(xenheap_mfn_start);
     return (void *)(unsigned long) ma + XENHEAP_VIRT_START;
 }
 #else
@@ -243,7 +244,7 @@ static inline void *maddr_to_virt(paddr_t ma)
 {
     ASSERT(pfn_to_pdx(ma >> PAGE_SHIFT) < (DIRECTMAP_SIZE >> PAGE_SHIFT));
     return (void *)(XENHEAP_VIRT_START -
-                    pfn_to_paddr(xenheap_mfn_start) +
+                    mfn_to_maddr(xenheap_mfn_start) +
                     ((ma & ma_va_bottom_mask) |
                      ((ma & ma_top_mask) >> pfn_pdx_hole_shift)));
 }
@@ -284,7 +285,7 @@ static inline struct page_info *virt_to_page(const void *v)
     ASSERT(va < xenheap_virt_end);
 
     pdx = (va - XENHEAP_VIRT_START) >> PAGE_SHIFT;
-    pdx += pfn_to_pdx(xenheap_mfn_start);
+    pdx += pfn_to_pdx(mfn_x(xenheap_mfn_start));
     return frame_table + pdx - frametable_base_pdx;
 }
 
-- 
2.11.0


_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2017-06-13 16:13 UTC|newest]

Thread overview: 64+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-13 16:12 [PATCH 00/24] xen/arm: Extend the usage of typesafe MFN Julien Grall
2017-06-13 16:13 ` [PATCH 01/24] xen/mm: Don't use _{g, m}fn for defining INVALID_{G, M}FN Julien Grall
2017-06-13 16:20   ` Andrew Cooper
2017-06-14  8:40     ` Jan Beulich
2017-06-14  8:49   ` Tim Deegan
2017-06-14  9:40     ` Julien Grall
2017-06-14  9:56       ` Jan Beulich
2017-06-13 16:13 ` [PATCH 02/24] xen/arm: gic-v2: Fix indentation in gicv2_map_hwdom_extra_mappings Julien Grall
2017-06-15 22:22   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 03/24] xen/arm: setup: Remove bogus xenheap_mfn_end in setup_mm for arm64 Julien Grall
2017-06-15 22:28   ` Stefano Stabellini
2017-06-16  6:52     ` Julien Grall
2017-06-16 17:33       ` Stefano Stabellini
2017-06-16 18:18         ` Julien Grall
2017-06-16 20:55           ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 04/24] xen/arm: mm: Introduce clear_table and use it Julien Grall
2017-06-15 22:31   ` Stefano Stabellini
2017-06-16  6:55     ` Julien Grall
2017-06-13 16:13 ` [PATCH 05/24] xen/arm: mm: Move mfn_to_xen_entry from page.h to mm.c Julien Grall
2017-06-15 22:34   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 06/24] xen/arm: mm: Fix coding style of mfn_to_xen_entry Julien Grall
2017-06-15 22:35   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 07/24] xen/arm: mm: Clean-up mfn_to_xen_entry Julien Grall
2017-06-15 22:38   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 08/24] xen/arm: mm: Use typesafe MFN in mfn_to_xen_entry Julien Grall
2017-06-15 22:40   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 09/24] xen/arm: Define mfn_to_page/page_to_mfn in term of __mfn_to_page/__page_to_mfn Julien Grall
2017-06-15 22:42   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 10/24] xen/arm: domain_build: Replace paddr_to_pfn(virt_to_maddr(.)) by virt_to_mfn(.) Julien Grall
2017-06-15 22:44   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 11/24] xen/arm: mm: Replace __va(pfn_to_paddr(...)) by mfn_to_virt Julien Grall
2017-06-15 22:45   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 12/24] xen/arm: Replace DIV_ROUND_UP(..., PAGE_SIZE) by PFN_UP(...) Julien Grall
2017-06-15 22:47   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 13/24] xen/arm: traps: Replace p2m_lookup(..., ..., NULL) by gfn_to_mfn(..., ...) Julien Grall
2017-06-15 22:49   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 14/24] xen/arm: Introduce wrappers for MFN <-> MADDR and GFN <-> GADDR Julien Grall
2017-06-15 22:57   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 15/24] xen/arm: Use the newly introduced MFN <-> MADDR and GFN <-> MADDR helpers Julien Grall
2017-06-15 18:34   ` Tamas K Lengyel
2017-06-15 23:05   ` Stefano Stabellini
2017-06-13 16:13 ` Julien Grall [this message]
2017-06-15 23:12   ` [PATCH 16/24] xen/arm: mm: Use typesafe mfn for xenheap_mfn_* Stefano Stabellini
2017-06-16  6:58     ` Julien Grall
2017-06-16 18:08     ` Julien Grall
2017-06-13 16:13 ` [PATCH 17/24] xen/arm: mm: Use typesafe MFN in set_fixmap Julien Grall
2017-06-15 23:28   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 18/24] xen/arm: mm: Use typesafe MFN in dump_pt_walk Julien Grall
2017-06-15 23:30   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 19/24] xen/arm: p2m: Redefine mfn_to_page and page_to_mfn to use typesafe Julien Grall
2017-06-15 23:37   ` Stefano Stabellini
2017-06-16  7:13     ` Julien Grall
2017-06-13 16:13 ` [PATCH 20/24] xen/arm: mm: Redefine virt_to_mfn to support typesafe Julien Grall
2017-06-15 23:44   ` Stefano Stabellini
2017-06-16  7:15     ` Julien Grall
2017-06-13 16:13 ` [PATCH 21/24] xen/arm: domain_build: " Julien Grall
2017-06-15 23:46   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 22/24] xen/arm: alternative: " Julien Grall
2017-06-15 23:46   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 23/24] xen/arm: livepatch: " Julien Grall
2017-06-15 23:47   ` Stefano Stabellini
2017-06-13 16:13 ` [PATCH 24/24] xen/arm: create_xen_entries: Use typesafe MFN Julien Grall
2017-06-15 23:49   ` Stefano Stabellini
2017-06-16  0:02 ` [PATCH 00/24] xen/arm: Extend the usage of " Stefano Stabellini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20170613161323.25196-17-julien.grall@arm.com \
    --to=julien.grall@arm.com \
    --cc=punit.agrawal@arm.com \
    --cc=sstabellini@kernel.org \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.