diff options
-rw-r--r-- | tools/libxc/xc_core_x86.c | 8 | ||||
-rw-r--r-- | tools/libxc/xc_domain_save.c | 2 | ||||
-rw-r--r-- | xen/arch/x86/mm.c | 5 | ||||
-rw-r--r-- | xen/arch/x86/mm/shadow/common.c | 3 |
4 files changed, 10 insertions, 8 deletions
diff --git a/tools/libxc/xc_core_x86.c b/tools/libxc/xc_core_x86.c index 0f2a19c451..b3d5d26fbf 100644 --- a/tools/libxc/xc_core_x86.c +++ b/tools/libxc/xc_core_x86.c @@ -21,9 +21,9 @@ #include "xg_private.h" #include "xc_core.h" -static int max_gpfn(int xc_handle, domid_t domid) +static int nr_gpfns(int xc_handle, domid_t domid) { - return xc_memory_op(xc_handle, XENMEM_maximum_gpfn, &domid); + return xc_memory_op(xc_handle, XENMEM_maximum_gpfn, &domid) + 1; } int @@ -38,7 +38,7 @@ xc_core_arch_memory_map_get(int xc_handle, xc_dominfo_t *info, xc_core_memory_map_t **mapp, unsigned int *nr_entries) { - unsigned long p2m_size = max_gpfn(xc_handle, info->domid); + unsigned long p2m_size = nr_gpfns(xc_handle, info->domid); xc_core_memory_map_t *map; map = malloc(sizeof(*map)); @@ -65,7 +65,7 @@ xc_core_arch_map_p2m(int xc_handle, xc_dominfo_t *info, xen_pfn_t *live_p2m_frame_list_list = NULL; xen_pfn_t *live_p2m_frame_list = NULL; uint32_t dom = info->domid; - unsigned long p2m_size = max_gpfn(xc_handle, info->domid); + unsigned long p2m_size = nr_gpfns(xc_handle, info->domid); int ret = -1; int err; diff --git a/tools/libxc/xc_domain_save.c b/tools/libxc/xc_domain_save.c index ba7e005819..49fd25b9b6 100644 --- a/tools/libxc/xc_domain_save.c +++ b/tools/libxc/xc_domain_save.c @@ -870,7 +870,7 @@ int xc_domain_save(int xc_handle, int io_fd, uint32_t dom, uint32_t max_iters, } /* Get the size of the P2M table */ - p2m_size = xc_memory_op(xc_handle, XENMEM_maximum_gpfn, &dom); + p2m_size = xc_memory_op(xc_handle, XENMEM_maximum_gpfn, &dom) + 1; /* Domain is still running at this point */ if ( live ) diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c index 1c1620d5e5..9ec9c16297 100644 --- a/xen/arch/x86/mm.c +++ b/xen/arch/x86/mm.c @@ -249,7 +249,10 @@ int memory_is_conventional_ram(paddr_t p) unsigned long domain_get_maximum_gpfn(struct domain *d) { - return is_hvm_domain(d) ? d->arch.p2m.max_mapped_pfn : arch_get_max_pfn(d); + if ( is_hvm_domain(d) ) + return d->arch.p2m.max_mapped_pfn; + /* NB. PV guests specify nr_pfns rather than max_pfn so we adjust here. */ + return arch_get_max_pfn(d) - 1; } void share_xen_page_with_guest( diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c index 2d57d53c07..1b8d04b76c 100644 --- a/xen/arch/x86/mm/shadow/common.c +++ b/xen/arch/x86/mm/shadow/common.c @@ -2668,8 +2668,7 @@ sh_alloc_log_dirty_bitmap(struct domain *d) { ASSERT(d->arch.paging.shadow.dirty_bitmap == NULL); d->arch.paging.shadow.dirty_bitmap_size = - (domain_get_maximum_gpfn(d) + (BITS_PER_LONG - 1)) & - ~(BITS_PER_LONG - 1); + (domain_get_maximum_gpfn(d) + BITS_PER_LONG) & ~(BITS_PER_LONG - 1); d->arch.paging.shadow.dirty_bitmap = xmalloc_array(unsigned long, d->arch.paging.shadow.dirty_bitmap_size / BITS_PER_LONG); |