|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 04/16] arm: handle xenheap which isn't at the start of RAM.
Also refactor page_to_virt somewhat in an attempt to make it clearer
what is happening.
Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>
---
xen/include/asm-arm/mm.h | 24 +++++++++++++++++++-----
1 files changed, 19 insertions(+), 5 deletions(-)
diff --git a/xen/include/asm-arm/mm.h b/xen/include/asm-arm/mm.h
index b37bd35..6498322 100644
--- a/xen/include/asm-arm/mm.h
+++ b/xen/include/asm-arm/mm.h
@@ -214,17 +214,31 @@ static inline struct page_info *virt_to_page(const void
*v)
ASSERT(va >= XENHEAP_VIRT_START);
ASSERT(va < xenheap_virt_end);
- return frame_table + ((va - XENHEAP_VIRT_START) >> PAGE_SHIFT);
+ return frame_table
+ + ((va - XENHEAP_VIRT_START) >> PAGE_SHIFT)
+ + xenheap_mfn_start
+ - frametable_base_mfn;
}
static inline void *page_to_virt(const struct page_info *pg)
{
+ unsigned long va;
+ const unsigned long offset =
+ (xenheap_mfn_start-frametable_base_mfn)*sizeof(*pg);
+
+ /*
+ * Dividing by this on both top and bottom factors out the largest
+ * common factor of 2 which helps the compiler to use smaller shifts.
+ */
+ const unsigned long lcd = (sizeof(*pg) & -sizeof(*pg));
+
ASSERT((unsigned long)pg - FRAMETABLE_VIRT_START < frametable_virt_end);
- return (void *)(XENHEAP_VIRT_START +
- ((unsigned long)pg - FRAMETABLE_VIRT_START) /
- (sizeof(*pg) / (sizeof(*pg) & -sizeof(*pg))) *
- (PAGE_SIZE / (sizeof(*pg) & -sizeof(*pg))));
+ va = (unsigned long)pg;
+ va = XENHEAP_VIRT_START +
+ ((va - FRAMETABLE_VIRT_START - offset) / (sizeof(*pg) / lcd)) *
+ (PAGE_SIZE / lcd);
+ return (void *)va;
}
struct domain *page_get_owner_and_reference(struct page_info *page);
--
1.7.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |