From patchwork Tue Dec 6 13:47:43 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juergen Gross X-Patchwork-Id: 9462609 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 46ED060236 for ; Tue, 6 Dec 2016 13:50:03 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 2A6BD283EB for ; Tue, 6 Dec 2016 13:50:03 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 1CB17283ED; Tue, 6 Dec 2016 13:50:03 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 8DC58283EB for ; Tue, 6 Dec 2016 13:50:01 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cEG68-0004yK-1L; Tue, 06 Dec 2016 13:47:56 +0000 Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cEG66-0004yD-Nf for xen-devel@lists.xenproject.org; Tue, 06 Dec 2016 13:47:54 +0000 Received: from [85.158.139.211] by server-3.bemta-5.messagelabs.com id 29/6F-01948-981C6485; Tue, 06 Dec 2016 13:47:53 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFtrPLMWRWlGSWpSXmKPExsVyuP0Ov277Qbc IgxmNChbft0xmcmD0OPzhCksAYxRrZl5SfkUCa8aNue+ZC9YoVuxbvpmpgXGnRBcjJ4eEgJHE 24n/mLoYuTiEBBYySvx7cI0RJMEmoCqx4fopVhBbREBJ4t6qyWBFzAKPGSWad+8BKxIWiJBYc 2oRE4jNAtRw/NAXMJtXwFhi/uHdrBAb5CUWnj/CNIGRcwEjwypGjeLUorLUIl1DE72kosz0jJ LcxMwcXUMDU73c1OLixPTUnMSkYr3k/NxNjECPMQDBDsazpz0PMUpyMCmJ8qpYukUI8SXlp1R mJBZnxBeV5qQWH2KU4eBQkuCdvB8oJ1iUmp5akZaZAwwdmLQEB4+SCO82kDRvcUFibnFmOkTq FKOilDgvywGghABIIqM0D64NFq6XGGWlhHkZgQ4R4ilILcrNLEGVf8UozsGoJMwrBDKFJzOvB G76K6DFTECLTxx3BllckoiQkmpg5N0XXxHWeUFlxhHdsJ3ihj9mJM0WmZt3Z3P6grnRlqpqqy eK5hvGXzlsue7m6UuTshY5Wy3R3KDMfzdHYvLdJ/xFU0W8fy4J0c57fUn/k88abzsLUy3r1wf rLUSDunb1uCm1X4pf9+vbqoB7ihuiPZkf/p03N7k8cc6tuq1G3O2FG/9mLxK9pMRSnJFoqMVc VJwIACIaMnZSAgAA X-Env-Sender: jgross@suse.com X-Msg-Ref: server-9.tower-206.messagelabs.com!1481032069!74125168!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.0 required=7.0 tests= X-StarScan-Received: X-StarScan-Version: 9.0.16; banners=-,-,- X-VirusChecked: Checked Received: (qmail 27124 invoked from network); 6 Dec 2016 13:47:50 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-9.tower-206.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 6 Dec 2016 13:47:50 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 9FC0EAD5B; Tue, 6 Dec 2016 13:47:47 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xenproject.org Date: Tue, 6 Dec 2016 14:47:43 +0100 Message-Id: <20161206134743.2813-1-jgross@suse.com> X-Mailer: git-send-email 2.10.2 Cc: Juergen Gross , sstabellini@kernel.org, wei.liu2@citrix.com, George.Dunlap@eu.citrix.com, andrew.cooper3@citrix.com, ian.jackson@eu.citrix.com, tim@xen.org, jbeulich@suse.com Subject: [Xen-devel] [PATCH v2] xen/x86: add a way to obtain the needed number of memory map entries X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Today there is no way for a domain to obtain the number of entries of the machine memory map returned by XENMEM_machine_memory_map hypercall. Modify the interface to return just the needed number of map entries in case the buffer was specified as NULL. Signed-off-by: Juergen Gross Reviewed-by: Jan Beulich --- xen/arch/x86/mm.c | 40 +++++++++++++++++++++++++--------------- xen/include/public/memory.h | 2 ++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 14552a1..3ff0e97 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -4736,15 +4736,18 @@ static int _handle_iomem_range(unsigned long s, unsigned long e, XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer_param; XEN_GUEST_HANDLE(e820entry_t) buffer; - if ( ctxt->n + 1 >= ctxt->map.nr_entries ) - return -EINVAL; - ent.addr = (uint64_t)ctxt->s << PAGE_SHIFT; - ent.size = (uint64_t)(s - ctxt->s) << PAGE_SHIFT; - ent.type = E820_RESERVED; - buffer_param = guest_handle_cast(ctxt->map.buffer, e820entry_t); - buffer = guest_handle_from_param(buffer_param, e820entry_t); - if ( __copy_to_guest_offset(buffer, ctxt->n, &ent, 1) ) - return -EFAULT; + if ( !guest_handle_is_null(ctxt->map.buffer) ) + { + if ( ctxt->n + 1 >= ctxt->map.nr_entries ) + return -EINVAL; + ent.addr = (uint64_t)ctxt->s << PAGE_SHIFT; + ent.size = (uint64_t)(s - ctxt->s) << PAGE_SHIFT; + ent.type = E820_RESERVED; + buffer_param = guest_handle_cast(ctxt->map.buffer, e820entry_t); + buffer = guest_handle_from_param(buffer_param, e820entry_t); + if ( __copy_to_guest_offset(buffer, ctxt->n, &ent, 1) ) + return -EFAULT; + } ctxt->n++; } ctxt->s = e + 1; @@ -4978,6 +4981,7 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) XEN_GUEST_HANDLE(e820entry_t) buffer; XEN_GUEST_HANDLE_PARAM(e820entry_t) buffer_param; unsigned int i; + bool store; rc = xsm_machine_memory_map(XSM_PRIV); if ( rc ) @@ -4985,12 +4989,15 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) if ( copy_from_guest(&ctxt.map, arg, 1) ) return -EFAULT; - if ( ctxt.map.nr_entries < e820.nr_map + 1 ) + + store = !guest_handle_is_null(ctxt.map.buffer); + + if ( store && ctxt.map.nr_entries < e820.nr_map + 1 ) return -EINVAL; buffer_param = guest_handle_cast(ctxt.map.buffer, e820entry_t); buffer = guest_handle_from_param(buffer_param, e820entry_t); - if ( !guest_handle_okay(buffer, ctxt.map.nr_entries) ) + if ( store && !guest_handle_okay(buffer, ctxt.map.nr_entries) ) return -EFAULT; for ( i = 0, ctxt.n = 0, ctxt.s = 0; i < e820.nr_map; ++i, ++ctxt.n ) @@ -5007,10 +5014,13 @@ long arch_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg) if ( rc ) return rc; } - if ( ctxt.map.nr_entries <= ctxt.n + (e820.nr_map - i) ) - return -EINVAL; - if ( __copy_to_guest_offset(buffer, ctxt.n, e820.map + i, 1) ) - return -EFAULT; + if ( store ) + { + if ( ctxt.map.nr_entries <= ctxt.n + (e820.nr_map - i) ) + return -EINVAL; + if ( __copy_to_guest_offset(buffer, ctxt.n, e820.map + i, 1) ) + return -EFAULT; + } ctxt.s = PFN_UP(e820.map[i].addr + e820.map[i].size); } diff --git a/xen/include/public/memory.h b/xen/include/public/memory.h index 5bf840f..e633047 100644 --- a/xen/include/public/memory.h +++ b/xen/include/public/memory.h @@ -339,6 +339,8 @@ DEFINE_XEN_GUEST_HANDLE(xen_memory_map_t); /* * Returns the real physical memory map. Passes the same structure as * XENMEM_memory_map. + * Specifying buffer as NULL will return the number of entries required + * to store the complete memory map. * arg == addr of xen_memory_map_t. */ #define XENMEM_machine_memory_map 10