From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tamas K Lengyel Subject: [PATCH RFC v2 08/12] xen/arm: Add mem_event domctl and mem_access memop. Date: Wed, 27 Aug 2014 16:06:36 +0200 Message-ID: <1409148400-14810-9-git-send-email-tklengyel@sec.in.tum.de> References: <1409148400-14810-1-git-send-email-tklengyel@sec.in.tum.de> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1409148400-14810-1-git-send-email-tklengyel@sec.in.tum.de> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: ian.campbell@citrix.com, tim@xen.org, ian.jackson@eu.citrix.com, stefano.stabellini@citrix.com, andres@lagarcavilla.org, jbeulich@suse.com, dgdegra@tycho.nsa.gov, Tamas K Lengyel List-Id: xen-devel@lists.xenproject.org Define the handling of XEN_DOMCTL_mem_event_op and the handling of copy-back data. Also setup the memop handling of XENMEM_access_op with the required masking of the operation with MEMOP_CMD_MASK. Signed-off-by: Tamas K Lengyel --- xen/arch/arm/domctl.c | 34 ++++++++++++++++++++++++++++++---- xen/arch/arm/mm.c | 20 ++++++++++++++++---- 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index 45974e7..c6d3cb4 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -11,10 +11,17 @@ #include #include #include +#include +#include +#include long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { + + long ret; + bool_t copyback = 0; + switch ( domctl->cmd ) { case XEN_DOMCTL_cacheflush: @@ -23,17 +30,36 @@ long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, unsigned long e = s + domctl->u.cacheflush.nr_pfns; if ( domctl->u.cacheflush.nr_pfns > (1U<u.mem_event_op, + guest_handle_cast(u_domctl, void)); + copyback = 1; + break; default: - return subarch_do_domctl(domctl, d, u_domctl); + ret = subarch_do_domctl(domctl, d, u_domctl); + break; } + + if ( copyback && __copy_to_guest(u_domctl, domctl, 1) ) + ret = -EFAULT; + + return ret; } void arch_get_info_guest(struct vcpu *v, vcpu_guest_context_u c) diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c index 0a243b0..a42c167 100644 --- a/xen/arch/arm/mm.c +++ b/xen/arch/arm/mm.c @@ -35,6 +35,9 @@ #include #include #include +#include +#include +#include #include #include #include @@ -1111,18 +1114,27 @@ int xenmem_add_to_physmap_one( long arch_memory_op(int op, XEN_GUEST_HANDLE_PARAM(void) arg) { - switch ( op ) + + long rc; + + switch ( op & MEMOP_CMD_MASK ) { /* XXX: memsharing not working yet */ case XENMEM_get_sharing_shared_pages: case XENMEM_get_sharing_freed_pages: - return 0; + rc = 0; + break; + + case XENMEM_access_op: + rc = mem_access_memop(op, guest_handle_cast(arg, xen_mem_access_op_t)); + break; default: - return -ENOSYS; + rc = -ENOSYS; + break; } - return 0; + return rc; } struct domain *page_get_owner_and_reference(struct page_info *page) -- 2.1.0.rc1