From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tiejun Chen Subject: [v7][RFC][PATCH 04/13] hvmloader/util: get reserved device memory maps Date: Fri, 24 Oct 2014 15:34:28 +0800 Message-ID: <1414136077-18599-5-git-send-email-tiejun.chen@intel.com> References: <1414136077-18599-1-git-send-email-tiejun.chen@intel.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1414136077-18599-1-git-send-email-tiejun.chen@intel.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: JBeulich@suse.com, tim@xen.org, konrad.wilk@oracle.com, kevin.tian@intel.com, yang.z.zhang@intel.com Cc: xen-devel@lists.xen.org List-Id: xen-devel@lists.xenproject.org We need to use reserved device memory maps with multiple times, so provide just one common function should be friend. Signed-off-by: Tiejun Chen --- tools/firmware/hvmloader/util.c | 66 +++++++++++++++++++++++++++++++++++++++++ tools/firmware/hvmloader/util.h | 6 ++++ 2 files changed, 72 insertions(+) diff --git a/tools/firmware/hvmloader/util.c b/tools/firmware/hvmloader/util.c index 80d822f..aa2c17c 100644 --- a/tools/firmware/hvmloader/util.c +++ b/tools/firmware/hvmloader/util.c @@ -828,6 +828,72 @@ int hpet_exists(unsigned long hpet_base) return ((hpet_id >> 16) == 0x8086); } +int get_reserved_device_memory_map(struct xen_mem_reserved_device_memory entries[], + uint32_t *max_entries) +{ + int rc; + struct xen_mem_reserved_device_memory_map memmap = { + .nr_entries = *max_entries + }; + + set_xen_guest_handle(memmap.buffer, entries); + + rc = hypercall_memory_op(XENMEM_reserved_device_memory_map, &memmap); + if (rc == -ENOBUFS) + *max_entries = memmap.nr_entries; + + return rc; +} + +/* Getting all reserved device memory map info in case of hvmloader. */ +int hvm_get_reserved_device_memory_map(void) +{ + static uint32_t nr_entries = 0; + int rc = 0; + + if ( !rdm_map ) + { + /* Assume we have one entry if not enough we'll expand.*/ + nr_entries = 1; + rdm_map = mem_alloc(nr_entries * + sizeof(struct xen_mem_reserved_device_memory), 0); + if ( !rdm_map ) + { + printf("No space to get reserved dev memory maps!\n"); + return rc; + } + + rc = get_reserved_device_memory_map(rdm_map, &nr_entries); + if ( rc == -ENOBUFS ) + { + rdm_map = mem_alloc(nr_entries * + sizeof(struct xen_mem_reserved_device_memory), + 0); + if ( rdm_map ) + { + rc = get_reserved_device_memory_map(rdm_map, &nr_entries); + if ( rc ) + { + printf("Could not get reserved dev memory info on domain"); + return rc; + } + } + else + { + printf("No space to get reserved dev memory maps!\n"); + return rc; + } + } + else if ( rc ) + { + printf("Could not get reserved dev memory info on domain"); + return rc; + } + } + + return nr_entries; +} + /* * Local variables: * mode: C diff --git a/tools/firmware/hvmloader/util.h b/tools/firmware/hvmloader/util.h index a70e4aa..81abc44 100644 --- a/tools/firmware/hvmloader/util.h +++ b/tools/firmware/hvmloader/util.h @@ -241,6 +241,12 @@ int build_e820_table(struct e820entry *e820, unsigned int bios_image_base); void dump_e820_table(struct e820entry *e820, unsigned int nr); +#include +#define ENOBUFS 105 /* No buffer space available */ +struct xen_mem_reserved_device_memory *rdm_map; +int get_reserved_device_memory_map(struct xen_mem_reserved_device_memory entries[], + uint32_t *max_entries); +int hvm_get_reserved_device_memory_map(void); #ifndef NDEBUG void perform_tests(void); #else -- 1.9.1