|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |