diff mbox

[v3,3/8] xen: Use typesafe gfn/mfn in guest_physmap_* helpers

Message ID 1466515243-27264-4-git-send-email-julien.grall@arm.com (mailing list archive)
State New, archived
Headers show

Commit Message

Julien Grall June 21, 2016, 1:20 p.m. UTC
Also rename some variables to gfn or mfn when it does not require much
rework.

Finally replace %hu with %d when printing the domain id in
guest_physmap_add_entry (arch/x86/mm/p2m.c).

Signed-off-by: Julien Grall <julien.grall@arm.com>
Acked-by: Jan Beulich <jbeulich@suse.com>

---
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Jan Beulich <jbeulich@suse.com>
Cc: Andrew Cooper <andrew.cooper3@citrix.com>
Cc: Paul Durrant <paul.durrant@citrix.com>
Cc: George Dunlap <george.dunlap@eu.citrix.com>
Cc: Ian Jackson <ian.jackson@eu.citrix.com>
Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
Cc: Tim Deegan <tim@xen.org>
Cc: Wei Liu <wei.liu2@citrix.com>

    Changes in v3:
        - Use %d to print the domain id rather than %hu
        - Add Jan's Acked-by for non-ARM bits

    Changes in v2:
        - Don't use a wrapper for x86. Instead use mfn_* to make
        the change simpler.
---
 xen/arch/arm/domain_build.c        |  2 +-
 xen/arch/arm/mm.c                  | 10 ++---
 xen/arch/arm/p2m.c                 | 20 +++++-----
 xen/arch/x86/domain.c              |  5 ++-
 xen/arch/x86/domain_build.c        |  6 +--
 xen/arch/x86/hvm/ioreq.c           |  8 ++--
 xen/arch/x86/mm.c                  | 12 +++---
 xen/arch/x86/mm/p2m.c              | 78 ++++++++++++++++++++------------------
 xen/common/grant_table.c           |  7 ++--
 xen/common/memory.c                | 32 ++++++++--------
 xen/drivers/passthrough/arm/smmu.c |  4 +-
 xen/include/asm-arm/p2m.h          | 12 +++---
 xen/include/asm-x86/p2m.h          | 11 +++---
 xen/include/xen/mm.h               |  2 +-
 14 files changed, 110 insertions(+), 99 deletions(-)

Comments

Stefano Stabellini June 23, 2016, 10:11 a.m. UTC | #1
On Tue, 21 Jun 2016, Julien Grall wrote:
> Also rename some variables to gfn or mfn when it does not require much
> rework.
> 
> Finally replace %hu with %d when printing the domain id in
> guest_physmap_add_entry (arch/x86/mm/p2m.c).
> 
> Signed-off-by: Julien Grall <julien.grall@arm.com>
> Acked-by: Jan Beulich <jbeulich@suse.com>

Acked-by: Stefano Stabellini <sstabellini@kernel.org>


> ---
> Cc: Stefano Stabellini <sstabellini@kernel.org>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
> Cc: Paul Durrant <paul.durrant@citrix.com>
> Cc: George Dunlap <george.dunlap@eu.citrix.com>
> Cc: Ian Jackson <ian.jackson@eu.citrix.com>
> Cc: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
> Cc: Tim Deegan <tim@xen.org>
> Cc: Wei Liu <wei.liu2@citrix.com>
> 
>     Changes in v3:
>         - Use %d to print the domain id rather than %hu
>         - Add Jan's Acked-by for non-ARM bits
> 
>     Changes in v2:
>         - Don't use a wrapper for x86. Instead use mfn_* to make
>         the change simpler.
> ---
>  xen/arch/arm/domain_build.c        |  2 +-
>  xen/arch/arm/mm.c                  | 10 ++---
>  xen/arch/arm/p2m.c                 | 20 +++++-----
>  xen/arch/x86/domain.c              |  5 ++-
>  xen/arch/x86/domain_build.c        |  6 +--
>  xen/arch/x86/hvm/ioreq.c           |  8 ++--
>  xen/arch/x86/mm.c                  | 12 +++---
>  xen/arch/x86/mm/p2m.c              | 78 ++++++++++++++++++++------------------
>  xen/common/grant_table.c           |  7 ++--
>  xen/common/memory.c                | 32 ++++++++--------
>  xen/drivers/passthrough/arm/smmu.c |  4 +-
>  xen/include/asm-arm/p2m.h          | 12 +++---
>  xen/include/asm-x86/p2m.h          | 11 +++---
>  xen/include/xen/mm.h               |  2 +-
>  14 files changed, 110 insertions(+), 99 deletions(-)
> 
> diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
> index 410bb4f..9035486 100644
> --- a/xen/arch/arm/domain_build.c
> +++ b/xen/arch/arm/domain_build.c
> @@ -117,7 +117,7 @@ static bool_t insert_11_bank(struct domain *d,
>          goto fail;
>      }
>  
> -    res = guest_physmap_add_page(d, spfn, spfn, order);
> +    res = guest_physmap_add_page(d, _gfn(spfn), _mfn(spfn), order);
>      if ( res )
>          panic("Failed map pages to DOM0: %d", res);
>  
> diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
> index 2ec211b..5ab9b75 100644
> --- a/xen/arch/arm/mm.c
> +++ b/xen/arch/arm/mm.c
> @@ -1153,7 +1153,7 @@ int xenmem_add_to_physmap_one(
>      }
>  
>      /* Map at new location. */
> -    rc = guest_physmap_add_entry(d, gpfn, mfn, 0, t);
> +    rc = guest_physmap_add_entry(d, _gfn(gpfn), _mfn(mfn), 0, t);
>  
>      /* If we fail to add the mapping, we need to drop the reference we
>       * took earlier on foreign pages */
> @@ -1282,8 +1282,8 @@ int create_grant_host_mapping(unsigned long addr, unsigned long frame,
>      if ( flags & GNTMAP_readonly )
>          t = p2m_grant_map_ro;
>  
> -    rc = guest_physmap_add_entry(current->domain, addr >> PAGE_SHIFT,
> -                                 frame, 0, t);
> +    rc = guest_physmap_add_entry(current->domain, _gfn(addr >> PAGE_SHIFT),
> +                                 _mfn(frame), 0, t);
>  
>      if ( rc )
>          return GNTST_general_error;
> @@ -1294,13 +1294,13 @@ int create_grant_host_mapping(unsigned long addr, unsigned long frame,
>  int replace_grant_host_mapping(unsigned long addr, unsigned long mfn,
>          unsigned long new_addr, unsigned int flags)
>  {
> -    unsigned long gfn = (unsigned long)(addr >> PAGE_SHIFT);
> +    gfn_t gfn = _gfn(addr >> PAGE_SHIFT);
>      struct domain *d = current->domain;
>  
>      if ( new_addr != 0 || (flags & GNTMAP_contains_pte) )
>          return GNTST_general_error;
>  
> -    guest_physmap_remove_page(d, gfn, mfn, 0);
> +    guest_physmap_remove_page(d, gfn, _mfn(mfn), 0);
>  
>      return GNTST_okay;
>  }
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index ab0cb41..aa4e774 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -1292,26 +1292,26 @@ int map_dev_mmio_region(struct domain *d,
>  }
>  
>  int guest_physmap_add_entry(struct domain *d,
> -                            unsigned long gpfn,
> -                            unsigned long mfn,
> +                            gfn_t gfn,
> +                            mfn_t mfn,
>                              unsigned long page_order,
>                              p2m_type_t t)
>  {
>      return apply_p2m_changes(d, INSERT,
> -                             pfn_to_paddr(gpfn),
> -                             pfn_to_paddr(gpfn + (1 << page_order)),
> -                             pfn_to_paddr(mfn), MATTR_MEM, 0, t,
> +                             pfn_to_paddr(gfn_x(gfn)),
> +                             pfn_to_paddr(gfn_x(gfn) + (1 << page_order)),
> +                             pfn_to_paddr(mfn_x(mfn)), MATTR_MEM, 0, t,
>                               d->arch.p2m.default_access);
>  }
>  
>  void guest_physmap_remove_page(struct domain *d,
> -                               unsigned long gpfn,
> -                               unsigned long mfn, unsigned int page_order)
> +                               gfn_t gfn,
> +                               mfn_t mfn, unsigned int page_order)
>  {
>      apply_p2m_changes(d, REMOVE,
> -                      pfn_to_paddr(gpfn),
> -                      pfn_to_paddr(gpfn + (1<<page_order)),
> -                      pfn_to_paddr(mfn), MATTR_MEM, 0, p2m_invalid,
> +                      pfn_to_paddr(gfn_x(gfn)),
> +                      pfn_to_paddr(gfn_x(gfn) + (1<<page_order)),
> +                      pfn_to_paddr(mfn_x(mfn)), MATTR_MEM, 0, p2m_invalid,
>                        d->arch.p2m.default_access);
>  }
>  
> diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
> index 3ba7ed1..bb59247 100644
> --- a/xen/arch/x86/domain.c
> +++ b/xen/arch/x86/domain.c
> @@ -802,9 +802,10 @@ int arch_domain_soft_reset(struct domain *d)
>          ret = -ENOMEM;
>          goto exit_put_gfn;
>      }
> -    guest_physmap_remove_page(d, gfn, mfn, PAGE_ORDER_4K);
> +    guest_physmap_remove_page(d, _gfn(gfn), _mfn(mfn), PAGE_ORDER_4K);
>  
> -    ret = guest_physmap_add_page(d, gfn, page_to_mfn(new_page), PAGE_ORDER_4K);
> +    ret = guest_physmap_add_page(d, _gfn(gfn), _mfn(page_to_mfn(new_page)),
> +                                 PAGE_ORDER_4K);
>      if ( ret )
>      {
>          printk(XENLOG_G_ERR "Failed to add a page to replace"
> diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c
> index b29c377..0a02d65 100644
> --- a/xen/arch/x86/domain_build.c
> +++ b/xen/arch/x86/domain_build.c
> @@ -427,7 +427,7 @@ static __init void pvh_add_mem_mapping(struct domain *d, unsigned long gfn,
>          if ( !iomem_access_permitted(d, mfn + i, mfn + i) )
>          {
>              omfn = get_gfn_query_unlocked(d, gfn + i, &t);
> -            guest_physmap_remove_page(d, gfn + i, mfn_x(omfn), PAGE_ORDER_4K);
> +            guest_physmap_remove_page(d, _gfn(gfn + i), omfn, PAGE_ORDER_4K);
>              continue;
>          }
>  
> @@ -530,7 +530,7 @@ static __init void pvh_map_all_iomem(struct domain *d, unsigned long nr_pages)
>              if ( get_gpfn_from_mfn(mfn) != INVALID_M2P_ENTRY )
>                  continue;
>  
> -            rc = guest_physmap_add_page(d, start_pfn, mfn, 0);
> +            rc = guest_physmap_add_page(d, _gfn(start_pfn), _mfn(mfn), 0);
>              if ( rc != 0 )
>                  panic("Unable to add gpfn %#lx mfn %#lx to Dom0 physmap: %d",
>                        start_pfn, mfn, rc);
> @@ -605,7 +605,7 @@ static __init void dom0_update_physmap(struct domain *d, unsigned long pfn,
>  {
>      if ( is_pvh_domain(d) )
>      {
> -        int rc = guest_physmap_add_page(d, pfn, mfn, 0);
> +        int rc = guest_physmap_add_page(d, _gfn(pfn), _mfn(mfn), 0);
>          BUG_ON(rc);
>          return;
>      }
> diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c
> index 333ce14..7148ac4 100644
> --- a/xen/arch/x86/hvm/ioreq.c
> +++ b/xen/arch/x86/hvm/ioreq.c
> @@ -267,8 +267,8 @@ bool_t is_ioreq_server_page(struct domain *d, const struct page_info *page)
>  static void hvm_remove_ioreq_gmfn(
>      struct domain *d, struct hvm_ioreq_page *iorp)
>  {
> -    guest_physmap_remove_page(d, iorp->gmfn,
> -                              page_to_mfn(iorp->page), 0);
> +    guest_physmap_remove_page(d, _gfn(iorp->gmfn),
> +                              _mfn(page_to_mfn(iorp->page)), 0);
>      clear_page(iorp->va);
>  }
>  
> @@ -279,8 +279,8 @@ static int hvm_add_ioreq_gmfn(
>  
>      clear_page(iorp->va);
>  
> -    rc = guest_physmap_add_page(d, iorp->gmfn,
> -                                page_to_mfn(iorp->page), 0);
> +    rc = guest_physmap_add_page(d, _gfn(iorp->gmfn),
> +                                _mfn(page_to_mfn(iorp->page)), 0);
>      if ( rc == 0 )
>          paging_mark_dirty(d, page_to_mfn(iorp->page));
>  
> diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
> index ae7c8ab..7fbc94e 100644
> --- a/xen/arch/x86/mm.c
> +++ b/xen/arch/x86/mm.c
> @@ -4211,7 +4211,8 @@ static int create_grant_p2m_mapping(uint64_t addr, unsigned long frame,
>      else
>          p2mt = p2m_grant_map_rw;
>      rc = guest_physmap_add_entry(current->domain,
> -                                 addr >> PAGE_SHIFT, frame, PAGE_ORDER_4K, p2mt);
> +                                 _gfn(addr >> PAGE_SHIFT),
> +                                 _mfn(frame), PAGE_ORDER_4K, p2mt);
>      if ( rc )
>          return GNTST_general_error;
>      else
> @@ -4268,7 +4269,7 @@ static int replace_grant_p2m_mapping(
>                  type, mfn_x(old_mfn), frame);
>          return GNTST_general_error;
>      }
> -    guest_physmap_remove_page(d, gfn, frame, PAGE_ORDER_4K);
> +    guest_physmap_remove_page(d, _gfn(gfn), _mfn(frame), PAGE_ORDER_4K);
>  
>      put_gfn(d, gfn);
>      return GNTST_okay;
> @@ -4853,7 +4854,8 @@ int xenmem_add_to_physmap_one(
>      {
>          if ( is_xen_heap_mfn(prev_mfn) )
>              /* Xen heap frames are simply unhooked from this phys slot. */
> -            guest_physmap_remove_page(d, gpfn, prev_mfn, PAGE_ORDER_4K);
> +            guest_physmap_remove_page(d, _gfn(gpfn), _mfn(prev_mfn),
> +                                      PAGE_ORDER_4K);
>          else
>              /* Normal domain memory is freed, to avoid leaking memory. */
>              guest_remove_page(d, gpfn);
> @@ -4867,10 +4869,10 @@ int xenmem_add_to_physmap_one(
>      if ( space == XENMAPSPACE_gmfn || space == XENMAPSPACE_gmfn_range )
>          ASSERT( old_gpfn == gfn );
>      if ( old_gpfn != INVALID_M2P_ENTRY )
> -        guest_physmap_remove_page(d, old_gpfn, mfn, PAGE_ORDER_4K);
> +        guest_physmap_remove_page(d, _gfn(old_gpfn), _mfn(mfn), PAGE_ORDER_4K);
>  
>      /* Map at new location. */
> -    rc = guest_physmap_add_page(d, gpfn, mfn, PAGE_ORDER_4K);
> +    rc = guest_physmap_add_page(d, _gfn(gpfn), _mfn(mfn), PAGE_ORDER_4K);
>  
>      /* In the XENMAPSPACE_gmfn, we took a ref of the gfn at the top */
>      if ( space == XENMAPSPACE_gmfn || space == XENMAPSPACE_gmfn_range )
> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
> index 89462b2..16733a4 100644
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -675,21 +675,20 @@ p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn,
>  }
>  
>  int
> -guest_physmap_remove_page(struct domain *d, unsigned long gfn,
> -                          unsigned long mfn, unsigned int page_order)
> +guest_physmap_remove_page(struct domain *d, gfn_t gfn,
> +                          mfn_t mfn, unsigned int page_order)
>  {
>      struct p2m_domain *p2m = p2m_get_hostp2m(d);
>      int rc;
>      gfn_lock(p2m, gfn, page_order);
> -    rc = p2m_remove_page(p2m, gfn, mfn, page_order);
> +    rc = p2m_remove_page(p2m, gfn_x(gfn), mfn_x(mfn), page_order);
>      gfn_unlock(p2m, gfn, page_order);
>      return rc;
>  }
>  
>  int
> -guest_physmap_add_entry(struct domain *d, unsigned long gfn,
> -                        unsigned long mfn, unsigned int page_order, 
> -                        p2m_type_t t)
> +guest_physmap_add_entry(struct domain *d, gfn_t gfn, mfn_t mfn,
> +                        unsigned int page_order, p2m_type_t t)
>  {
>      struct p2m_domain *p2m = p2m_get_hostp2m(d);
>      unsigned long i, ogfn;
> @@ -705,13 +704,14 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
>          {
>              for ( i = 0; i < (1 << page_order); i++ )
>              {
> -                rc = iommu_map_page(
> -                    d, mfn + i, mfn + i, IOMMUF_readable|IOMMUF_writable);
> +                rc = iommu_map_page(d, mfn_x(mfn_add(mfn, i)),
> +                                    mfn_x(mfn_add(mfn, i)),
> +                                    IOMMUF_readable|IOMMUF_writable);
>                  if ( rc != 0 )
>                  {
>                      while ( i-- > 0 )
>                          /* If statement to satisfy __must_check. */
> -                        if ( iommu_unmap_page(d, mfn + i) )
> +                        if ( iommu_unmap_page(d, mfn_x(mfn_add(mfn, i))) )
>                              continue;
>  
>                      return rc;
> @@ -727,18 +727,20 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
>  
>      p2m_lock(p2m);
>  
> -    P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn, mfn);
> +    P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn_x(gfn), mfn_x(mfn));
>  
>      /* First, remove m->p mappings for existing p->m mappings */
>      for ( i = 0; i < (1UL << page_order); i++ )
>      {
> -        omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, 0, NULL, NULL);
> +        omfn = p2m->get_entry(p2m, gfn_x(gfn_add(gfn, i)), &ot,
> +                              &a, 0, NULL, NULL);
>          if ( p2m_is_shared(ot) )
>          {
>              /* Do an unshare to cleanly take care of all corner 
>               * cases. */
>              int rc;
> -            rc = mem_sharing_unshare_page(p2m->domain, gfn + i, 0);
> +            rc = mem_sharing_unshare_page(p2m->domain,
> +                                          gfn_x(gfn_add(gfn, i)), 0);
>              if ( rc )
>              {
>                  p2m_unlock(p2m);
> @@ -753,10 +755,13 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
>                   *
>                   * Foreign domains are okay to place an event as they 
>                   * won't go to sleep. */
> -                (void)mem_sharing_notify_enomem(p2m->domain, gfn + i, 0);
> +                (void)mem_sharing_notify_enomem(p2m->domain,
> +                                                gfn_x(gfn_add(gfn, i)),
> +                                                0);
>                  return rc;
>              }
> -            omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, 0, NULL, NULL);
> +            omfn = p2m->get_entry(p2m, gfn_x(gfn_add(gfn, i)),
> +                                  &ot, &a, 0, NULL, NULL);
>              ASSERT(!p2m_is_shared(ot));
>          }
>          if ( p2m_is_grant(ot) || p2m_is_foreign(ot) )
> @@ -787,39 +792,39 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
>      /* Then, look for m->p mappings for this range and deal with them */
>      for ( i = 0; i < (1UL << page_order); i++ )
>      {
> -        if ( page_get_owner(mfn_to_page(_mfn(mfn + i))) == dom_cow )
> +        if ( page_get_owner(mfn_to_page(mfn_add(mfn, i))) == dom_cow )
>          {
>              /* This is no way to add a shared page to your physmap! */
> -            gdprintk(XENLOG_ERR, "Adding shared mfn %lx directly to dom %hu "
> -                        "physmap not allowed.\n", mfn+i, d->domain_id);
> +            gdprintk(XENLOG_ERR, "Adding shared mfn %lx directly to dom%d physmap not allowed.\n",
> +                     mfn_x(mfn_add(mfn, i)), d->domain_id);
>              p2m_unlock(p2m);
>              return -EINVAL;
>          }
> -        if ( page_get_owner(mfn_to_page(_mfn(mfn + i))) != d )
> +        if ( page_get_owner(mfn_to_page(mfn_add(mfn, i))) != d )
>              continue;
> -        ogfn = mfn_to_gfn(d, _mfn(mfn+i));
> -        if ( (ogfn != INVALID_M2P_ENTRY) && (ogfn != gfn + i) )
> +        ogfn = mfn_to_gfn(d, mfn_add(mfn, i));
> +        if ( (ogfn != INVALID_M2P_ENTRY) && (ogfn != gfn_x(gfn_add(gfn, i))) )
>          {
>              /* This machine frame is already mapped at another physical
>               * address */
>              P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n",
> -                      mfn + i, ogfn, gfn + i);
> +                      mfn_x(mfn_add(mfn, i)), ogfn, gfn_x(gfn_add(gfn, i)));
>              omfn = p2m->get_entry(p2m, ogfn, &ot, &a, 0, NULL, NULL);
>              if ( p2m_is_ram(ot) && !p2m_is_paged(ot) )
>              {
>                  ASSERT(mfn_valid(omfn));
>                  P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n",
>                            ogfn , mfn_x(omfn));
> -                if ( mfn_x(omfn) == (mfn + i) )
> -                    p2m_remove_page(p2m, ogfn, mfn + i, 0);
> +                if ( mfn_eq(omfn, mfn_add(mfn, i)) )
> +                    p2m_remove_page(p2m, ogfn, mfn_x(mfn_add(mfn, i)), 0);
>              }
>          }
>      }
>  
>      /* Now, actually do the two-way mapping */
> -    if ( mfn_valid(_mfn(mfn)) ) 
> +    if ( mfn_valid(mfn) )
>      {
> -        rc = p2m_set_entry(p2m, gfn, _mfn(mfn), page_order, t,
> +        rc = p2m_set_entry(p2m, gfn_x(gfn), mfn, page_order, t,
>                             p2m->default_access);
>          if ( rc )
>              goto out; /* Failed to update p2m, bail without updating m2p. */
> @@ -827,14 +832,15 @@ guest_physmap_add_entry(struct domain *d, unsigned long gfn,
>          if ( !p2m_is_grant(t) )
>          {
>              for ( i = 0; i < (1UL << page_order); i++ )
> -                set_gpfn_from_mfn(mfn+i, gfn+i);
> +                set_gpfn_from_mfn(mfn_x(mfn_add(mfn, i)),
> +                                  gfn_x(gfn_add(gfn, i)));
>          }
>      }
>      else
>      {
>          gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n",
> -                 gfn, mfn);
> -        rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order,
> +                 gfn_x(gfn), mfn_x(mfn));
> +        rc = p2m_set_entry(p2m, gfn_x(gfn), _mfn(INVALID_MFN), page_order,
>                             p2m_invalid, p2m->default_access);
>          if ( rc == 0 )
>          {
> @@ -2798,7 +2804,7 @@ int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
>                      unsigned long gpfn, domid_t foreigndom)
>  {
>      p2m_type_t p2mt, p2mt_prev;
> -    unsigned long prev_mfn, mfn;
> +    mfn_t prev_mfn, mfn;
>      struct page_info *page;
>      int rc;
>      struct domain *fdom;
> @@ -2841,15 +2847,15 @@ int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
>          rc = -EINVAL;
>          goto out;
>      }
> -    mfn = mfn_x(page_to_mfn(page));
> +    mfn = page_to_mfn(page);
>  
>      /* Remove previously mapped page if it is present. */
> -    prev_mfn = mfn_x(get_gfn(tdom, gpfn, &p2mt_prev));
> -    if ( mfn_valid(_mfn(prev_mfn)) )
> +    prev_mfn = get_gfn(tdom, gpfn, &p2mt_prev);
> +    if ( mfn_valid(prev_mfn) )
>      {
> -        if ( is_xen_heap_mfn(prev_mfn) )
> +        if ( is_xen_heap_mfn(mfn_x(prev_mfn)) )
>              /* Xen heap frames are simply unhooked from this phys slot */
> -            guest_physmap_remove_page(tdom, gpfn, prev_mfn, 0);
> +            guest_physmap_remove_page(tdom, _gfn(gpfn), prev_mfn, 0);
>          else
>              /* Normal domain memory is freed, to avoid leaking memory. */
>              guest_remove_page(tdom, gpfn);
> @@ -2859,11 +2865,11 @@ int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
>       * will update the m2p table which will result in  mfn -> gpfn of dom0
>       * and not fgfn of domU.
>       */
> -    rc = set_foreign_p2m_entry(tdom, gpfn, _mfn(mfn));
> +    rc = set_foreign_p2m_entry(tdom, gpfn, mfn);
>      if ( rc )
>          gdprintk(XENLOG_WARNING, "set_foreign_p2m_entry failed. "
>                   "gpfn:%lx mfn:%lx fgfn:%lx td:%d fd:%d\n",
> -                 gpfn, mfn, fgfn, tdom->domain_id, fdom->domain_id);
> +                 gpfn, mfn_x(mfn), fgfn, tdom->domain_id, fdom->domain_id);
>  
>      put_page(page);
>  
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index 3c304f4..3f15543 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -1818,7 +1818,7 @@ gnttab_transfer(
>              goto copyback;
>          }
>  
> -        guest_physmap_remove_page(d, gop.mfn, mfn, 0);
> +        guest_physmap_remove_page(d, _gfn(gop.mfn), _mfn(mfn), 0);
>          gnttab_flush_tlb(d);
>  
>          /* Find the target domain. */
> @@ -1946,7 +1946,7 @@ gnttab_transfer(
>          {
>              grant_entry_v1_t *sha = &shared_entry_v1(e->grant_table, gop.ref);
>  
> -            guest_physmap_add_page(e, sha->frame, mfn, 0);
> +            guest_physmap_add_page(e, _gfn(sha->frame), _mfn(mfn), 0);
>              if ( !paging_mode_translate(e) )
>                  sha->frame = mfn;
>          }
> @@ -1954,7 +1954,8 @@ gnttab_transfer(
>          {
>              grant_entry_v2_t *sha = &shared_entry_v2(e->grant_table, gop.ref);
>  
> -            guest_physmap_add_page(e, sha->full_page.frame, mfn, 0);
> +            guest_physmap_add_page(e, _gfn(sha->full_page.frame),
> +                                   _mfn(mfn), 0);
>              if ( !paging_mode_translate(e) )
>                  sha->full_page.frame = mfn;
>          }
> diff --git a/xen/common/memory.c b/xen/common/memory.c
> index b54b076..a8a75e0 100644
> --- a/xen/common/memory.c
> +++ b/xen/common/memory.c
> @@ -213,7 +213,7 @@ static void populate_physmap(struct memop_args *a)
>                  mfn = page_to_mfn(page);
>              }
>  
> -            guest_physmap_add_page(d, gpfn, mfn, a->extent_order);
> +            guest_physmap_add_page(d, _gfn(gpfn), _mfn(mfn), a->extent_order);
>  
>              if ( !paging_mode_translate(d) )
>              {
> @@ -237,20 +237,20 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
>  #ifdef CONFIG_X86
>      p2m_type_t p2mt;
>  #endif
> -    unsigned long mfn;
> +    mfn_t mfn;
>  
>  #ifdef CONFIG_X86
> -    mfn = mfn_x(get_gfn_query(d, gmfn, &p2mt)); 
> +    mfn = get_gfn_query(d, gmfn, &p2mt);
>      if ( unlikely(p2m_is_paging(p2mt)) )
>      {
> -        guest_physmap_remove_page(d, gmfn, mfn, 0);
> +        guest_physmap_remove_page(d, _gfn(gmfn), mfn, 0);
>          put_gfn(d, gmfn);
>          /* If the page hasn't yet been paged out, there is an
>           * actual page that needs to be released. */
>          if ( p2mt == p2m_ram_paging_out )
>          {
> -            ASSERT(mfn_valid(mfn));
> -            page = mfn_to_page(mfn);
> +            ASSERT(mfn_valid(mfn_x(mfn)));
> +            page = mfn_to_page(mfn_x(mfn));
>              if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
>                  put_page(page);
>          }
> @@ -259,14 +259,14 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
>      }
>      if ( p2mt == p2m_mmio_direct )
>      {
> -        clear_mmio_p2m_entry(d, gmfn, _mfn(mfn), 0);
> +        clear_mmio_p2m_entry(d, gmfn, mfn, 0);
>          put_gfn(d, gmfn);
>          return 1;
>      }
>  #else
> -    mfn = mfn_x(gfn_to_mfn(d, _gfn(gmfn)));
> +    mfn = gfn_to_mfn(d, _gfn(gmfn));
>  #endif
> -    if ( unlikely(!mfn_valid(mfn)) )
> +    if ( unlikely(!mfn_valid(mfn_x(mfn))) )
>      {
>          put_gfn(d, gmfn);
>          gdprintk(XENLOG_INFO, "Domain %u page number %lx invalid\n",
> @@ -288,12 +288,12 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
>              return 0;
>          }
>          /* Maybe the mfn changed */
> -        mfn = mfn_x(get_gfn_query_unlocked(d, gmfn, &p2mt));
> +        mfn = get_gfn_query_unlocked(d, gmfn, &p2mt);
>          ASSERT(!p2m_is_shared(p2mt));
>      }
>  #endif /* CONFIG_X86 */
>  
> -    page = mfn_to_page(mfn);
> +    page = mfn_to_page(mfn_x(mfn));
>      if ( unlikely(!get_page(page, d)) )
>      {
>          put_gfn(d, gmfn);
> @@ -316,7 +316,7 @@ int guest_remove_page(struct domain *d, unsigned long gmfn)
>           test_and_clear_bit(_PGC_allocated, &page->count_info) )
>          put_page(page);
>  
> -    guest_physmap_remove_page(d, gmfn, mfn, 0);
> +    guest_physmap_remove_page(d, _gfn(gmfn), mfn, 0);
>  
>      put_page(page);
>      put_gfn(d, gmfn);
> @@ -540,7 +540,7 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
>              gfn = mfn_to_gmfn(d, mfn);
>              /* Pages were unshared above */
>              BUG_ON(SHARED_M2P(gfn));
> -            guest_physmap_remove_page(d, gfn, mfn, 0);
> +            guest_physmap_remove_page(d, _gfn(gfn), _mfn(mfn), 0);
>              put_page(page);
>          }
>  
> @@ -584,7 +584,8 @@ static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
>              }
>  
>              mfn = page_to_mfn(page);
> -            guest_physmap_add_page(d, gpfn, mfn, exch.out.extent_order);
> +            guest_physmap_add_page(d, _gfn(gpfn), _mfn(mfn),
> +                                   exch.out.extent_order);
>  
>              if ( !paging_mode_translate(d) )
>              {
> @@ -1095,7 +1096,8 @@ long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
>          page = get_page_from_gfn(d, xrfp.gpfn, NULL, P2M_ALLOC);
>          if ( page )
>          {
> -            guest_physmap_remove_page(d, xrfp.gpfn, page_to_mfn(page), 0);
> +            guest_physmap_remove_page(d, _gfn(xrfp.gpfn),
> +                                      _mfn(page_to_mfn(page)), 0);
>              put_page(page);
>          }
>          else
> diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
> index 8a4b123..cf8b8b8 100644
> --- a/xen/drivers/passthrough/arm/smmu.c
> +++ b/xen/drivers/passthrough/arm/smmu.c
> @@ -2774,7 +2774,7 @@ static int __must_check arm_smmu_map_page(struct domain *d, unsigned long gfn,
>  	 * The function guest_physmap_add_entry replaces the current mapping
>  	 * if there is already one...
>  	 */
> -	return guest_physmap_add_entry(d, gfn, mfn, 0, t);
> +	return guest_physmap_add_entry(d, _gfn(gfn), _mfn(mfn), 0, t);
>  }
>  
>  static int __must_check arm_smmu_unmap_page(struct domain *d, unsigned long gfn)
> @@ -2786,7 +2786,7 @@ static int __must_check arm_smmu_unmap_page(struct domain *d, unsigned long gfn)
>  	if ( !is_domain_direct_mapped(d) )
>  		return -EINVAL;
>  
> -	guest_physmap_remove_page(d, gfn, gfn, 0);
> +	guest_physmap_remove_page(d, _gfn(gfn), _mfn(gfn), 0);
>  
>  	return 0;
>  }
> diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
> index 75c65a8..0d1e61e 100644
> --- a/xen/include/asm-arm/p2m.h
> +++ b/xen/include/asm-arm/p2m.h
> @@ -160,23 +160,23 @@ int map_dev_mmio_region(struct domain *d,
>                          unsigned long mfn);
>  
>  int guest_physmap_add_entry(struct domain *d,
> -                            unsigned long gfn,
> -                            unsigned long mfn,
> +                            gfn_t gfn,
> +                            mfn_t mfn,
>                              unsigned long page_order,
>                              p2m_type_t t);
>  
>  /* Untyped version for RAM only, for compatibility */
>  static inline int guest_physmap_add_page(struct domain *d,
> -                                         unsigned long gfn,
> -                                         unsigned long mfn,
> +                                         gfn_t gfn,
> +                                         mfn_t mfn,
>                                           unsigned int page_order)
>  {
>      return guest_physmap_add_entry(d, gfn, mfn, page_order, p2m_ram_rw);
>  }
>  
>  void guest_physmap_remove_page(struct domain *d,
> -                               unsigned long gpfn,
> -                               unsigned long mfn, unsigned int page_order);
> +                               gfn_t gfn,
> +                               mfn_t mfn, unsigned int page_order);
>  
>  mfn_t gfn_to_mfn(struct domain *d, gfn_t gfn);
>  
> diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
> index 65675a2..4ab3574 100644
> --- a/xen/include/asm-x86/p2m.h
> +++ b/xen/include/asm-x86/p2m.h
> @@ -545,14 +545,14 @@ void p2m_teardown(struct p2m_domain *p2m);
>  void p2m_final_teardown(struct domain *d);
>  
>  /* Add a page to a domain's p2m table */
> -int guest_physmap_add_entry(struct domain *d, unsigned long gfn,
> -                            unsigned long mfn, unsigned int page_order, 
> +int guest_physmap_add_entry(struct domain *d, gfn_t gfn,
> +                            mfn_t mfn, unsigned int page_order,
>                              p2m_type_t t);
>  
>  /* Untyped version for RAM only, for compatibility */
>  static inline int guest_physmap_add_page(struct domain *d,
> -                                         unsigned long gfn,
> -                                         unsigned long mfn,
> +                                         gfn_t gfn,
> +                                         mfn_t mfn,
>                                           unsigned int page_order)
>  {
>      return guest_physmap_add_entry(d, gfn, mfn, page_order, p2m_ram_rw);
> @@ -560,8 +560,7 @@ static inline int guest_physmap_add_page(struct domain *d,
>  
>  /* Remove a page from a domain's p2m table */
>  int guest_physmap_remove_page(struct domain *d,
> -                              unsigned long gfn,
> -                              unsigned long mfn, unsigned int page_order);
> +                              gfn_t gfn, mfn_t mfn, unsigned int page_order);
>  
>  /* Set a p2m range as populate-on-demand */
>  int guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
> diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
> index 13f706e..b62f473 100644
> --- a/xen/include/xen/mm.h
> +++ b/xen/include/xen/mm.h
> @@ -552,7 +552,7 @@ int xenmem_add_to_physmap_one(struct domain *d, unsigned int space,
>  
>  /* Returns 1 on success, 0 on error, negative if the ring
>   * for event propagation is full in the presence of paging */
> -int guest_remove_page(struct domain *d, unsigned long gmfn);
> +int guest_remove_page(struct domain *d, unsigned long gfn);
>  
>  #define RAM_TYPE_CONVENTIONAL 0x00000001
>  #define RAM_TYPE_RESERVED     0x00000002
> -- 
> 1.9.1
>
diff mbox

Patch

diff --git a/xen/arch/arm/domain_build.c b/xen/arch/arm/domain_build.c
index 410bb4f..9035486 100644
--- a/xen/arch/arm/domain_build.c
+++ b/xen/arch/arm/domain_build.c
@@ -117,7 +117,7 @@  static bool_t insert_11_bank(struct domain *d,
         goto fail;
     }
 
-    res = guest_physmap_add_page(d, spfn, spfn, order);
+    res = guest_physmap_add_page(d, _gfn(spfn), _mfn(spfn), order);
     if ( res )
         panic("Failed map pages to DOM0: %d", res);
 
diff --git a/xen/arch/arm/mm.c b/xen/arch/arm/mm.c
index 2ec211b..5ab9b75 100644
--- a/xen/arch/arm/mm.c
+++ b/xen/arch/arm/mm.c
@@ -1153,7 +1153,7 @@  int xenmem_add_to_physmap_one(
     }
 
     /* Map at new location. */
-    rc = guest_physmap_add_entry(d, gpfn, mfn, 0, t);
+    rc = guest_physmap_add_entry(d, _gfn(gpfn), _mfn(mfn), 0, t);
 
     /* If we fail to add the mapping, we need to drop the reference we
      * took earlier on foreign pages */
@@ -1282,8 +1282,8 @@  int create_grant_host_mapping(unsigned long addr, unsigned long frame,
     if ( flags & GNTMAP_readonly )
         t = p2m_grant_map_ro;
 
-    rc = guest_physmap_add_entry(current->domain, addr >> PAGE_SHIFT,
-                                 frame, 0, t);
+    rc = guest_physmap_add_entry(current->domain, _gfn(addr >> PAGE_SHIFT),
+                                 _mfn(frame), 0, t);
 
     if ( rc )
         return GNTST_general_error;
@@ -1294,13 +1294,13 @@  int create_grant_host_mapping(unsigned long addr, unsigned long frame,
 int replace_grant_host_mapping(unsigned long addr, unsigned long mfn,
         unsigned long new_addr, unsigned int flags)
 {
-    unsigned long gfn = (unsigned long)(addr >> PAGE_SHIFT);
+    gfn_t gfn = _gfn(addr >> PAGE_SHIFT);
     struct domain *d = current->domain;
 
     if ( new_addr != 0 || (flags & GNTMAP_contains_pte) )
         return GNTST_general_error;
 
-    guest_physmap_remove_page(d, gfn, mfn, 0);
+    guest_physmap_remove_page(d, gfn, _mfn(mfn), 0);
 
     return GNTST_okay;
 }
diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
index ab0cb41..aa4e774 100644
--- a/xen/arch/arm/p2m.c
+++ b/xen/arch/arm/p2m.c
@@ -1292,26 +1292,26 @@  int map_dev_mmio_region(struct domain *d,
 }
 
 int guest_physmap_add_entry(struct domain *d,
-                            unsigned long gpfn,
-                            unsigned long mfn,
+                            gfn_t gfn,
+                            mfn_t mfn,
                             unsigned long page_order,
                             p2m_type_t t)
 {
     return apply_p2m_changes(d, INSERT,
-                             pfn_to_paddr(gpfn),
-                             pfn_to_paddr(gpfn + (1 << page_order)),
-                             pfn_to_paddr(mfn), MATTR_MEM, 0, t,
+                             pfn_to_paddr(gfn_x(gfn)),
+                             pfn_to_paddr(gfn_x(gfn) + (1 << page_order)),
+                             pfn_to_paddr(mfn_x(mfn)), MATTR_MEM, 0, t,
                              d->arch.p2m.default_access);
 }
 
 void guest_physmap_remove_page(struct domain *d,
-                               unsigned long gpfn,
-                               unsigned long mfn, unsigned int page_order)
+                               gfn_t gfn,
+                               mfn_t mfn, unsigned int page_order)
 {
     apply_p2m_changes(d, REMOVE,
-                      pfn_to_paddr(gpfn),
-                      pfn_to_paddr(gpfn + (1<<page_order)),
-                      pfn_to_paddr(mfn), MATTR_MEM, 0, p2m_invalid,
+                      pfn_to_paddr(gfn_x(gfn)),
+                      pfn_to_paddr(gfn_x(gfn) + (1<<page_order)),
+                      pfn_to_paddr(mfn_x(mfn)), MATTR_MEM, 0, p2m_invalid,
                       d->arch.p2m.default_access);
 }
 
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index 3ba7ed1..bb59247 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -802,9 +802,10 @@  int arch_domain_soft_reset(struct domain *d)
         ret = -ENOMEM;
         goto exit_put_gfn;
     }
-    guest_physmap_remove_page(d, gfn, mfn, PAGE_ORDER_4K);
+    guest_physmap_remove_page(d, _gfn(gfn), _mfn(mfn), PAGE_ORDER_4K);
 
-    ret = guest_physmap_add_page(d, gfn, page_to_mfn(new_page), PAGE_ORDER_4K);
+    ret = guest_physmap_add_page(d, _gfn(gfn), _mfn(page_to_mfn(new_page)),
+                                 PAGE_ORDER_4K);
     if ( ret )
     {
         printk(XENLOG_G_ERR "Failed to add a page to replace"
diff --git a/xen/arch/x86/domain_build.c b/xen/arch/x86/domain_build.c
index b29c377..0a02d65 100644
--- a/xen/arch/x86/domain_build.c
+++ b/xen/arch/x86/domain_build.c
@@ -427,7 +427,7 @@  static __init void pvh_add_mem_mapping(struct domain *d, unsigned long gfn,
         if ( !iomem_access_permitted(d, mfn + i, mfn + i) )
         {
             omfn = get_gfn_query_unlocked(d, gfn + i, &t);
-            guest_physmap_remove_page(d, gfn + i, mfn_x(omfn), PAGE_ORDER_4K);
+            guest_physmap_remove_page(d, _gfn(gfn + i), omfn, PAGE_ORDER_4K);
             continue;
         }
 
@@ -530,7 +530,7 @@  static __init void pvh_map_all_iomem(struct domain *d, unsigned long nr_pages)
             if ( get_gpfn_from_mfn(mfn) != INVALID_M2P_ENTRY )
                 continue;
 
-            rc = guest_physmap_add_page(d, start_pfn, mfn, 0);
+            rc = guest_physmap_add_page(d, _gfn(start_pfn), _mfn(mfn), 0);
             if ( rc != 0 )
                 panic("Unable to add gpfn %#lx mfn %#lx to Dom0 physmap: %d",
                       start_pfn, mfn, rc);
@@ -605,7 +605,7 @@  static __init void dom0_update_physmap(struct domain *d, unsigned long pfn,
 {
     if ( is_pvh_domain(d) )
     {
-        int rc = guest_physmap_add_page(d, pfn, mfn, 0);
+        int rc = guest_physmap_add_page(d, _gfn(pfn), _mfn(mfn), 0);
         BUG_ON(rc);
         return;
     }
diff --git a/xen/arch/x86/hvm/ioreq.c b/xen/arch/x86/hvm/ioreq.c
index 333ce14..7148ac4 100644
--- a/xen/arch/x86/hvm/ioreq.c
+++ b/xen/arch/x86/hvm/ioreq.c
@@ -267,8 +267,8 @@  bool_t is_ioreq_server_page(struct domain *d, const struct page_info *page)
 static void hvm_remove_ioreq_gmfn(
     struct domain *d, struct hvm_ioreq_page *iorp)
 {
-    guest_physmap_remove_page(d, iorp->gmfn,
-                              page_to_mfn(iorp->page), 0);
+    guest_physmap_remove_page(d, _gfn(iorp->gmfn),
+                              _mfn(page_to_mfn(iorp->page)), 0);
     clear_page(iorp->va);
 }
 
@@ -279,8 +279,8 @@  static int hvm_add_ioreq_gmfn(
 
     clear_page(iorp->va);
 
-    rc = guest_physmap_add_page(d, iorp->gmfn,
-                                page_to_mfn(iorp->page), 0);
+    rc = guest_physmap_add_page(d, _gfn(iorp->gmfn),
+                                _mfn(page_to_mfn(iorp->page)), 0);
     if ( rc == 0 )
         paging_mark_dirty(d, page_to_mfn(iorp->page));
 
diff --git a/xen/arch/x86/mm.c b/xen/arch/x86/mm.c
index ae7c8ab..7fbc94e 100644
--- a/xen/arch/x86/mm.c
+++ b/xen/arch/x86/mm.c
@@ -4211,7 +4211,8 @@  static int create_grant_p2m_mapping(uint64_t addr, unsigned long frame,
     else
         p2mt = p2m_grant_map_rw;
     rc = guest_physmap_add_entry(current->domain,
-                                 addr >> PAGE_SHIFT, frame, PAGE_ORDER_4K, p2mt);
+                                 _gfn(addr >> PAGE_SHIFT),
+                                 _mfn(frame), PAGE_ORDER_4K, p2mt);
     if ( rc )
         return GNTST_general_error;
     else
@@ -4268,7 +4269,7 @@  static int replace_grant_p2m_mapping(
                 type, mfn_x(old_mfn), frame);
         return GNTST_general_error;
     }
-    guest_physmap_remove_page(d, gfn, frame, PAGE_ORDER_4K);
+    guest_physmap_remove_page(d, _gfn(gfn), _mfn(frame), PAGE_ORDER_4K);
 
     put_gfn(d, gfn);
     return GNTST_okay;
@@ -4853,7 +4854,8 @@  int xenmem_add_to_physmap_one(
     {
         if ( is_xen_heap_mfn(prev_mfn) )
             /* Xen heap frames are simply unhooked from this phys slot. */
-            guest_physmap_remove_page(d, gpfn, prev_mfn, PAGE_ORDER_4K);
+            guest_physmap_remove_page(d, _gfn(gpfn), _mfn(prev_mfn),
+                                      PAGE_ORDER_4K);
         else
             /* Normal domain memory is freed, to avoid leaking memory. */
             guest_remove_page(d, gpfn);
@@ -4867,10 +4869,10 @@  int xenmem_add_to_physmap_one(
     if ( space == XENMAPSPACE_gmfn || space == XENMAPSPACE_gmfn_range )
         ASSERT( old_gpfn == gfn );
     if ( old_gpfn != INVALID_M2P_ENTRY )
-        guest_physmap_remove_page(d, old_gpfn, mfn, PAGE_ORDER_4K);
+        guest_physmap_remove_page(d, _gfn(old_gpfn), _mfn(mfn), PAGE_ORDER_4K);
 
     /* Map at new location. */
-    rc = guest_physmap_add_page(d, gpfn, mfn, PAGE_ORDER_4K);
+    rc = guest_physmap_add_page(d, _gfn(gpfn), _mfn(mfn), PAGE_ORDER_4K);
 
     /* In the XENMAPSPACE_gmfn, we took a ref of the gfn at the top */
     if ( space == XENMAPSPACE_gmfn || space == XENMAPSPACE_gmfn_range )
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index 89462b2..16733a4 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -675,21 +675,20 @@  p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn,
 }
 
 int
-guest_physmap_remove_page(struct domain *d, unsigned long gfn,
-                          unsigned long mfn, unsigned int page_order)
+guest_physmap_remove_page(struct domain *d, gfn_t gfn,
+                          mfn_t mfn, unsigned int page_order)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     int rc;
     gfn_lock(p2m, gfn, page_order);
-    rc = p2m_remove_page(p2m, gfn, mfn, page_order);
+    rc = p2m_remove_page(p2m, gfn_x(gfn), mfn_x(mfn), page_order);
     gfn_unlock(p2m, gfn, page_order);
     return rc;
 }
 
 int
-guest_physmap_add_entry(struct domain *d, unsigned long gfn,
-                        unsigned long mfn, unsigned int page_order, 
-                        p2m_type_t t)
+guest_physmap_add_entry(struct domain *d, gfn_t gfn, mfn_t mfn,
+                        unsigned int page_order, p2m_type_t t)
 {
     struct p2m_domain *p2m = p2m_get_hostp2m(d);
     unsigned long i, ogfn;
@@ -705,13 +704,14 @@  guest_physmap_add_entry(struct domain *d, unsigned long gfn,
         {
             for ( i = 0; i < (1 << page_order); i++ )
             {
-                rc = iommu_map_page(
-                    d, mfn + i, mfn + i, IOMMUF_readable|IOMMUF_writable);
+                rc = iommu_map_page(d, mfn_x(mfn_add(mfn, i)),
+                                    mfn_x(mfn_add(mfn, i)),
+                                    IOMMUF_readable|IOMMUF_writable);
                 if ( rc != 0 )
                 {
                     while ( i-- > 0 )
                         /* If statement to satisfy __must_check. */
-                        if ( iommu_unmap_page(d, mfn + i) )
+                        if ( iommu_unmap_page(d, mfn_x(mfn_add(mfn, i))) )
                             continue;
 
                     return rc;
@@ -727,18 +727,20 @@  guest_physmap_add_entry(struct domain *d, unsigned long gfn,
 
     p2m_lock(p2m);
 
-    P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn, mfn);
+    P2M_DEBUG("adding gfn=%#lx mfn=%#lx\n", gfn_x(gfn), mfn_x(mfn));
 
     /* First, remove m->p mappings for existing p->m mappings */
     for ( i = 0; i < (1UL << page_order); i++ )
     {
-        omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, 0, NULL, NULL);
+        omfn = p2m->get_entry(p2m, gfn_x(gfn_add(gfn, i)), &ot,
+                              &a, 0, NULL, NULL);
         if ( p2m_is_shared(ot) )
         {
             /* Do an unshare to cleanly take care of all corner 
              * cases. */
             int rc;
-            rc = mem_sharing_unshare_page(p2m->domain, gfn + i, 0);
+            rc = mem_sharing_unshare_page(p2m->domain,
+                                          gfn_x(gfn_add(gfn, i)), 0);
             if ( rc )
             {
                 p2m_unlock(p2m);
@@ -753,10 +755,13 @@  guest_physmap_add_entry(struct domain *d, unsigned long gfn,
                  *
                  * Foreign domains are okay to place an event as they 
                  * won't go to sleep. */
-                (void)mem_sharing_notify_enomem(p2m->domain, gfn + i, 0);
+                (void)mem_sharing_notify_enomem(p2m->domain,
+                                                gfn_x(gfn_add(gfn, i)),
+                                                0);
                 return rc;
             }
-            omfn = p2m->get_entry(p2m, gfn + i, &ot, &a, 0, NULL, NULL);
+            omfn = p2m->get_entry(p2m, gfn_x(gfn_add(gfn, i)),
+                                  &ot, &a, 0, NULL, NULL);
             ASSERT(!p2m_is_shared(ot));
         }
         if ( p2m_is_grant(ot) || p2m_is_foreign(ot) )
@@ -787,39 +792,39 @@  guest_physmap_add_entry(struct domain *d, unsigned long gfn,
     /* Then, look for m->p mappings for this range and deal with them */
     for ( i = 0; i < (1UL << page_order); i++ )
     {
-        if ( page_get_owner(mfn_to_page(_mfn(mfn + i))) == dom_cow )
+        if ( page_get_owner(mfn_to_page(mfn_add(mfn, i))) == dom_cow )
         {
             /* This is no way to add a shared page to your physmap! */
-            gdprintk(XENLOG_ERR, "Adding shared mfn %lx directly to dom %hu "
-                        "physmap not allowed.\n", mfn+i, d->domain_id);
+            gdprintk(XENLOG_ERR, "Adding shared mfn %lx directly to dom%d physmap not allowed.\n",
+                     mfn_x(mfn_add(mfn, i)), d->domain_id);
             p2m_unlock(p2m);
             return -EINVAL;
         }
-        if ( page_get_owner(mfn_to_page(_mfn(mfn + i))) != d )
+        if ( page_get_owner(mfn_to_page(mfn_add(mfn, i))) != d )
             continue;
-        ogfn = mfn_to_gfn(d, _mfn(mfn+i));
-        if ( (ogfn != INVALID_M2P_ENTRY) && (ogfn != gfn + i) )
+        ogfn = mfn_to_gfn(d, mfn_add(mfn, i));
+        if ( (ogfn != INVALID_M2P_ENTRY) && (ogfn != gfn_x(gfn_add(gfn, i))) )
         {
             /* This machine frame is already mapped at another physical
              * address */
             P2M_DEBUG("aliased! mfn=%#lx, old gfn=%#lx, new gfn=%#lx\n",
-                      mfn + i, ogfn, gfn + i);
+                      mfn_x(mfn_add(mfn, i)), ogfn, gfn_x(gfn_add(gfn, i)));
             omfn = p2m->get_entry(p2m, ogfn, &ot, &a, 0, NULL, NULL);
             if ( p2m_is_ram(ot) && !p2m_is_paged(ot) )
             {
                 ASSERT(mfn_valid(omfn));
                 P2M_DEBUG("old gfn=%#lx -> mfn %#lx\n",
                           ogfn , mfn_x(omfn));
-                if ( mfn_x(omfn) == (mfn + i) )
-                    p2m_remove_page(p2m, ogfn, mfn + i, 0);
+                if ( mfn_eq(omfn, mfn_add(mfn, i)) )
+                    p2m_remove_page(p2m, ogfn, mfn_x(mfn_add(mfn, i)), 0);
             }
         }
     }
 
     /* Now, actually do the two-way mapping */
-    if ( mfn_valid(_mfn(mfn)) ) 
+    if ( mfn_valid(mfn) )
     {
-        rc = p2m_set_entry(p2m, gfn, _mfn(mfn), page_order, t,
+        rc = p2m_set_entry(p2m, gfn_x(gfn), mfn, page_order, t,
                            p2m->default_access);
         if ( rc )
             goto out; /* Failed to update p2m, bail without updating m2p. */
@@ -827,14 +832,15 @@  guest_physmap_add_entry(struct domain *d, unsigned long gfn,
         if ( !p2m_is_grant(t) )
         {
             for ( i = 0; i < (1UL << page_order); i++ )
-                set_gpfn_from_mfn(mfn+i, gfn+i);
+                set_gpfn_from_mfn(mfn_x(mfn_add(mfn, i)),
+                                  gfn_x(gfn_add(gfn, i)));
         }
     }
     else
     {
         gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n",
-                 gfn, mfn);
-        rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order,
+                 gfn_x(gfn), mfn_x(mfn));
+        rc = p2m_set_entry(p2m, gfn_x(gfn), _mfn(INVALID_MFN), page_order,
                            p2m_invalid, p2m->default_access);
         if ( rc == 0 )
         {
@@ -2798,7 +2804,7 @@  int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
                     unsigned long gpfn, domid_t foreigndom)
 {
     p2m_type_t p2mt, p2mt_prev;
-    unsigned long prev_mfn, mfn;
+    mfn_t prev_mfn, mfn;
     struct page_info *page;
     int rc;
     struct domain *fdom;
@@ -2841,15 +2847,15 @@  int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
         rc = -EINVAL;
         goto out;
     }
-    mfn = mfn_x(page_to_mfn(page));
+    mfn = page_to_mfn(page);
 
     /* Remove previously mapped page if it is present. */
-    prev_mfn = mfn_x(get_gfn(tdom, gpfn, &p2mt_prev));
-    if ( mfn_valid(_mfn(prev_mfn)) )
+    prev_mfn = get_gfn(tdom, gpfn, &p2mt_prev);
+    if ( mfn_valid(prev_mfn) )
     {
-        if ( is_xen_heap_mfn(prev_mfn) )
+        if ( is_xen_heap_mfn(mfn_x(prev_mfn)) )
             /* Xen heap frames are simply unhooked from this phys slot */
-            guest_physmap_remove_page(tdom, gpfn, prev_mfn, 0);
+            guest_physmap_remove_page(tdom, _gfn(gpfn), prev_mfn, 0);
         else
             /* Normal domain memory is freed, to avoid leaking memory. */
             guest_remove_page(tdom, gpfn);
@@ -2859,11 +2865,11 @@  int p2m_add_foreign(struct domain *tdom, unsigned long fgfn,
      * will update the m2p table which will result in  mfn -> gpfn of dom0
      * and not fgfn of domU.
      */
-    rc = set_foreign_p2m_entry(tdom, gpfn, _mfn(mfn));
+    rc = set_foreign_p2m_entry(tdom, gpfn, mfn);
     if ( rc )
         gdprintk(XENLOG_WARNING, "set_foreign_p2m_entry failed. "
                  "gpfn:%lx mfn:%lx fgfn:%lx td:%d fd:%d\n",
-                 gpfn, mfn, fgfn, tdom->domain_id, fdom->domain_id);
+                 gpfn, mfn_x(mfn), fgfn, tdom->domain_id, fdom->domain_id);
 
     put_page(page);
 
diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
index 3c304f4..3f15543 100644
--- a/xen/common/grant_table.c
+++ b/xen/common/grant_table.c
@@ -1818,7 +1818,7 @@  gnttab_transfer(
             goto copyback;
         }
 
-        guest_physmap_remove_page(d, gop.mfn, mfn, 0);
+        guest_physmap_remove_page(d, _gfn(gop.mfn), _mfn(mfn), 0);
         gnttab_flush_tlb(d);
 
         /* Find the target domain. */
@@ -1946,7 +1946,7 @@  gnttab_transfer(
         {
             grant_entry_v1_t *sha = &shared_entry_v1(e->grant_table, gop.ref);
 
-            guest_physmap_add_page(e, sha->frame, mfn, 0);
+            guest_physmap_add_page(e, _gfn(sha->frame), _mfn(mfn), 0);
             if ( !paging_mode_translate(e) )
                 sha->frame = mfn;
         }
@@ -1954,7 +1954,8 @@  gnttab_transfer(
         {
             grant_entry_v2_t *sha = &shared_entry_v2(e->grant_table, gop.ref);
 
-            guest_physmap_add_page(e, sha->full_page.frame, mfn, 0);
+            guest_physmap_add_page(e, _gfn(sha->full_page.frame),
+                                   _mfn(mfn), 0);
             if ( !paging_mode_translate(e) )
                 sha->full_page.frame = mfn;
         }
diff --git a/xen/common/memory.c b/xen/common/memory.c
index b54b076..a8a75e0 100644
--- a/xen/common/memory.c
+++ b/xen/common/memory.c
@@ -213,7 +213,7 @@  static void populate_physmap(struct memop_args *a)
                 mfn = page_to_mfn(page);
             }
 
-            guest_physmap_add_page(d, gpfn, mfn, a->extent_order);
+            guest_physmap_add_page(d, _gfn(gpfn), _mfn(mfn), a->extent_order);
 
             if ( !paging_mode_translate(d) )
             {
@@ -237,20 +237,20 @@  int guest_remove_page(struct domain *d, unsigned long gmfn)
 #ifdef CONFIG_X86
     p2m_type_t p2mt;
 #endif
-    unsigned long mfn;
+    mfn_t mfn;
 
 #ifdef CONFIG_X86
-    mfn = mfn_x(get_gfn_query(d, gmfn, &p2mt)); 
+    mfn = get_gfn_query(d, gmfn, &p2mt);
     if ( unlikely(p2m_is_paging(p2mt)) )
     {
-        guest_physmap_remove_page(d, gmfn, mfn, 0);
+        guest_physmap_remove_page(d, _gfn(gmfn), mfn, 0);
         put_gfn(d, gmfn);
         /* If the page hasn't yet been paged out, there is an
          * actual page that needs to be released. */
         if ( p2mt == p2m_ram_paging_out )
         {
-            ASSERT(mfn_valid(mfn));
-            page = mfn_to_page(mfn);
+            ASSERT(mfn_valid(mfn_x(mfn)));
+            page = mfn_to_page(mfn_x(mfn));
             if ( test_and_clear_bit(_PGC_allocated, &page->count_info) )
                 put_page(page);
         }
@@ -259,14 +259,14 @@  int guest_remove_page(struct domain *d, unsigned long gmfn)
     }
     if ( p2mt == p2m_mmio_direct )
     {
-        clear_mmio_p2m_entry(d, gmfn, _mfn(mfn), 0);
+        clear_mmio_p2m_entry(d, gmfn, mfn, 0);
         put_gfn(d, gmfn);
         return 1;
     }
 #else
-    mfn = mfn_x(gfn_to_mfn(d, _gfn(gmfn)));
+    mfn = gfn_to_mfn(d, _gfn(gmfn));
 #endif
-    if ( unlikely(!mfn_valid(mfn)) )
+    if ( unlikely(!mfn_valid(mfn_x(mfn))) )
     {
         put_gfn(d, gmfn);
         gdprintk(XENLOG_INFO, "Domain %u page number %lx invalid\n",
@@ -288,12 +288,12 @@  int guest_remove_page(struct domain *d, unsigned long gmfn)
             return 0;
         }
         /* Maybe the mfn changed */
-        mfn = mfn_x(get_gfn_query_unlocked(d, gmfn, &p2mt));
+        mfn = get_gfn_query_unlocked(d, gmfn, &p2mt);
         ASSERT(!p2m_is_shared(p2mt));
     }
 #endif /* CONFIG_X86 */
 
-    page = mfn_to_page(mfn);
+    page = mfn_to_page(mfn_x(mfn));
     if ( unlikely(!get_page(page, d)) )
     {
         put_gfn(d, gmfn);
@@ -316,7 +316,7 @@  int guest_remove_page(struct domain *d, unsigned long gmfn)
          test_and_clear_bit(_PGC_allocated, &page->count_info) )
         put_page(page);
 
-    guest_physmap_remove_page(d, gmfn, mfn, 0);
+    guest_physmap_remove_page(d, _gfn(gmfn), mfn, 0);
 
     put_page(page);
     put_gfn(d, gmfn);
@@ -540,7 +540,7 @@  static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
             gfn = mfn_to_gmfn(d, mfn);
             /* Pages were unshared above */
             BUG_ON(SHARED_M2P(gfn));
-            guest_physmap_remove_page(d, gfn, mfn, 0);
+            guest_physmap_remove_page(d, _gfn(gfn), _mfn(mfn), 0);
             put_page(page);
         }
 
@@ -584,7 +584,8 @@  static long memory_exchange(XEN_GUEST_HANDLE_PARAM(xen_memory_exchange_t) arg)
             }
 
             mfn = page_to_mfn(page);
-            guest_physmap_add_page(d, gpfn, mfn, exch.out.extent_order);
+            guest_physmap_add_page(d, _gfn(gpfn), _mfn(mfn),
+                                   exch.out.extent_order);
 
             if ( !paging_mode_translate(d) )
             {
@@ -1095,7 +1096,8 @@  long do_memory_op(unsigned long cmd, XEN_GUEST_HANDLE_PARAM(void) arg)
         page = get_page_from_gfn(d, xrfp.gpfn, NULL, P2M_ALLOC);
         if ( page )
         {
-            guest_physmap_remove_page(d, xrfp.gpfn, page_to_mfn(page), 0);
+            guest_physmap_remove_page(d, _gfn(xrfp.gpfn),
+                                      _mfn(page_to_mfn(page)), 0);
             put_page(page);
         }
         else
diff --git a/xen/drivers/passthrough/arm/smmu.c b/xen/drivers/passthrough/arm/smmu.c
index 8a4b123..cf8b8b8 100644
--- a/xen/drivers/passthrough/arm/smmu.c
+++ b/xen/drivers/passthrough/arm/smmu.c
@@ -2774,7 +2774,7 @@  static int __must_check arm_smmu_map_page(struct domain *d, unsigned long gfn,
 	 * The function guest_physmap_add_entry replaces the current mapping
 	 * if there is already one...
 	 */
-	return guest_physmap_add_entry(d, gfn, mfn, 0, t);
+	return guest_physmap_add_entry(d, _gfn(gfn), _mfn(mfn), 0, t);
 }
 
 static int __must_check arm_smmu_unmap_page(struct domain *d, unsigned long gfn)
@@ -2786,7 +2786,7 @@  static int __must_check arm_smmu_unmap_page(struct domain *d, unsigned long gfn)
 	if ( !is_domain_direct_mapped(d) )
 		return -EINVAL;
 
-	guest_physmap_remove_page(d, gfn, gfn, 0);
+	guest_physmap_remove_page(d, _gfn(gfn), _mfn(gfn), 0);
 
 	return 0;
 }
diff --git a/xen/include/asm-arm/p2m.h b/xen/include/asm-arm/p2m.h
index 75c65a8..0d1e61e 100644
--- a/xen/include/asm-arm/p2m.h
+++ b/xen/include/asm-arm/p2m.h
@@ -160,23 +160,23 @@  int map_dev_mmio_region(struct domain *d,
                         unsigned long mfn);
 
 int guest_physmap_add_entry(struct domain *d,
-                            unsigned long gfn,
-                            unsigned long mfn,
+                            gfn_t gfn,
+                            mfn_t mfn,
                             unsigned long page_order,
                             p2m_type_t t);
 
 /* Untyped version for RAM only, for compatibility */
 static inline int guest_physmap_add_page(struct domain *d,
-                                         unsigned long gfn,
-                                         unsigned long mfn,
+                                         gfn_t gfn,
+                                         mfn_t mfn,
                                          unsigned int page_order)
 {
     return guest_physmap_add_entry(d, gfn, mfn, page_order, p2m_ram_rw);
 }
 
 void guest_physmap_remove_page(struct domain *d,
-                               unsigned long gpfn,
-                               unsigned long mfn, unsigned int page_order);
+                               gfn_t gfn,
+                               mfn_t mfn, unsigned int page_order);
 
 mfn_t gfn_to_mfn(struct domain *d, gfn_t gfn);
 
diff --git a/xen/include/asm-x86/p2m.h b/xen/include/asm-x86/p2m.h
index 65675a2..4ab3574 100644
--- a/xen/include/asm-x86/p2m.h
+++ b/xen/include/asm-x86/p2m.h
@@ -545,14 +545,14 @@  void p2m_teardown(struct p2m_domain *p2m);
 void p2m_final_teardown(struct domain *d);
 
 /* Add a page to a domain's p2m table */
-int guest_physmap_add_entry(struct domain *d, unsigned long gfn,
-                            unsigned long mfn, unsigned int page_order, 
+int guest_physmap_add_entry(struct domain *d, gfn_t gfn,
+                            mfn_t mfn, unsigned int page_order,
                             p2m_type_t t);
 
 /* Untyped version for RAM only, for compatibility */
 static inline int guest_physmap_add_page(struct domain *d,
-                                         unsigned long gfn,
-                                         unsigned long mfn,
+                                         gfn_t gfn,
+                                         mfn_t mfn,
                                          unsigned int page_order)
 {
     return guest_physmap_add_entry(d, gfn, mfn, page_order, p2m_ram_rw);
@@ -560,8 +560,7 @@  static inline int guest_physmap_add_page(struct domain *d,
 
 /* Remove a page from a domain's p2m table */
 int guest_physmap_remove_page(struct domain *d,
-                              unsigned long gfn,
-                              unsigned long mfn, unsigned int page_order);
+                              gfn_t gfn, mfn_t mfn, unsigned int page_order);
 
 /* Set a p2m range as populate-on-demand */
 int guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
index 13f706e..b62f473 100644
--- a/xen/include/xen/mm.h
+++ b/xen/include/xen/mm.h
@@ -552,7 +552,7 @@  int xenmem_add_to_physmap_one(struct domain *d, unsigned int space,
 
 /* Returns 1 on success, 0 on error, negative if the ring
  * for event propagation is full in the presence of paging */
-int guest_remove_page(struct domain *d, unsigned long gmfn);
+int guest_remove_page(struct domain *d, unsigned long gfn);
 
 #define RAM_TYPE_CONVENTIONAL 0x00000001
 #define RAM_TYPE_RESERVED     0x00000002