[prev in list] [next in list] [prev in thread] [next in thread]
List: xen-cvs
Subject: [xen master] xen/mm: Factor out the pdx compression logic in ma/va converters
From: patchbot () xen ! org
Date: 2023-09-24 1:12:22
Message-ID: E1qkDfa-0003Cs-ED () xenbits ! xenproject ! org
[Download RAW message or body]
commit bc2cda8c598054731fc6bd8d1c52841601bc0347
Author: Alejandro Vallejo <alejandro.vallejo@cloud.com>
AuthorDate: Tue Aug 8 14:02:17 2023 +0100
Commit: Andrew Cooper <andrew.cooper3@citrix.com>
CommitDate: Fri Sep 22 18:26:04 2023 +0100
xen/mm: Factor out the pdx compression logic in ma/va converters
This patch factors out the pdx compression logic hardcoded in both ports
for the maddr<->vaddr conversion functions.
Touches both x86 and arm ports.
Signed-off-by: Alejandro Vallejo <alejandro.vallejo@cloud.com>
Reviewed-by: Julien Grall <jgrall@amazon.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
---
xen/arch/arm/include/asm/mm.h | 3 +--
xen/arch/x86/include/asm/x86_64/page.h | 29 +++++++++++++----------------
xen/include/xen/pdx.h | 25 +++++++++++++++++++++++++
3 files changed, 39 insertions(+), 18 deletions(-)
diff --git a/xen/arch/arm/include/asm/mm.h b/xen/arch/arm/include/asm/mm.h
index aaacba3f04..d25e59f828 100644
--- a/xen/arch/arm/include/asm/mm.h
+++ b/xen/arch/arm/include/asm/mm.h
@@ -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
diff --git a/xen/arch/x86/include/asm/x86_64/page.h b/xen/arch/x86/include/asm/x86_64/page.h
index 53faa7875b..f49e10475f 100644
--- a/xen/arch/x86/include/asm/x86_64/page.h
+++ b/xen/arch/x86/include/asm/x86_64/page.h
@@ -36,26 +36,23 @@ 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) */
diff --git a/xen/include/xen/pdx.h b/xen/include/xen/pdx.h
index de5439a5e5..6276b685e2 100644
--- a/xen/include/xen/pdx.h
+++ b/xen/include/xen/pdx.h
@@ -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.
--
generated by git-patchbot for /home/xen/git/xen.git#master
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic