[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH v2 3/8] xen: Add gpa conversion helpers



Introduce various helpers to convert between GPA and virt/paddr.

Signed-off-by: Teddy Astie <teddy.astie@xxxxxxxxxx>
---
CC: Juergen Gross <jgross@xxxxxxxx>
CC: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
CC: Stefano Stabellini <sstabellini@xxxxxxxxxx>
CC: Oleksandr Tyshchenko <oleksandr_tyshchenko@xxxxxxxx>
CC: x86@xxxxxxxxxx
CC: linux-kernel@xxxxxxxxxxxxxxx

 arch/x86/include/asm/xen/page.h | 22 ++++++++++++++++++++++
 include/xen/arm/page.h          | 21 +++++++++++++++++++++
 2 files changed, 43 insertions(+)

diff --git a/arch/x86/include/asm/xen/page.h b/arch/x86/include/asm/xen/page.h
index 59f642a94b9d..d8fc2dc24809 100644
--- a/arch/x86/include/asm/xen/page.h
+++ b/arch/x86/include/asm/xen/page.h
@@ -26,6 +26,11 @@ typedef struct xpaddr {
        phys_addr_t paddr;
 } xpaddr_t;
 
+/* Xen guest physical address */
+typedef struct xgaddr {
+       phys_addr_t gaddr;
+} xgaddr_t;
+
 #ifdef CONFIG_X86_64
 #define XEN_PHYSICAL_MASK      __sme_clr((1UL << 52) - 1)
 #else
@@ -37,6 +42,7 @@ typedef struct xpaddr {
 
 #define XMADDR(x)      ((xmaddr_t) { .maddr = (x) })
 #define XPADDR(x)      ((xpaddr_t) { .paddr = (x) })
+#define XGADDR(x) ((xgaddr_t) { .gaddr = (x) })
 
 /**** MACHINE <-> PHYSICAL CONVERSION MACROS ****/
 #define INVALID_P2M_ENTRY      (~0UL)
@@ -256,6 +262,18 @@ static inline unsigned long gfn_to_pfn(unsigned long gfn)
                return mfn_to_pfn(gfn);
 }
 
+static inline xgaddr_t phys_to_guest(xpaddr_t phys)
+{
+       unsigned int offset = phys.paddr & ~PAGE_MASK;
+       return XGADDR(PFN_PHYS(pfn_to_gfn(PFN_DOWN(phys.paddr))) | offset);
+}
+
+static inline xpaddr_t guest_to_phys(xgaddr_t guest)
+{
+       unsigned int offset = guest.gaddr & ~PAGE_MASK;
+       return XPADDR(PFN_PHYS(gfn_to_pfn(PFN_DOWN(guest.gaddr))) | offset);
+}
+
 /* Pseudo-physical <-> Bus conversion */
 #define pfn_to_bfn(pfn)                pfn_to_gfn(pfn)
 #define bfn_to_pfn(bfn)                gfn_to_pfn(bfn)
@@ -305,6 +323,10 @@ static inline unsigned long virt_to_pfn(const void *v)
 /* VIRT <-> GUEST conversion */
 #define virt_to_gfn(v)         (pfn_to_gfn(virt_to_pfn(v)))
 #define gfn_to_virt(g)         (__va(gfn_to_pfn(g) << PAGE_SHIFT))
+#define virt_to_guest(v)  (phys_to_guest(XPADDR(__pa(v))))
+
+#define percpu_to_gaddr(v) \
+       (phys_to_guest(XPADDR(per_cpu_ptr_to_phys(v))))
 
 static inline unsigned long pte_mfn(pte_t pte)
 {
diff --git a/include/xen/arm/page.h b/include/xen/arm/page.h
index e5c84ff28c8b..1119bde2994c 100644
--- a/include/xen/arm/page.h
+++ b/include/xen/arm/page.h
@@ -24,8 +24,14 @@ typedef struct xpaddr {
        phys_addr_t paddr;
 } xpaddr_t;
 
+/* Xen guest physical address */
+typedef struct xgaddr {
+       phys_addr_t gaddr;
+} xgaddr_t;
+
 #define XMADDR(x)      ((xmaddr_t) { .maddr = (x) })
 #define XPADDR(x)      ((xpaddr_t) { .paddr = (x) })
+#define XGADDR(x)      ((xgaddr_t) { .gaddr = (x) })
 
 #define INVALID_P2M_ENTRY      (~0UL)
 
@@ -54,6 +60,18 @@ static inline unsigned long gfn_to_pfn(unsigned long gfn)
        return gfn;
 }
 
+static inline xgaddr_t phys_to_guest(xpaddr_t phys)
+{
+       unsigned int offset = phys.paddr & ~PAGE_MASK;
+       return XGADDR(PFN_PHYS(pfn_to_gfn(PFN_DOWN(phys.paddr))) | offset);
+}
+
+static inline xpaddr_t guest_to_phys(xgaddr_t guest)
+{
+       unsigned int offset = guest.gaddr & ~PAGE_MASK;
+       return XPADDR(PFN_PHYS(gfn_to_pfn(PFN_DOWN(guest.gaddr))) | offset);
+}
+
 /* Pseudo-physical <-> BUS conversion */
 static inline unsigned long pfn_to_bfn(unsigned long pfn)
 {
@@ -82,9 +100,12 @@ static inline unsigned long bfn_to_pfn(unsigned long bfn)
                pfn_to_gfn(virt_to_phys(v) >> XEN_PAGE_SHIFT);                 \
        })
 #define gfn_to_virt(m)         (__va(gfn_to_pfn(m) << XEN_PAGE_SHIFT))
+#define virt_to_guest(v)  (phys_to_guest(XPADDR(__pa(v))))
 
 #define percpu_to_gfn(v)       \
        (pfn_to_gfn(per_cpu_ptr_to_phys(v) >> XEN_PAGE_SHIFT))
+#define percpu_to_gaddr(v) \
+       (phys_to_guest(XPADDR(per_cpu_ptr_to_phys(v))))
 
 /* Only used in PV code. But ARM guests are always HVM. */
 static inline xmaddr_t arbitrary_virt_to_machine(void *vaddr)
-- 
2.56.0



--
Teddy Astie | Vates XCP-ng Developer

XCP-ng & Xen Orchestra - Vates solutions

web: https://vates.tech

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.