@@ -319,8 +319,7 @@ static inline void *maddr_to_virt(paddr_t ma)
(DIRECTMAP_SIZE >> PAGE_SHIFT));
return (void *)(XENHEAP_VIRT_START -
(directmap_base_pdx << PAGE_SHIFT) +
- ((ma & ma_va_bottom_mask) |
- ((ma & ma_top_mask) >> pfn_pdx_hole_shift)));
+ maddr_to_directmapoff(ma));
}
#endif
@@ -36,26 +36,22 @@ 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);
+ return directmapoff_to_maddr(va - DIRECTMAP_VIRT_START);
+
+ 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)));
+
+ return xen_phys_start + va - XEN_VIRT_START;
}
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)));
+ /* Offset in the direct map, accounting for pdx compression */
+ unsigned long va_offset = maddr_to_directmapoff(ma);
+ ASSERT(va_offset < DIRECTMAP_SIZE);
+ return (void *)(DIRECTMAP_VIRT_START + va_offset);
}
/* read access (should only be used for debug printk's) */
@@ -160,6 +160,31 @@ static inline unsigned long pdx_to_pfn(unsigned long pdx)
#define mfn_to_pdx(mfn) pfn_to_pdx(mfn_x(mfn))
#define pdx_to_mfn(pdx) _mfn(pdx_to_pfn(pdx))
+/**
+ * Computes the offset into the direct map of an maddr
+ *
+ * @param ma Machine address
+ * @return Offset on the direct map where that
+ * machine address can be accessed
+ */
+static inline unsigned long maddr_to_directmapoff(paddr_t ma)
+{
+ return ((ma & ma_top_mask) >> pfn_pdx_hole_shift) |
+ (ma & ma_va_bottom_mask);
+}
+
+/**
+ * Computes a machine address given a direct map offset
+ *
+ * @param offset Offset into the direct map
+ * @return Corresponding machine address of that virtual location
+ */
+static inline paddr_t directmapoff_to_maddr(unsigned long offset)
+{
+ return (((paddr_t)offset << pfn_pdx_hole_shift) & ma_top_mask) |
+ (offset & ma_va_bottom_mask);
+}
+
/**
* Initializes global variables with information about the compressible
* range of the current memory regions.