Hi,
On 09/13/2018 04:01 PM, Petre Pircalabu wrote:
Create a single mapping for multiple domain pages.
Signed-off-by: Petre Pircalabu <ppircal...@bitdefender.com>
---
tools/libxc/xc_vm_event.c | 2 +-
xen/arch/x86/domain_page.c | 22 ++++++++++++++++++++++
xen/include/xen/domain_page.h | 9 +++++++++
3 files changed, 32 insertions(+), 1 deletion(-)
diff --git a/tools/libxc/xc_vm_event.c b/tools/libxc/xc_vm_event.c
index dd34cec..de37ca5 100644
--- a/tools/libxc/xc_vm_event.c
+++ b/tools/libxc/xc_vm_event.c
@@ -74,7 +74,7 @@ static int xc_vm_event_domctl(int type, unsigned int *param)
{
case XEN_VM_EVENT_TYPE_PAGING:
*param = XEN_DOMCTL_VM_EVENT_OP_PAGING;
- break;
+ break;
case XEN_VM_EVENT_TYPE_MONITOR:
*param = XEN_DOMCTL_VM_EVENT_OP_MONITOR;
diff --git a/xen/arch/x86/domain_page.c b/xen/arch/x86/domain_page.c
index 4a07cfb..0d23e52 100644
--- a/xen/arch/x86/domain_page.c
+++ b/xen/arch/x86/domain_page.c
@@ -317,6 +317,28 @@ void *map_domain_page_global(mfn_t mfn)
return vmap(&mfn, 1);
}
+void *map_domain_pages_global(const mfn_t *mfn, unsigned int nr)
+{
+ ASSERT(!in_irq() &&
+ ((system_state >= SYS_STATE_boot &&
+ system_state < SYS_STATE_active) ||
+ local_irq_is_enabled()));
+
+ return vmap(mfn, nr);
+}
+
+void *__map_domain_pages_global(const struct page_info *pg, unsigned int nr)
+{
+ mfn_t mfn[nr];
+ int i;
+ struct page_info *cur_pg = (struct page_info *)&pg[0];
+
+ for (i = 0; i < nr; i++)
+ mfn[i] = page_to_mfn(cur_pg++);
+
+ return map_domain_pages_global(mfn, nr);
+}
+
void unmap_domain_page_global(const void *ptr)
{
unsigned long va = (unsigned long)ptr;
diff --git a/xen/include/xen/domain_page.h b/xen/include/xen/domain_page.h
index 32669a3..76422f9 100644
--- a/xen/include/xen/domain_page.h
+++ b/xen/include/xen/domain_page.h
@@ -42,6 +42,7 @@ mfn_t domain_page_map_to_mfn(const void *va);
* mappings can also be unmapped from any context.
*/
void *map_domain_page_global(mfn_t mfn);
+void *map_domain_pages_global(const mfn_t *mfn, unsigned int nr);
void unmap_domain_page_global(const void *va);
#define __map_domain_page(pg) map_domain_page(page_to_mfn(pg))
@@ -51,6 +52,8 @@ static inline void *__map_domain_page_global(const struct
page_info *pg)
return map_domain_page_global(page_to_mfn(pg));
}
+void *__map_domain_pages_global(const struct page_info *pg, unsigned int nr);
This would require an implementation for Arm, assuming this is going ahead.
+
#else /* !CONFIG_DOMAIN_PAGE */
#define map_domain_page(mfn) __mfn_to_virt(mfn_x(mfn))
@@ -68,6 +71,12 @@ static inline void *__map_domain_page_global(const struct
page_info *pg)
return page_to_virt(pg);
}
+static inline void *__map_domain_pages_global(const struct page_info *pg,
+ unsigned int nr)
+{
+ return __map_domain_page_global(pg);
+}
+
static inline void unmap_domain_page_global(const void *va) {};
#endif /* !CONFIG_DOMAIN_PAGE */
Cheers,
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel