|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] compat wrapper for XENMEM_add_to_physmap_batch
commit 244ce6f42d1843c02be36ed808452df570378cb1
Author: Jan Beulich <jbeulich@xxxxxxxx>
AuthorDate: Wed Jan 8 09:06:07 2014 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Jan 8 09:06:07 2014 +0100
compat wrapper for XENMEM_add_to_physmap_batch
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Acked-by: Keir Fraser <keir@xxxxxxx>
---
xen/common/compat/memory.c | 60 ++++++++++++++++++++++++++++++++++++++++++++
xen/include/xlat.lst | 1 +
2 files changed, 61 insertions(+), 0 deletions(-)
diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c
index 7692b5b..4fae02a 100644
--- a/xen/common/compat/memory.c
+++ b/xen/common/compat/memory.c
@@ -27,12 +27,14 @@ int compat_memory_op(unsigned int cmd,
XEN_GUEST_HANDLE_PARAM(void) compat)
struct xen_memory_reservation *rsrv;
struct xen_memory_exchange *xchg;
struct xen_add_to_physmap *atp;
+ struct xen_add_to_physmap_batch *atpb;
struct xen_remove_from_physmap *xrfp;
} nat;
union {
struct compat_memory_reservation rsrv;
struct compat_memory_exchange xchg;
struct compat_add_to_physmap atp;
+ struct compat_add_to_physmap_batch atpb;
} cmp;
set_xen_guest_handle(nat.hnd, COMPAT_ARG_XLAT_VIRT_BASE);
@@ -200,6 +202,60 @@ int compat_memory_op(unsigned int cmd,
XEN_GUEST_HANDLE_PARAM(void) compat)
break;
+ case XENMEM_add_to_physmap_batch:
+ {
+ unsigned int limit = (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.atpb))
+ / (sizeof(nat.atpb->idxs.p) +
sizeof(nat.atpb->gpfns.p));
+ xen_ulong_t *idxs = (void *)(nat.atpb + 1);
+ xen_pfn_t *gpfns = (void *)(idxs + limit);
+
+ if ( copy_from_guest(&cmp.atpb, compat, 1) ||
+ !compat_handle_okay(cmp.atpb.idxs, cmp.atpb.size) ||
+ !compat_handle_okay(cmp.atpb.gpfns, cmp.atpb.size) ||
+ !compat_handle_okay(cmp.atpb.errs, cmp.atpb.size) )
+ return -EFAULT;
+
+ end_extent = start_extent + limit;
+ if ( end_extent > cmp.atpb.size )
+ end_extent = cmp.atpb.size;
+
+ idxs -= start_extent;
+ gpfns -= start_extent;
+
+ for ( i = start_extent; i < end_extent; ++i )
+ {
+ compat_ulong_t idx;
+ compat_pfn_t gpfn;
+
+ if ( __copy_from_compat_offset(&idx, cmp.atpb.idxs, i, 1) ||
+ __copy_from_compat_offset(&gpfn, cmp.atpb.gpfns, i, 1) )
+ return -EFAULT;
+ idxs[i] = idx;
+ gpfns[i] = gpfn;
+ }
+
+#define XLAT_add_to_physmap_batch_HNDL_idxs(_d_, _s_) \
+ set_xen_guest_handle((_d_)->idxs, idxs)
+#define XLAT_add_to_physmap_batch_HNDL_gpfns(_d_, _s_) \
+ set_xen_guest_handle((_d_)->gpfns, gpfns)
+#define XLAT_add_to_physmap_batch_HNDL_errs(_d_, _s_) \
+ guest_from_compat_handle((_d_)->errs, (_s_)->errs)
+
+ XLAT_add_to_physmap_batch(nat.atpb, &cmp.atpb);
+
+#undef XLAT_add_to_physmap_batch_HNDL_errs
+#undef XLAT_add_to_physmap_batch_HNDL_gpfns
+#undef XLAT_add_to_physmap_batch_HNDL_idxs
+
+ if ( end_extent < cmp.atpb.size )
+ {
+ nat.atpb->size = end_extent;
+ ++split;
+ }
+
+ break;
+ }
+
case XENMEM_remove_from_physmap:
{
struct compat_remove_from_physmap cmp;
@@ -321,6 +377,10 @@ int compat_memory_op(unsigned int cmd,
XEN_GUEST_HANDLE_PARAM(void) compat)
break;
}
+ case XENMEM_add_to_physmap_batch:
+ start_extent = end_extent;
+ break;
+
case XENMEM_maximum_ram_page:
case XENMEM_current_reservation:
case XENMEM_maximum_reservation:
diff --git a/xen/include/xlat.lst b/xen/include/xlat.lst
index f00cef3..8caede6 100644
--- a/xen/include/xlat.lst
+++ b/xen/include/xlat.lst
@@ -55,6 +55,7 @@
! kexec_image kexec.h
! kexec_range kexec.h
! add_to_physmap memory.h
+! add_to_physmap_batch memory.h
! foreign_memory_map memory.h
! memory_exchange memory.h
! memory_map memory.h
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |