diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index df182921fa..7853fdbb4c 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -1315,7 +1315,7 @@ int xc_domain_get_tsc_info(xc_interface *xch, int xc_domain_disable_migrate(xc_interface *xch, uint32_t domid); -int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid); +int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns); int xc_domain_increase_reservation(xc_interface *xch, uint32_t domid, diff --git a/tools/libxc/xc_core_arm.c b/tools/libxc/xc_core_arm.c index 16508e77af..c3f5868044 100644 --- a/tools/libxc/xc_core_arm.c +++ b/tools/libxc/xc_core_arm.c @@ -30,12 +30,6 @@ xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt, return 0; } - -static int nr_gpfns(xc_interface *xch, domid_t domid) -{ - return xc_domain_maximum_gpfn(xch, domid) + 1; -} - int xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info) { @@ -48,9 +42,12 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus xc_core_memory_map_t **mapp, unsigned int *nr_entries) { - unsigned long p2m_size = nr_gpfns(xch, info->domid); + xen_pfn_t p2m_size = 0; xc_core_memory_map_t *map; + if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 ) + return -1; + map = malloc(sizeof(*map)); if ( map == NULL ) { diff --git a/tools/libxc/xc_core_x86.c b/tools/libxc/xc_core_x86.c index d8846f1fc5..4552e432b3 100644 --- a/tools/libxc/xc_core_x86.c +++ b/tools/libxc/xc_core_x86.c @@ -35,12 +35,6 @@ xc_core_arch_gpfn_may_present(struct xc_core_arch_context *arch_ctxt, return 1; } - -static int nr_gpfns(xc_interface *xch, domid_t domid) -{ - return xc_domain_maximum_gpfn(xch, domid) + 1; -} - int xc_core_arch_auto_translated_physmap(const xc_dominfo_t *info) { @@ -53,9 +47,12 @@ xc_core_arch_memory_map_get(xc_interface *xch, struct xc_core_arch_context *unus xc_core_memory_map_t **mapp, unsigned int *nr_entries) { - unsigned long p2m_size = nr_gpfns(xch, info->domid); + xen_pfn_t p2m_size = 0; xc_core_memory_map_t *map; + if ( xc_domain_maximum_gpfn(xch, info->domid, &p2m_size) < 0 ) + return -1; + map = malloc(sizeof(*map)); if ( map == NULL ) { @@ -88,7 +85,12 @@ xc_core_arch_map_p2m_rw(xc_interface *xch, struct domain_info_context *dinfo, xc int err; int i; - dinfo->p2m_size = nr_gpfns(xch, info->domid); + if ( xc_domain_maximum_gpfn(xch, info->domid, &dinfo->p2m_size) < 0 ) + { + ERROR("Could not get maximum GPFN!"); + goto out; + } + if ( dinfo->p2m_size < info->nr_pages ) { ERROR("p2m_size < nr_pages -1 (%lx < %lx", dinfo->p2m_size, info->nr_pages - 1); @@ -210,16 +212,7 @@ int xc_core_arch_get_scratch_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfn) { - int rc; - - rc = xc_domain_maximum_gpfn(xch, domid); - - if ( rc < 0 ) - return rc; - - *gpfn = (xen_pfn_t)rc + 1; - - return 0; + return xc_domain_maximum_gpfn(xch, domid, gpfn); } /* diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 2fed727aac..da88e08fd2 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -789,9 +789,16 @@ int xc_domain_get_tsc_info(xc_interface *xch, } -int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid) +int xc_domain_maximum_gpfn(xc_interface *xch, domid_t domid, xen_pfn_t *gpfns) { - return do_memory_op(xch, XENMEM_maximum_gpfn, &domid, sizeof(domid)); + int rc = do_memory_op(xch, XENMEM_maximum_gpfn, &domid, sizeof(domid)); + + if ( rc >= 0 ) + { + *gpfns = rc + 1; + rc = 0; + } + return rc; } int xc_domain_increase_reservation(xc_interface *xch, diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c index 254fdb344d..b611c07524 100644 --- a/tools/libxc/xc_domain_save.c +++ b/tools/libxc/xc_domain_save.c @@ -939,7 +939,11 @@ int xc_domain_save(xc_interface *xch, int io_fd, uint32_t dom, uint32_t max_iter } /* Get the size of the P2M table */ - dinfo->p2m_size = xc_domain_maximum_gpfn(xch, dom) + 1; + if ( xc_domain_maximum_gpfn(xch, dom, &dinfo->p2m_size) < 0 ) + { + ERROR("Could not get maximum GPFN!"); + goto out; + } if ( dinfo->p2m_size > ~XEN_DOMCTL_PFINFO_LTAB_MASK ) {