Need to make some functions non-static to avoid header inclusion hell.
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"
/*
#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
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
((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,
(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__ */
#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;