@@ -874,8 +874,8 @@ void __init setup_xenheap_mappings(unsigned long base_mfn,
/* Map a frame table to cover physical addresses ps through pe */
void __init setup_frametable_mappings(paddr_t ps, paddr_t pe)
{
- unsigned long nr_pages = (pe - ps) >> PAGE_SHIFT;
- unsigned long nr_pdxs = pfn_to_pdx(nr_pages);
+ unsigned long nr_pdxs = pfn_to_pdx((pe >> PAGE_SHIFT) - 1) -
+ pfn_to_pdx(ps >> PAGE_SHIFT) + 1;
unsigned long frametable_size = nr_pdxs * sizeof(struct page_info);
mfn_t base_mfn;
const unsigned long mapping_size = frametable_size < MB(32) ? MB(2) : MB(32);
pfn_to_pdx expects an address, not a size, as a parameter. It expects the end address, and the masks calculations compensate for any holes between start and end. Pass the end address to pfn_to_pdx. Also remove from the result pfn_to_pdx(start_address) because we know that we don't need to cover any memory in the range 0-start in the frametable. Remove the variable `nr_pages' because it is unused. Signed-off-by: Stefano Stabellini <stefanos@xilinx.com> CC: JBeulich@suse.com --- xen/arch/arm/mm.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)