From: Penny Zheng <penny.zh...@arm.com>

In order to getting statically shared pages based on gfn with nr_pages, this
commit introduces a new helper get_pages_from_gfn to acquire a set of pages
based on [gfn, gfn + nr_gfns), with the same P2M type.

Signed-off-by: Penny Zheng <penny.zh...@arm.com>
---
 xen/arch/arm/include/asm/p2m.h | 37 ++++++++++++++++++++++++++++++++++
 1 file changed, 37 insertions(+)

diff --git a/xen/arch/arm/include/asm/p2m.h b/xen/arch/arm/include/asm/p2m.h
index 58590145b0..b23024b9a1 100644
--- a/xen/arch/arm/include/asm/p2m.h
+++ b/xen/arch/arm/include/asm/p2m.h
@@ -370,6 +370,43 @@ static inline struct page_info *get_page_from_gfn(
     return page;
 }
 
+static inline int get_pages_from_gfn(struct domain *d, unsigned long gfn,
+                                     unsigned long nr_gfns,
+                                     struct page_info **pages, p2m_type_t *t,
+                                     p2m_query_t q)
+{
+    p2m_type_t _t;
+    unsigned long i = 0;
+    int ret = 0;
+
+    for ( ; i < nr_gfns; i++ )
+    {
+        pages[i] = get_page_from_gfn(d, gfn + i, t, q);
+
+        if ( !pages[i] )
+        {
+            ret = -ENOENT;
+            goto fail_get;
+        }
+
+        if ( i == 0 )
+            _t = *t;
+        /* Check if all pages share the same p2m type. */
+        else if ( *t != _t )
+        {
+            ret = -EINVAL;
+            goto fail_get;
+        }
+    }
+
+    return ret;
+
+ fail_get:
+        while( --i >= 0 )
+            put_page(pages[i]);
+        return ret;
+}
+
 int get_page_type(struct page_info *page, unsigned long type);
 bool is_iomem_page(mfn_t mfn);
 static inline int get_page_and_type(struct page_info *page,
-- 
2.25.1


Reply via email to