|
@@ -28,6 +28,17 @@ typedef struct xpaddr {
|
|
|
|
|
|
#define INVALID_P2M_ENTRY (~0UL)
|
|
|
|
|
|
+/*
|
|
|
+ * The pseudo-physical frame (pfn) used in all the helpers is always based
|
|
|
+ * on Xen page granularity (i.e 4KB).
|
|
|
+ *
|
|
|
+ * A Linux page may be split across multiple non-contiguous Xen page so we
|
|
|
+ * have to keep track with frame based on 4KB page granularity.
|
|
|
+ *
|
|
|
+ * PV drivers should never make a direct usage of those helpers (particularly
|
|
|
+ * pfn_to_gfn and gfn_to_pfn).
|
|
|
+ */
|
|
|
+
|
|
|
unsigned long __pfn_to_mfn(unsigned long pfn);
|
|
|
extern struct rb_root phys_to_mach;
|
|
|
|
|
@@ -64,8 +75,8 @@ static inline unsigned long bfn_to_pfn(unsigned long bfn)
|
|
|
#define bfn_to_local_pfn(bfn) bfn_to_pfn(bfn)
|
|
|
|
|
|
/* VIRT <-> GUEST conversion */
|
|
|
-#define virt_to_gfn(v) (pfn_to_gfn(virt_to_pfn(v)))
|
|
|
-#define gfn_to_virt(m) (__va(gfn_to_pfn(m) << PAGE_SHIFT))
|
|
|
+#define virt_to_gfn(v) (pfn_to_gfn(virt_to_phys(v) >> XEN_PAGE_SHIFT))
|
|
|
+#define gfn_to_virt(m) (__va(gfn_to_pfn(m) << XEN_PAGE_SHIFT))
|
|
|
|
|
|
/* Only used in PV code. But ARM guests are always HVM. */
|
|
|
static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr)
|