]> xenbits.xensource.com Git - people/liuw/xen.git/commitdiff
XXX change conversion functions
authorWei Liu <wei.liu2@citrix.com>
Mon, 18 Feb 2019 12:29:04 +0000 (12:29 +0000)
committerWei Liu <wei.liu2@citrix.com>
Mon, 25 Feb 2019 15:58:35 +0000 (15:58 +0000)
Need to make some functions non-static to avoid header inclusion hell.

xen/arch/x86/x86_64/mm.c
xen/include/asm-x86/mm.h
xen/include/asm-x86/x86_64/page.h

index 60cfc962c32c7d5e389e10ab645c5f7381a2da0d..0c46293f801425466cd00da3d068f408a1079c49 100644 (file)
@@ -1589,6 +1589,44 @@ destroy_frametable:
     return ret;
 }
 
+unsigned long __virt_to_maddr(unsigned long va)
+{
+    ASSERT(va < DIRECTMAP_VIRT_END);
+
+    /* XXX ??? */
+    if ( va >= VMAP_VIRT_START && va < VMAP_VIRT_END )
+        return mfn_to_maddr(vmap_to_mfn(va));
+    if ( va >= DIRECTMAP_VIRT_START )
+        va -= DIRECTMAP_VIRT_START;
+    else
+    {
+        BUILD_BUG_ON(XEN_VIRT_END - XEN_VIRT_START != GB(1));
+        /* Signed, so ((long)XEN_VIRT_START >> 30) fits in an imm32. */
+        ASSERT(((long)va >> (PAGE_ORDER_1G + PAGE_SHIFT)) ==
+               ((long)XEN_VIRT_START >> (PAGE_ORDER_1G + PAGE_SHIFT)));
+
+        va += xen_phys_start - XEN_VIRT_START;
+    }
+    return (va & ma_va_bottom_mask) |
+           ((va << pfn_pdx_hole_shift) & ma_top_mask);
+}
+
+void *__maddr_to_virt(unsigned long ma)
+{
+    /* XXX ??? */
+    if ( pfn_to_pdx(ma >> PAGE_SHIFT) < (DIRECTMAP_SIZE >> PAGE_SHIFT) )
+        return (void *)(DIRECTMAP_VIRT_START +
+                        ((ma & ma_va_bottom_mask) |
+                         ((ma & ma_top_mask) >> pfn_pdx_hole_shift)));
+    else
+    {
+        struct page_info *pg = mfn_to_page(maddr_to_mfn(ma));
+
+        ASSERT(get_page_address(pg));
+        return get_page_address(pg);
+    }
+}
+
 #include "compat/mm.c"
 
 /*
index 4360f4f9e3f9d79203fac0c33c3b5cbd1721afdb..661e803e45cd4ba34617c75e7694ffee4d6c08da 100644 (file)
@@ -321,13 +321,18 @@ void init_frametable(void);
 
 #define PDX_GROUP_SHIFT L2_PAGETABLE_SHIFT
 
+l1_pgentry_t *virt_to_xen_l1e(unsigned long v);
+
 /* Convert between Xen-heap virtual addresses and page-info structures. */
 static inline struct page_info *__virt_to_page(const void *v)
 {
     unsigned long va = (unsigned long)v;
 
-    ASSERT(va >= XEN_VIRT_START);
+    ASSERT(va >= XEN_VIRT_START ||
+           (va >= VMAP_VIRT_START && va < VMAP_VIRT_END));
     ASSERT(va < DIRECTMAP_VIRT_END);
+    if ( va >= VMAP_VIRT_START && va < VMAP_VIRT_END )
+        return vmap_to_page(va);
     if ( va < XEN_VIRT_END )
         va += DIRECTMAP_VIRT_START - XEN_VIRT_START + xen_phys_start;
     else
@@ -338,6 +343,12 @@ static inline struct page_info *__virt_to_page(const void *v)
 static inline void *__page_to_virt(const struct page_info *pg)
 {
     ASSERT((unsigned long)pg - FRAMETABLE_VIRT_START < FRAMETABLE_SIZE);
+
+    /* XXX The page must have been mapped at this point */
+    ASSERT(get_page_address(pg));
+    return get_page_address(pg);
+
+#if 0
     /*
      * (sizeof(*pg) & -sizeof(*pg)) selects the LS bit of sizeof(*pg). The
      * division and re-multiplication avoids one shift when sizeof(*pg) is a
@@ -348,6 +359,7 @@ static inline void *__page_to_virt(const struct page_info *pg)
                     ((unsigned long)pg - FRAMETABLE_VIRT_START) /
                     (sizeof(*pg) / (sizeof(*pg) & -sizeof(*pg))) *
                     (PAGE_SIZE / (sizeof(*pg) & -sizeof(*pg))));
+#endif
 }
 
 int free_page_type(struct page_info *page, unsigned long type,
@@ -666,8 +678,6 @@ void free_xen_pagetable(mfn_t mfn);
         (ptr) = NULL;               \
     } while (0)
 
-l1_pgentry_t *virt_to_xen_l1e(unsigned long v);
-
 DECLARE_PER_CPU(mfn_t, root_pgt_mfn);
 
 #endif /* __ASM_X86_MM_H__ */
index 4fe0205553dc7a0588ae0baf001d9fd44fdad5ae..ff6be6f04e1075f098fae713b81c1d8ecaa137b4 100644 (file)
@@ -57,31 +57,8 @@ extern unsigned long xen_virt_end;
 #define pdx_to_virt(pdx) ((void *)(DIRECTMAP_VIRT_START + \
                                    ((unsigned long)(pdx) << PAGE_SHIFT)))
 
-static inline unsigned long __virt_to_maddr(unsigned long va)
-{
-    ASSERT(va < DIRECTMAP_VIRT_END);
-    if ( va >= DIRECTMAP_VIRT_START )
-        va -= DIRECTMAP_VIRT_START;
-    else
-    {
-        BUILD_BUG_ON(XEN_VIRT_END - XEN_VIRT_START != GB(1));
-        /* Signed, so ((long)XEN_VIRT_START >> 30) fits in an imm32. */
-        ASSERT(((long)va >> (PAGE_ORDER_1G + PAGE_SHIFT)) ==
-               ((long)XEN_VIRT_START >> (PAGE_ORDER_1G + PAGE_SHIFT)));
-
-        va += xen_phys_start - XEN_VIRT_START;
-    }
-    return (va & ma_va_bottom_mask) |
-           ((va << pfn_pdx_hole_shift) & ma_top_mask);
-}
-
-static inline void *__maddr_to_virt(unsigned long ma)
-{
-    ASSERT(pfn_to_pdx(ma >> PAGE_SHIFT) < (DIRECTMAP_SIZE >> PAGE_SHIFT));
-    return (void *)(DIRECTMAP_VIRT_START +
-                    ((ma & ma_va_bottom_mask) |
-                     ((ma & ma_top_mask) >> pfn_pdx_hole_shift)));
-}
+unsigned long __virt_to_maddr(unsigned long va);
+void *__maddr_to_virt(unsigned long ma);
 
 /* read access (should only be used for debug printk's) */
 typedef u64 intpte_t;