xen-devel.lists.xenproject.org archive mirror
 help / color / mirror / Atom feed
From: Stefano Stabellini <sstabellini@kernel.org>
To: Julien Grall <julien.grall@arm.com>
Cc: Kevin Tian <kevin.tian@intel.com>,
	sstabellini@kernel.org, Jun Nakajima <jun.nakajima@intel.com>,
	George Dunlap <george.dunlap@eu.citrix.com>,
	Liu Jinsong <jinsong.liu@alibaba-inc.com>,
	Christoph Egger <chegger@amazon.de>, Tim Deegan <tim@xen.org>,
	xen-devel@lists.xen.org, Paul Durrant <paul.durrant@citrix.com>,
	Jan Beulich <jbeulich@suse.com>,
	Andrew Cooper <andrew.cooper3@citrix.com>,
	Mukesh Rathor <mukesh.rathor@oracle.com>
Subject: Re: [PATCH v5 06/17] xen: Use a typesafe to define INVALID_MFN
Date: Wed, 6 Jul 2016 11:27:34 +0100 (BST)	[thread overview]
Message-ID: <alpine.DEB.2.10.1607061127130.2575@sstabellini-ThinkPad-X260> (raw)
In-Reply-To: <1467130643-23868-7-git-send-email-julien.grall@arm.com>

On Tue, 28 Jun 2016, Julien Grall wrote:
> Also take the opportunity to convert arch/x86/debug.c to the typesafe
> mfn.
> 
> Signed-off-by: Julien Grall <julien.grall@arm.com>
> 
> ---
> Cc: Christoph Egger <chegger@amazon.de>
> Cc: Liu Jinsong <jinsong.liu@alibaba-inc.com>
> Cc: Jan Beulich <jbeulich@suse.com>
> Cc: Andrew Cooper <andrew.cooper3@citrix.com>
> Cc: Mukesh Rathor <mukesh.rathor@oracle.com>
> Cc: Paul Durrant <paul.durrant@citrix.com>
> Cc: Jun Nakajima <jun.nakajima@intel.com>
> Cc: Kevin Tian <kevin.tian@intel.com>
> Cc: George Dunlap <george.dunlap@eu.citrix.com>
> Cc: Tim Deegan <tim@xen.org>
> 
>     Changes in v5:
>         - Patch added
> ---
>  xen/arch/arm/p2m.c              |  4 ++--

For the ARM bits:

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



>  xen/arch/x86/cpu/mcheck/mce.c   |  2 +-
>  xen/arch/x86/debug.c            | 50 ++++++++++++++++++++-------------------
>  xen/arch/x86/hvm/hvm.c          |  6 ++---
>  xen/arch/x86/hvm/viridian.c     |  6 ++---
>  xen/arch/x86/hvm/vmx/vmx.c      |  2 +-
>  xen/arch/x86/mm/guest_walk.c    |  4 ++--
>  xen/arch/x86/mm/hap/hap.c       |  4 ++--
>  xen/arch/x86/mm/p2m-ept.c       |  6 ++---
>  xen/arch/x86/mm/p2m-pod.c       | 18 +++++++-------
>  xen/arch/x86/mm/p2m-pt.c        | 18 +++++++-------
>  xen/arch/x86/mm/p2m.c           | 52 ++++++++++++++++++++---------------------
>  xen/arch/x86/mm/paging.c        | 12 +++++-----
>  xen/arch/x86/mm/shadow/common.c | 44 +++++++++++++++++-----------------
>  xen/arch/x86/mm/shadow/multi.c  | 36 ++++++++++++++--------------
>  xen/common/domain.c             |  6 ++---
>  xen/common/grant_table.c        |  6 ++---
>  xen/include/xen/mm.h            |  2 +-
>  18 files changed, 140 insertions(+), 138 deletions(-)
> 
> diff --git a/xen/arch/arm/p2m.c b/xen/arch/arm/p2m.c
> index 34563bb..d690602 100644
> --- a/xen/arch/arm/p2m.c
> +++ b/xen/arch/arm/p2m.c
> @@ -1461,7 +1461,7 @@ int relinquish_p2m_mapping(struct domain *d)
>      return apply_p2m_changes(d, RELINQUISH,
>                                pfn_to_paddr(p2m->lowest_mapped_gfn),
>                                pfn_to_paddr(p2m->max_mapped_gfn),
> -                              pfn_to_paddr(INVALID_MFN),
> +                              pfn_to_paddr(mfn_x(INVALID_MFN)),
>                                MATTR_MEM, 0, p2m_invalid,
>                                d->arch.p2m.default_access);
>  }
> @@ -1476,7 +1476,7 @@ int p2m_cache_flush(struct domain *d, xen_pfn_t start_mfn, xen_pfn_t end_mfn)
>      return apply_p2m_changes(d, CACHEFLUSH,
>                               pfn_to_paddr(start_mfn),
>                               pfn_to_paddr(end_mfn),
> -                             pfn_to_paddr(INVALID_MFN),
> +                             pfn_to_paddr(mfn_x(INVALID_MFN)),
>                               MATTR_MEM, 0, p2m_invalid,
>                               d->arch.p2m.default_access);
>  }
> diff --git a/xen/arch/x86/cpu/mcheck/mce.c b/xen/arch/x86/cpu/mcheck/mce.c
> index edcbe48..2695b0c 100644
> --- a/xen/arch/x86/cpu/mcheck/mce.c
> +++ b/xen/arch/x86/cpu/mcheck/mce.c
> @@ -1455,7 +1455,7 @@ long do_mca(XEN_GUEST_HANDLE_PARAM(xen_mc_t) u_xen_mc)
>                  gfn = PFN_DOWN(gaddr);
>                  mfn = mfn_x(get_gfn(d, gfn, &t));
>  
> -                if ( mfn == INVALID_MFN )
> +                if ( mfn == mfn_x(INVALID_MFN) )
>                  {
>                      put_gfn(d, gfn);
>                      put_domain(d);
> diff --git a/xen/arch/x86/debug.c b/xen/arch/x86/debug.c
> index 58cae22..3479f7c 100644
> --- a/xen/arch/x86/debug.c
> +++ b/xen/arch/x86/debug.c
> @@ -43,11 +43,11 @@ typedef unsigned long dbgva_t;
>  typedef unsigned char dbgbyte_t;
>  
>  /* Returns: mfn for the given (hvm guest) vaddr */
> -static unsigned long 
> +static mfn_t
>  dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr,
>                  unsigned long *gfn)
>  {
> -    unsigned long mfn;
> +    mfn_t mfn;
>      uint32_t pfec = PFEC_page_present;
>      p2m_type_t gfntype;
>  
> @@ -60,16 +60,17 @@ dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr,
>          return INVALID_MFN;
>      }
>  
> -    mfn = mfn_x(get_gfn(dp, *gfn, &gfntype)); 
> +    mfn = get_gfn(dp, *gfn, &gfntype);
>      if ( p2m_is_readonly(gfntype) && toaddr )
>      {
>          DBGP2("kdb:p2m_is_readonly: gfntype:%x\n", gfntype);
>          mfn = INVALID_MFN;
>      }
>      else
> -        DBGP2("X: vaddr:%lx domid:%d mfn:%lx\n", vaddr, dp->domain_id, mfn);
> +        DBGP2("X: vaddr:%lx domid:%d mfn:%lx\n",
> +              vaddr, dp->domain_id, mfn_x(mfn));
>  
> -    if ( mfn == INVALID_MFN )
> +    if ( mfn_eq(mfn, INVALID_MFN) )
>      {
>          put_gfn(dp, *gfn);
>          *gfn = INVALID_GFN;
> @@ -91,7 +92,7 @@ dbg_hvm_va2mfn(dbgva_t vaddr, struct domain *dp, int toaddr,
>   *       mode.
>   * Returns: mfn for the given (pv guest) vaddr 
>   */
> -static unsigned long 
> +static mfn_t
>  dbg_pv_va2mfn(dbgva_t vaddr, struct domain *dp, uint64_t pgd3val)
>  {
>      l4_pgentry_t l4e, *l4t;
> @@ -99,31 +100,31 @@ dbg_pv_va2mfn(dbgva_t vaddr, struct domain *dp, uint64_t pgd3val)
>      l2_pgentry_t l2e, *l2t;
>      l1_pgentry_t l1e, *l1t;
>      unsigned long cr3 = (pgd3val ? pgd3val : dp->vcpu[0]->arch.cr3);
> -    unsigned long mfn = cr3 >> PAGE_SHIFT;
> +    mfn_t mfn = _mfn(cr3 >> PAGE_SHIFT);
>  
>      DBGP2("vaddr:%lx domid:%d cr3:%lx pgd3:%lx\n", vaddr, dp->domain_id, 
>            cr3, pgd3val);
>  
>      if ( pgd3val == 0 )
>      {
> -        l4t = map_domain_page(_mfn(mfn));
> +        l4t = map_domain_page(mfn);
>          l4e = l4t[l4_table_offset(vaddr)];
>          unmap_domain_page(l4t);
> -        mfn = l4e_get_pfn(l4e);
> +        mfn = _mfn(l4e_get_pfn(l4e));
>          DBGP2("l4t:%p l4to:%lx l4e:%lx mfn:%lx\n", l4t, 
> -              l4_table_offset(vaddr), l4e, mfn);
> +              l4_table_offset(vaddr), l4e, mfn_x(mfn));
>          if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) )
>          {
>              DBGP1("l4 PAGE not present. vaddr:%lx cr3:%lx\n", vaddr, cr3);
>              return INVALID_MFN;
>          }
>  
> -        l3t = map_domain_page(_mfn(mfn));
> +        l3t = map_domain_page(mfn);
>          l3e = l3t[l3_table_offset(vaddr)];
>          unmap_domain_page(l3t);
> -        mfn = l3e_get_pfn(l3e);
> +        mfn = _mfn(l3e_get_pfn(l3e));
>          DBGP2("l3t:%p l3to:%lx l3e:%lx mfn:%lx\n", l3t, 
> -              l3_table_offset(vaddr), l3e, mfn);
> +              l3_table_offset(vaddr), l3e, mfn_x(mfn));
>          if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) ||
>               (l3e_get_flags(l3e) & _PAGE_PSE) )
>          {
> @@ -132,26 +133,26 @@ dbg_pv_va2mfn(dbgva_t vaddr, struct domain *dp, uint64_t pgd3val)
>          }
>      }
>  
> -    l2t = map_domain_page(_mfn(mfn));
> +    l2t = map_domain_page(mfn);
>      l2e = l2t[l2_table_offset(vaddr)];
>      unmap_domain_page(l2t);
> -    mfn = l2e_get_pfn(l2e);
> +    mfn = _mfn(l2e_get_pfn(l2e));
>      DBGP2("l2t:%p l2to:%lx l2e:%lx mfn:%lx\n", l2t, l2_table_offset(vaddr),
> -          l2e, mfn);
> +          l2e, mfn_x(mfn));
>      if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) ||
>           (l2e_get_flags(l2e) & _PAGE_PSE) )
>      {
>          DBGP1("l2 PAGE not present. vaddr:%lx cr3:%lx\n", vaddr, cr3);
>          return INVALID_MFN;
>      }
> -    l1t = map_domain_page(_mfn(mfn));
> +    l1t = map_domain_page(mfn);
>      l1e = l1t[l1_table_offset(vaddr)];
>      unmap_domain_page(l1t);
> -    mfn = l1e_get_pfn(l1e);
> +    mfn = _mfn(l1e_get_pfn(l1e));
>      DBGP2("l1t:%p l1to:%lx l1e:%lx mfn:%lx\n", l1t, l1_table_offset(vaddr),
> -          l1e, mfn);
> +          l1e, mfn_x(mfn));
>  
> -    return mfn_valid(mfn) ? mfn : INVALID_MFN;
> +    return mfn_valid(mfn_x(mfn)) ? mfn : INVALID_MFN;
>  }
>  
>  /* Returns: number of bytes remaining to be copied */
> @@ -163,23 +164,24 @@ unsigned int dbg_rw_guest_mem(struct domain *dp, void * __user gaddr,
>      {
>          char *va;
>          unsigned long addr = (unsigned long)gaddr;
> -        unsigned long mfn, gfn = INVALID_GFN, pagecnt;
> +        mfn_t mfn;
> +        unsigned long gfn = INVALID_GFN, pagecnt;
>  
>          pagecnt = min_t(long, PAGE_SIZE - (addr & ~PAGE_MASK), len);
>  
>          mfn = (has_hvm_container_domain(dp)
>                 ? dbg_hvm_va2mfn(addr, dp, toaddr, &gfn)
>                 : dbg_pv_va2mfn(addr, dp, pgd3));
> -        if ( mfn == INVALID_MFN ) 
> +        if ( mfn_eq(mfn, INVALID_MFN) )
>              break;
>  
> -        va = map_domain_page(_mfn(mfn));
> +        va = map_domain_page(mfn);
>          va = va + (addr & (PAGE_SIZE-1));
>  
>          if ( toaddr )
>          {
>              copy_from_user(va, buf, pagecnt);    /* va = buf */
> -            paging_mark_dirty(dp, mfn);
> +            paging_mark_dirty(dp, mfn_x(mfn));
>          }
>          else
>          {
> diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c
> index c89ab6e..a929e3b 100644
> --- a/xen/arch/x86/hvm/hvm.c
> +++ b/xen/arch/x86/hvm/hvm.c
> @@ -1796,7 +1796,7 @@ int hvm_hap_nested_page_fault(paddr_t gpa, unsigned long gla,
>          p2m = hostp2m;
>  
>      /* Check access permissions first, then handle faults */
> -    if ( mfn_x(mfn) != INVALID_MFN )
> +    if ( !mfn_eq(mfn, INVALID_MFN) )
>      {
>          bool_t violation;
>  
> @@ -5299,8 +5299,8 @@ static int do_altp2m_op(
>              rc = -EINVAL;
>  
>          if ( (gfn_x(vcpu_altp2m(curr).veinfo_gfn) != INVALID_GFN) ||
> -             (mfn_x(get_gfn_query_unlocked(curr->domain,
> -                    a.u.enable_notify.gfn, &p2mt)) == INVALID_MFN) )
> +             (mfn_eq(get_gfn_query_unlocked(curr->domain,
> +                     a.u.enable_notify.gfn, &p2mt), INVALID_MFN)) )
>              return -EINVAL;
>  
>          vcpu_altp2m(curr).veinfo_gfn = _gfn(a.u.enable_notify.gfn);
> diff --git a/xen/arch/x86/hvm/viridian.c b/xen/arch/x86/hvm/viridian.c
> index 8253fd0..575acdd 100644
> --- a/xen/arch/x86/hvm/viridian.c
> +++ b/xen/arch/x86/hvm/viridian.c
> @@ -196,7 +196,7 @@ static void enable_hypercall_page(struct domain *d)
>          if ( page )
>              put_page(page);
>          gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
> -                 page ? page_to_mfn(page) : INVALID_MFN);
> +                 page ? page_to_mfn(page) : mfn_x(INVALID_MFN));
>          return;
>      }
>  
> @@ -269,7 +269,7 @@ static void initialize_apic_assist(struct vcpu *v)
>  
>   fail:
>      gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
> -             page ? page_to_mfn(page) : INVALID_MFN);
> +             page ? page_to_mfn(page) : mfn_x(INVALID_MFN));
>  }
>  
>  static void teardown_apic_assist(struct vcpu *v)
> @@ -349,7 +349,7 @@ static void update_reference_tsc(struct domain *d, bool_t initialize)
>          if ( page )
>              put_page(page);
>          gdprintk(XENLOG_WARNING, "Bad GMFN %lx (MFN %lx)\n", gmfn,
> -                 page ? page_to_mfn(page) : INVALID_MFN);
> +                 page ? page_to_mfn(page) : mfn_x(INVALID_MFN));
>          return;
>      }
>  
> diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c
> index 9d4121e..888a6b1 100644
> --- a/xen/arch/x86/hvm/vmx/vmx.c
> +++ b/xen/arch/x86/hvm/vmx/vmx.c
> @@ -2025,7 +2025,7 @@ static void vmx_vcpu_update_vmfunc_ve(struct vcpu *v)
>  
>              mfn = get_gfn_query_unlocked(d, gfn_x(vcpu_altp2m(v).veinfo_gfn), &t);
>  
> -            if ( mfn_x(mfn) != INVALID_MFN )
> +            if ( !mfn_eq(mfn, INVALID_MFN) )
>                  __vmwrite(VIRT_EXCEPTION_INFO, mfn_x(mfn) << PAGE_SHIFT);
>              else
>                  v->arch.hvm_vmx.secondary_exec_control &=
> diff --git a/xen/arch/x86/mm/guest_walk.c b/xen/arch/x86/mm/guest_walk.c
> index e850502..868e909 100644
> --- a/xen/arch/x86/mm/guest_walk.c
> +++ b/xen/arch/x86/mm/guest_walk.c
> @@ -281,7 +281,7 @@ guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
>          start = _gfn((gfn_x(start) & ~GUEST_L3_GFN_MASK) +
>                       ((va >> PAGE_SHIFT) & GUEST_L3_GFN_MASK));
>          gw->l1e = guest_l1e_from_gfn(start, flags);
> -        gw->l2mfn = gw->l1mfn = _mfn(INVALID_MFN);
> +        gw->l2mfn = gw->l1mfn = INVALID_MFN;
>          goto set_ad;
>      }
>  
> @@ -356,7 +356,7 @@ guest_walk_tables(struct vcpu *v, struct p2m_domain *p2m,
>          start = _gfn((gfn_x(start) & ~GUEST_L2_GFN_MASK) +
>                       guest_l1_table_offset(va));
>          gw->l1e = guest_l1e_from_gfn(start, flags);
> -        gw->l1mfn = _mfn(INVALID_MFN);
> +        gw->l1mfn = INVALID_MFN;
>      } 
>      else 
>      {
> diff --git a/xen/arch/x86/mm/hap/hap.c b/xen/arch/x86/mm/hap/hap.c
> index 9c2cd49..3218fa2 100644
> --- a/xen/arch/x86/mm/hap/hap.c
> +++ b/xen/arch/x86/mm/hap/hap.c
> @@ -430,7 +430,7 @@ static mfn_t hap_make_monitor_table(struct vcpu *v)
>   oom:
>      HAP_ERROR("out of memory building monitor pagetable\n");
>      domain_crash(d);
> -    return _mfn(INVALID_MFN);
> +    return INVALID_MFN;
>  }
>  
>  static void hap_destroy_monitor_table(struct vcpu* v, mfn_t mmfn)
> @@ -509,7 +509,7 @@ int hap_enable(struct domain *d, u32 mode)
>          }
>  
>          for ( i = 0; i < MAX_EPTP; i++ )
> -            d->arch.altp2m_eptp[i] = INVALID_MFN;
> +            d->arch.altp2m_eptp[i] = mfn_x(INVALID_MFN);
>  
>          for ( i = 0; i < MAX_ALTP2M; i++ )
>          {
> diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
> index 7166c71..6d03736 100644
> --- a/xen/arch/x86/mm/p2m-ept.c
> +++ b/xen/arch/x86/mm/p2m-ept.c
> @@ -50,7 +50,7 @@ static int atomic_write_ept_entry(ept_entry_t *entryptr, ept_entry_t new,
>                                    int level)
>  {
>      int rc;
> -    unsigned long oldmfn = INVALID_MFN;
> +    unsigned long oldmfn = mfn_x(INVALID_MFN);
>      bool_t check_foreign = (new.mfn != entryptr->mfn ||
>                              new.sa_p2mt != entryptr->sa_p2mt);
>  
> @@ -91,7 +91,7 @@ static int atomic_write_ept_entry(ept_entry_t *entryptr, ept_entry_t new,
>  
>      write_atomic(&entryptr->epte, new.epte);
>  
> -    if ( unlikely(oldmfn != INVALID_MFN) )
> +    if ( unlikely(oldmfn != mfn_x(INVALID_MFN)) )
>          put_page(mfn_to_page(oldmfn));
>  
>      rc = 0;
> @@ -887,7 +887,7 @@ static mfn_t ept_get_entry(struct p2m_domain *p2m,
>      int i;
>      int ret = 0;
>      bool_t recalc = 0;
> -    mfn_t mfn = _mfn(INVALID_MFN);
> +    mfn_t mfn = INVALID_MFN;
>      struct ept_data *ept = &p2m->ept;
>  
>      *t = p2m_mmio_dm;
> diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c
> index b7ab169..f384589 100644
> --- a/xen/arch/x86/mm/p2m-pod.c
> +++ b/xen/arch/x86/mm/p2m-pod.c
> @@ -559,7 +559,7 @@ p2m_pod_decrease_reservation(struct domain *d,
>      {
>          /* All PoD: Mark the whole region invalid and tell caller
>           * we're done. */
> -        p2m_set_entry(p2m, gpfn, _mfn(INVALID_MFN), order, p2m_invalid,
> +        p2m_set_entry(p2m, gpfn, INVALID_MFN, order, p2m_invalid,
>                        p2m->default_access);
>          p2m->pod.entry_count-=(1<<order);
>          BUG_ON(p2m->pod.entry_count < 0);
> @@ -602,7 +602,7 @@ p2m_pod_decrease_reservation(struct domain *d,
>          n = 1UL << cur_order;
>          if ( t == p2m_populate_on_demand )
>          {
> -            p2m_set_entry(p2m, gpfn + i, _mfn(INVALID_MFN), cur_order,
> +            p2m_set_entry(p2m, gpfn + i, INVALID_MFN, cur_order,
>                            p2m_invalid, p2m->default_access);
>              p2m->pod.entry_count -= n;
>              BUG_ON(p2m->pod.entry_count < 0);
> @@ -624,7 +624,7 @@ p2m_pod_decrease_reservation(struct domain *d,
>  
>              page = mfn_to_page(mfn);
>  
> -            p2m_set_entry(p2m, gpfn + i, _mfn(INVALID_MFN), cur_order,
> +            p2m_set_entry(p2m, gpfn + i, INVALID_MFN, cur_order,
>                            p2m_invalid, p2m->default_access);
>              p2m_tlb_flush_sync(p2m);
>              for ( j = 0; j < n; ++j )
> @@ -671,7 +671,7 @@ void p2m_pod_dump_data(struct domain *d)
>  static int
>  p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long gfn)
>  {
> -    mfn_t mfn, mfn0 = _mfn(INVALID_MFN);
> +    mfn_t mfn, mfn0 = INVALID_MFN;
>      p2m_type_t type, type0 = 0;
>      unsigned long * map = NULL;
>      int ret=0, reset = 0;
> @@ -754,7 +754,7 @@ p2m_pod_zero_check_superpage(struct p2m_domain *p2m, unsigned long gfn)
>      }
>  
>      /* Try to remove the page, restoring old mapping if it fails. */
> -    p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_2M,
> +    p2m_set_entry(p2m, gfn, INVALID_MFN, PAGE_ORDER_2M,
>                    p2m_populate_on_demand, p2m->default_access);
>      p2m_tlb_flush_sync(p2m);
>  
> @@ -871,7 +871,7 @@ p2m_pod_zero_check(struct p2m_domain *p2m, unsigned long *gfns, int count)
>          }
>  
>          /* Try to remove the page, restoring old mapping if it fails. */
> -        p2m_set_entry(p2m, gfns[i], _mfn(INVALID_MFN), PAGE_ORDER_4K,
> +        p2m_set_entry(p2m, gfns[i], INVALID_MFN, PAGE_ORDER_4K,
>                        p2m_populate_on_demand, p2m->default_access);
>  
>          /* See if the page was successfully unmapped.  (Allow one refcount
> @@ -1073,7 +1073,7 @@ p2m_pod_demand_populate(struct p2m_domain *p2m, unsigned long gfn,
>           * NOTE: In a fine-grained p2m locking scenario this operation
>           * may need to promote its locking from gfn->1g superpage
>           */
> -        p2m_set_entry(p2m, gfn_aligned, _mfn(INVALID_MFN), PAGE_ORDER_2M,
> +        p2m_set_entry(p2m, gfn_aligned, INVALID_MFN, PAGE_ORDER_2M,
>                        p2m_populate_on_demand, p2m->default_access);
>          return 0;
>      }
> @@ -1157,7 +1157,7 @@ remap_and_retry:
>       * need promoting the gfn lock from gfn->2M superpage */
>      gfn_aligned = (gfn>>order)<<order;
>      for(i=0; i<(1<<order); i++)
> -        p2m_set_entry(p2m, gfn_aligned + i, _mfn(INVALID_MFN), PAGE_ORDER_4K,
> +        p2m_set_entry(p2m, gfn_aligned + i, INVALID_MFN, PAGE_ORDER_4K,
>                        p2m_populate_on_demand, p2m->default_access);
>      if ( tb_init_done )
>      {
> @@ -1215,7 +1215,7 @@ guest_physmap_mark_populate_on_demand(struct domain *d, unsigned long gfn,
>      }
>  
>      /* Now, actually do the two-way mapping */
> -    rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), order,
> +    rc = p2m_set_entry(p2m, gfn, INVALID_MFN, order,
>                         p2m_populate_on_demand, p2m->default_access);
>      if ( rc == 0 )
>      {
> diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
> index 4980934..2b6e89e 100644
> --- a/xen/arch/x86/mm/p2m-pt.c
> +++ b/xen/arch/x86/mm/p2m-pt.c
> @@ -511,7 +511,7 @@ p2m_pt_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
>       * the intermediate one might be).
>       */
>      unsigned int flags, iommu_old_flags = 0;
> -    unsigned long old_mfn = INVALID_MFN;
> +    unsigned long old_mfn = mfn_x(INVALID_MFN);
>  
>      ASSERT(sve != 0);
>  
> @@ -764,7 +764,7 @@ p2m_pt_get_entry(struct p2m_domain *p2m, unsigned long gfn,
>                       p2m->max_mapped_pfn )
>                      break;
>          }
> -        return _mfn(INVALID_MFN);
> +        return INVALID_MFN;
>      }
>  
>      mfn = pagetable_get_mfn(p2m_get_pagetable(p2m));
> @@ -777,7 +777,7 @@ p2m_pt_get_entry(struct p2m_domain *p2m, unsigned long gfn,
>          if ( (l4e_get_flags(*l4e) & _PAGE_PRESENT) == 0 )
>          {
>              unmap_domain_page(l4e);
> -            return _mfn(INVALID_MFN);
> +            return INVALID_MFN;
>          }
>          mfn = _mfn(l4e_get_pfn(*l4e));
>          recalc = needs_recalc(l4, *l4e);
> @@ -805,7 +805,7 @@ pod_retry_l3:
>                      *t = p2m_populate_on_demand;
>              }
>              unmap_domain_page(l3e);
> -            return _mfn(INVALID_MFN);
> +            return INVALID_MFN;
>          }
>          if ( flags & _PAGE_PSE )
>          {
> @@ -817,7 +817,7 @@ pod_retry_l3:
>              unmap_domain_page(l3e);
>  
>              ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t));
> -            return (p2m_is_valid(*t)) ? mfn : _mfn(INVALID_MFN);
> +            return (p2m_is_valid(*t)) ? mfn : INVALID_MFN;
>          }
>  
>          mfn = _mfn(l3e_get_pfn(*l3e));
> @@ -846,7 +846,7 @@ pod_retry_l2:
>          }
>      
>          unmap_domain_page(l2e);
> -        return _mfn(INVALID_MFN);
> +        return INVALID_MFN;
>      }
>      if ( flags & _PAGE_PSE )
>      {
> @@ -856,7 +856,7 @@ pod_retry_l2:
>          unmap_domain_page(l2e);
>          
>          ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t));
> -        return (p2m_is_valid(*t)) ? mfn : _mfn(INVALID_MFN);
> +        return (p2m_is_valid(*t)) ? mfn : INVALID_MFN;
>      }
>  
>      mfn = _mfn(l2e_get_pfn(*l2e));
> @@ -885,14 +885,14 @@ pod_retry_l1:
>          }
>      
>          unmap_domain_page(l1e);
> -        return _mfn(INVALID_MFN);
> +        return INVALID_MFN;
>      }
>      mfn = _mfn(l1e_get_pfn(*l1e));
>      *t = recalc_type(recalc || _needs_recalc(flags), l1t, p2m, gfn);
>      unmap_domain_page(l1e);
>  
>      ASSERT(mfn_valid(mfn) || !p2m_is_ram(*t) || p2m_is_paging(*t));
> -    return (p2m_is_valid(*t) || p2m_is_grant(*t)) ? mfn : _mfn(INVALID_MFN);
> +    return (p2m_is_valid(*t) || p2m_is_grant(*t)) ? mfn : INVALID_MFN;
>  }
>  
>  static void p2m_pt_change_entry_type_global(struct p2m_domain *p2m,
> diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
> index 6258a5b..6f90510 100644
> --- a/xen/arch/x86/mm/p2m.c
> +++ b/xen/arch/x86/mm/p2m.c
> @@ -388,7 +388,7 @@ mfn_t __get_gfn_type_access(struct p2m_domain *p2m, unsigned long gfn,
>      if (unlikely((p2m_is_broken(*t))))
>      {
>          /* Return invalid_mfn to avoid caller's access */
> -        mfn = _mfn(INVALID_MFN);
> +        mfn = INVALID_MFN;
>          if ( q & P2M_ALLOC )
>              domain_crash(p2m->domain);
>      }
> @@ -493,7 +493,7 @@ int p2m_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
>              rc = set_rc;
>  
>          gfn += 1ul << order;
> -        if ( mfn_x(mfn) != INVALID_MFN )
> +        if ( !mfn_eq(mfn, INVALID_MFN) )
>              mfn = _mfn(mfn_x(mfn) + (1ul << order));
>          todo -= 1ul << order;
>      }
> @@ -580,7 +580,7 @@ int p2m_alloc_table(struct p2m_domain *p2m)
>  
>      /* Initialise physmap tables for slot zero. Other code assumes this. */
>      p2m->defer_nested_flush = 1;
> -    rc = p2m_set_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K,
> +    rc = p2m_set_entry(p2m, 0, INVALID_MFN, PAGE_ORDER_4K,
>                         p2m_invalid, p2m->default_access);
>      p2m->defer_nested_flush = 0;
>      p2m_unlock(p2m);
> @@ -670,7 +670,7 @@ p2m_remove_page(struct p2m_domain *p2m, unsigned long gfn, unsigned long mfn,
>              ASSERT( !p2m_is_valid(t) || mfn + i == mfn_x(mfn_return) );
>          }
>      }
> -    return p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order, p2m_invalid,
> +    return p2m_set_entry(p2m, gfn, INVALID_MFN, page_order, p2m_invalid,
>                           p2m->default_access);
>  }
>  
> @@ -840,7 +840,7 @@ guest_physmap_add_entry(struct domain *d, gfn_t gfn, mfn_t mfn,
>      {
>          gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n",
>                   gfn_x(gfn), mfn_x(mfn));
> -        rc = p2m_set_entry(p2m, gfn_x(gfn), _mfn(INVALID_MFN), page_order,
> +        rc = p2m_set_entry(p2m, gfn_x(gfn), INVALID_MFN, page_order,
>                             p2m_invalid, p2m->default_access);
>          if ( rc == 0 )
>          {
> @@ -1107,7 +1107,7 @@ int clear_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn,
>      }
>  
>      /* Do not use mfn_valid() here as it will usually fail for MMIO pages. */
> -    if ( (INVALID_MFN == mfn_x(actual_mfn)) || (t != p2m_mmio_direct) )
> +    if ( (mfn_eq(actual_mfn, INVALID_MFN)) || (t != p2m_mmio_direct) )
>      {
>          gdprintk(XENLOG_ERR,
>                   "gfn_to_mfn failed! gfn=%08lx type:%d\n", gfn, t);
> @@ -1117,7 +1117,7 @@ int clear_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn,
>          gdprintk(XENLOG_WARNING,
>                   "no mapping between mfn %08lx and gfn %08lx\n",
>                   mfn_x(mfn), gfn);
> -    rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), order, p2m_invalid,
> +    rc = p2m_set_entry(p2m, gfn, INVALID_MFN, order, p2m_invalid,
>                         p2m->default_access);
>  
>   out:
> @@ -1146,7 +1146,7 @@ int clear_identity_p2m_entry(struct domain *d, unsigned long gfn)
>      mfn = p2m->get_entry(p2m, gfn, &p2mt, &a, 0, NULL, NULL);
>      if ( p2mt == p2m_mmio_direct && mfn_x(mfn) == gfn )
>      {
> -        ret = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K,
> +        ret = p2m_set_entry(p2m, gfn, INVALID_MFN, PAGE_ORDER_4K,
>                              p2m_invalid, p2m->default_access);
>          gfn_unlock(p2m, gfn, 0);
>      }
> @@ -1316,7 +1316,7 @@ int p2m_mem_paging_evict(struct domain *d, unsigned long gfn)
>          put_page(page);
>  
>      /* Remove mapping from p2m table */
> -    ret = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K,
> +    ret = p2m_set_entry(p2m, gfn, INVALID_MFN, PAGE_ORDER_4K,
>                          p2m_ram_paged, a);
>  
>      /* Clear content before returning the page to Xen */
> @@ -1844,7 +1844,7 @@ long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr,
>      if ( altp2m_idx )
>      {
>          if ( altp2m_idx >= MAX_ALTP2M ||
> -             d->arch.altp2m_eptp[altp2m_idx] == INVALID_MFN )
> +             d->arch.altp2m_eptp[altp2m_idx] == mfn_x(INVALID_MFN) )
>              return -EINVAL;
>  
>          ap2m = d->arch.altp2m_p2m[altp2m_idx];
> @@ -1942,7 +1942,7 @@ int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access)
>      mfn = p2m->get_entry(p2m, gfn_x(gfn), &t, &a, 0, NULL, NULL);
>      gfn_unlock(p2m, gfn, 0);
>  
> -    if ( mfn_x(mfn) == INVALID_MFN )
> +    if ( mfn_eq(mfn, INVALID_MFN) )
>          return -ESRCH;
>      
>      if ( (unsigned) a >= ARRAY_SIZE(memaccess) )
> @@ -2288,7 +2288,7 @@ unsigned int p2m_find_altp2m_by_eptp(struct domain *d, uint64_t eptp)
>  
>      for ( i = 0; i < MAX_ALTP2M; i++ )
>      {
> -        if ( d->arch.altp2m_eptp[i] == INVALID_MFN )
> +        if ( d->arch.altp2m_eptp[i] == mfn_x(INVALID_MFN) )
>              continue;
>  
>          p2m = d->arch.altp2m_p2m[i];
> @@ -2315,7 +2315,7 @@ bool_t p2m_switch_vcpu_altp2m_by_id(struct vcpu *v, unsigned int idx)
>  
>      altp2m_list_lock(d);
>  
> -    if ( d->arch.altp2m_eptp[idx] != INVALID_MFN )
> +    if ( d->arch.altp2m_eptp[idx] != mfn_x(INVALID_MFN) )
>      {
>          if ( idx != vcpu_altp2m(v).p2midx )
>          {
> @@ -2359,14 +2359,14 @@ bool_t p2m_altp2m_lazy_copy(struct vcpu *v, paddr_t gpa,
>                                0, &page_order);
>      __put_gfn(*ap2m, gfn_x(gfn));
>  
> -    if ( mfn_x(mfn) != INVALID_MFN )
> +    if ( !mfn_eq(mfn, INVALID_MFN) )
>          return 0;
>  
>      mfn = get_gfn_type_access(hp2m, gfn_x(gfn), &p2mt, &p2ma,
>                                P2M_ALLOC | P2M_UNSHARE, &page_order);
>      __put_gfn(hp2m, gfn_x(gfn));
>  
> -    if ( mfn_x(mfn) == INVALID_MFN )
> +    if ( mfn_eq(mfn, INVALID_MFN) )
>          return 0;
>  
>      p2m_lock(*ap2m);
> @@ -2404,7 +2404,7 @@ void p2m_flush_altp2m(struct domain *d)
>          /* Uninit and reinit ept to force TLB shootdown */
>          ept_p2m_uninit(d->arch.altp2m_p2m[i]);
>          ept_p2m_init(d->arch.altp2m_p2m[i]);
> -        d->arch.altp2m_eptp[i] = INVALID_MFN;
> +        d->arch.altp2m_eptp[i] = mfn_x(INVALID_MFN);
>      }
>  
>      altp2m_list_unlock(d);
> @@ -2431,7 +2431,7 @@ int p2m_init_altp2m_by_id(struct domain *d, unsigned int idx)
>  
>      altp2m_list_lock(d);
>  
> -    if ( d->arch.altp2m_eptp[idx] == INVALID_MFN )
> +    if ( d->arch.altp2m_eptp[idx] == mfn_x(INVALID_MFN) )
>      {
>          p2m_init_altp2m_helper(d, idx);
>          rc = 0;
> @@ -2450,7 +2450,7 @@ int p2m_init_next_altp2m(struct domain *d, uint16_t *idx)
>  
>      for ( i = 0; i < MAX_ALTP2M; i++ )
>      {
> -        if ( d->arch.altp2m_eptp[i] != INVALID_MFN )
> +        if ( d->arch.altp2m_eptp[i] != mfn_x(INVALID_MFN) )
>              continue;
>  
>          p2m_init_altp2m_helper(d, i);
> @@ -2476,7 +2476,7 @@ int p2m_destroy_altp2m_by_id(struct domain *d, unsigned int idx)
>  
>      altp2m_list_lock(d);
>  
> -    if ( d->arch.altp2m_eptp[idx] != INVALID_MFN )
> +    if ( d->arch.altp2m_eptp[idx] != mfn_x(INVALID_MFN) )
>      {
>          p2m = d->arch.altp2m_p2m[idx];
>  
> @@ -2486,7 +2486,7 @@ int p2m_destroy_altp2m_by_id(struct domain *d, unsigned int idx)
>              /* Uninit and reinit ept to force TLB shootdown */
>              ept_p2m_uninit(d->arch.altp2m_p2m[idx]);
>              ept_p2m_init(d->arch.altp2m_p2m[idx]);
> -            d->arch.altp2m_eptp[idx] = INVALID_MFN;
> +            d->arch.altp2m_eptp[idx] = mfn_x(INVALID_MFN);
>              rc = 0;
>          }
>      }
> @@ -2510,7 +2510,7 @@ int p2m_switch_domain_altp2m_by_id(struct domain *d, unsigned int idx)
>  
>      altp2m_list_lock(d);
>  
> -    if ( d->arch.altp2m_eptp[idx] != INVALID_MFN )
> +    if ( d->arch.altp2m_eptp[idx] != mfn_x(INVALID_MFN) )
>      {
>          for_each_vcpu( d, v )
>              if ( idx != vcpu_altp2m(v).p2midx )
> @@ -2541,7 +2541,7 @@ int p2m_change_altp2m_gfn(struct domain *d, unsigned int idx,
>      unsigned int page_order;
>      int rc = -EINVAL;
>  
> -    if ( idx >= MAX_ALTP2M || d->arch.altp2m_eptp[idx] == INVALID_MFN )
> +    if ( idx >= MAX_ALTP2M || d->arch.altp2m_eptp[idx] == mfn_x(INVALID_MFN) )
>          return rc;
>  
>      hp2m = p2m_get_hostp2m(d);
> @@ -2636,14 +2636,14 @@ void p2m_altp2m_propagate_change(struct domain *d, gfn_t gfn,
>  
>      for ( i = 0; i < MAX_ALTP2M; i++ )
>      {
> -        if ( d->arch.altp2m_eptp[i] == INVALID_MFN )
> +        if ( d->arch.altp2m_eptp[i] == mfn_x(INVALID_MFN) )
>              continue;
>  
>          p2m = d->arch.altp2m_p2m[i];
>          m = get_gfn_type_access(p2m, gfn_x(gfn), &t, &a, 0, NULL);
>  
>          /* Check for a dropped page that may impact this altp2m */
> -        if ( mfn_x(mfn) == INVALID_MFN &&
> +        if ( mfn_eq(mfn, INVALID_MFN) &&
>               gfn_x(gfn) >= p2m->min_remapped_gfn &&
>               gfn_x(gfn) <= p2m->max_remapped_gfn )
>          {
> @@ -2660,7 +2660,7 @@ void p2m_altp2m_propagate_change(struct domain *d, gfn_t gfn,
>                  for ( i = 0; i < MAX_ALTP2M; i++ )
>                  {
>                      if ( i == last_reset_idx ||
> -                         d->arch.altp2m_eptp[i] == INVALID_MFN )
> +                         d->arch.altp2m_eptp[i] == mfn_x(INVALID_MFN) )
>                          continue;
>  
>                      p2m = d->arch.altp2m_p2m[i];
> @@ -2672,7 +2672,7 @@ void p2m_altp2m_propagate_change(struct domain *d, gfn_t gfn,
>                  goto out;
>              }
>          }
> -        else if ( mfn_x(m) != INVALID_MFN )
> +        else if ( !mfn_eq(m, INVALID_MFN) )
>              p2m_set_entry(p2m, gfn_x(gfn), mfn, page_order, p2mt, p2ma);
>  
>          __put_gfn(p2m, gfn_x(gfn));
> diff --git a/xen/arch/x86/mm/paging.c b/xen/arch/x86/mm/paging.c
> index 8219bb6..107fc8c 100644
> --- a/xen/arch/x86/mm/paging.c
> +++ b/xen/arch/x86/mm/paging.c
> @@ -67,7 +67,7 @@ static mfn_t paging_new_log_dirty_page(struct domain *d)
>      if ( unlikely(page == NULL) )
>      {
>          d->arch.paging.log_dirty.failed_allocs++;
> -        return _mfn(INVALID_MFN);
> +        return INVALID_MFN;
>      }
>  
>      d->arch.paging.log_dirty.allocs++;
> @@ -95,7 +95,7 @@ static mfn_t paging_new_log_dirty_node(struct domain *d)
>          int i;
>          mfn_t *node = map_domain_page(mfn);
>          for ( i = 0; i < LOGDIRTY_NODE_ENTRIES; i++ )
> -            node[i] = _mfn(INVALID_MFN);
> +            node[i] = INVALID_MFN;
>          unmap_domain_page(node);
>      }
>      return mfn;
> @@ -167,7 +167,7 @@ static int paging_free_log_dirty_bitmap(struct domain *d, int rc)
>  
>              unmap_domain_page(l2);
>              paging_free_log_dirty_page(d, l3[i3]);
> -            l3[i3] = _mfn(INVALID_MFN);
> +            l3[i3] = INVALID_MFN;
>  
>              if ( i3 < LOGDIRTY_NODE_ENTRIES - 1 && hypercall_preempt_check() )
>              {
> @@ -182,7 +182,7 @@ static int paging_free_log_dirty_bitmap(struct domain *d, int rc)
>          if ( rc )
>              break;
>          paging_free_log_dirty_page(d, l4[i4]);
> -        l4[i4] = _mfn(INVALID_MFN);
> +        l4[i4] = INVALID_MFN;
>  
>          if ( i4 < LOGDIRTY_NODE_ENTRIES - 1 && hypercall_preempt_check() )
>          {
> @@ -198,7 +198,7 @@ static int paging_free_log_dirty_bitmap(struct domain *d, int rc)
>      if ( !rc )
>      {
>          paging_free_log_dirty_page(d, d->arch.paging.log_dirty.top);
> -        d->arch.paging.log_dirty.top = _mfn(INVALID_MFN);
> +        d->arch.paging.log_dirty.top = INVALID_MFN;
>  
>          ASSERT(d->arch.paging.log_dirty.allocs == 0);
>          d->arch.paging.log_dirty.failed_allocs = 0;
> @@ -660,7 +660,7 @@ int paging_domain_init(struct domain *d, unsigned int domcr_flags)
>      /* This must be initialized separately from the rest of the
>       * log-dirty init code as that can be called more than once and we
>       * don't want to leak any active log-dirty bitmaps */
> -    d->arch.paging.log_dirty.top = _mfn(INVALID_MFN);
> +    d->arch.paging.log_dirty.top = INVALID_MFN;
>  
>      /*
>       * Shadow pagetables are the default, but we will use
> diff --git a/xen/arch/x86/mm/shadow/common.c b/xen/arch/x86/mm/shadow/common.c
> index 226e32d..c51b370 100644
> --- a/xen/arch/x86/mm/shadow/common.c
> +++ b/xen/arch/x86/mm/shadow/common.c
> @@ -88,10 +88,10 @@ void shadow_vcpu_init(struct vcpu *v)
>  
>      for ( i = 0; i < SHADOW_OOS_PAGES; i++ )
>      {
> -        v->arch.paging.shadow.oos[i] = _mfn(INVALID_MFN);
> -        v->arch.paging.shadow.oos_snapshot[i] = _mfn(INVALID_MFN);
> +        v->arch.paging.shadow.oos[i] = INVALID_MFN;
> +        v->arch.paging.shadow.oos_snapshot[i] = INVALID_MFN;
>          for ( j = 0; j < SHADOW_OOS_FIXUPS; j++ )
> -            v->arch.paging.shadow.oos_fixup[i].smfn[j] = _mfn(INVALID_MFN);
> +            v->arch.paging.shadow.oos_fixup[i].smfn[j] = INVALID_MFN;
>      }
>  #endif
>  
> @@ -593,12 +593,12 @@ static inline int oos_fixup_flush_gmfn(struct vcpu *v, mfn_t gmfn,
>      int i;
>      for ( i = 0; i < SHADOW_OOS_FIXUPS; i++ )
>      {
> -        if ( mfn_x(fixup->smfn[i]) != INVALID_MFN )
> +        if ( !mfn_eq(fixup->smfn[i], INVALID_MFN) )
>          {
>              sh_remove_write_access_from_sl1p(d, gmfn,
>                                               fixup->smfn[i],
>                                               fixup->off[i]);
> -            fixup->smfn[i] = _mfn(INVALID_MFN);
> +            fixup->smfn[i] = INVALID_MFN;
>          }
>      }
>  
> @@ -636,7 +636,7 @@ void oos_fixup_add(struct domain *d, mfn_t gmfn,
>  
>              next = oos_fixup[idx].next;
>  
> -            if ( mfn_x(oos_fixup[idx].smfn[next]) != INVALID_MFN )
> +            if ( !mfn_eq(oos_fixup[idx].smfn[next], INVALID_MFN) )
>              {
>                  TRACE_SHADOW_PATH_FLAG(TRCE_SFLAG_OOS_FIXUP_EVICT);
>  
> @@ -757,7 +757,7 @@ static void oos_hash_add(struct vcpu *v, mfn_t gmfn)
>      struct oos_fixup fixup = { .next = 0 };
>  
>      for (i = 0; i < SHADOW_OOS_FIXUPS; i++ )
> -        fixup.smfn[i] = _mfn(INVALID_MFN);
> +        fixup.smfn[i] = INVALID_MFN;
>  
>      idx = mfn_x(gmfn) % SHADOW_OOS_PAGES;
>      oidx = idx;
> @@ -807,7 +807,7 @@ static void oos_hash_remove(struct domain *d, mfn_t gmfn)
>              idx = (idx + 1) % SHADOW_OOS_PAGES;
>          if ( mfn_x(oos[idx]) == mfn_x(gmfn) )
>          {
> -            oos[idx] = _mfn(INVALID_MFN);
> +            oos[idx] = INVALID_MFN;
>              return;
>          }
>      }
> @@ -838,7 +838,7 @@ mfn_t oos_snapshot_lookup(struct domain *d, mfn_t gmfn)
>  
>      SHADOW_ERROR("gmfn %lx was OOS but not in hash table\n", mfn_x(gmfn));
>      BUG();
> -    return _mfn(INVALID_MFN);
> +    return INVALID_MFN;
>  }
>  
>  /* Pull a single guest page back into sync */
> @@ -862,7 +862,7 @@ void sh_resync(struct domain *d, mfn_t gmfn)
>          if ( mfn_x(oos[idx]) == mfn_x(gmfn) )
>          {
>              _sh_resync(v, gmfn, &oos_fixup[idx], oos_snapshot[idx]);
> -            oos[idx] = _mfn(INVALID_MFN);
> +            oos[idx] = INVALID_MFN;
>              return;
>          }
>      }
> @@ -914,7 +914,7 @@ void sh_resync_all(struct vcpu *v, int skip, int this, int others)
>          {
>              /* Write-protect and sync contents */
>              _sh_resync(v, oos[idx], &oos_fixup[idx], oos_snapshot[idx]);
> -            oos[idx] = _mfn(INVALID_MFN);
> +            oos[idx] = INVALID_MFN;
>          }
>  
>   resync_others:
> @@ -948,7 +948,7 @@ void sh_resync_all(struct vcpu *v, int skip, int this, int others)
>              {
>                  /* Write-protect and sync contents */
>                  _sh_resync(other, oos[idx], &oos_fixup[idx], oos_snapshot[idx]);
> -                oos[idx] = _mfn(INVALID_MFN);
> +                oos[idx] = INVALID_MFN;
>              }
>          }
>      }
> @@ -1784,7 +1784,7 @@ void *sh_emulate_map_dest(struct vcpu *v, unsigned long vaddr,
>      if ( likely(((vaddr + bytes - 1) & PAGE_MASK) == (vaddr & PAGE_MASK)) )
>      {
>          /* Whole write fits on a single page. */
> -        sh_ctxt->mfn[1] = _mfn(INVALID_MFN);
> +        sh_ctxt->mfn[1] = INVALID_MFN;
>          map = map_domain_page(sh_ctxt->mfn[0]) + (vaddr & ~PAGE_MASK);
>      }
>      else if ( !is_hvm_domain(d) )
> @@ -2086,7 +2086,7 @@ mfn_t shadow_hash_lookup(struct domain *d, unsigned long n, unsigned int t)
>      }
>  
>      perfc_incr(shadow_hash_lookup_miss);
> -    return _mfn(INVALID_MFN);
> +    return INVALID_MFN;
>  }
>  
>  void shadow_hash_insert(struct domain *d, unsigned long n, unsigned int t,
> @@ -2910,7 +2910,7 @@ void sh_reset_l3_up_pointers(struct vcpu *v)
>      };
>      static const unsigned int callback_mask = SHF_L3_64;
>  
> -    hash_vcpu_foreach(v, callback_mask, callbacks, _mfn(INVALID_MFN));
> +    hash_vcpu_foreach(v, callback_mask, callbacks, INVALID_MFN);
>  }
>  
>  
> @@ -2940,7 +2940,7 @@ static void sh_update_paging_modes(struct vcpu *v)
>  #endif /* (SHADOW_OPTIMIZATIONS & SHOPT_VIRTUAL_TLB) */
>  
>  #if (SHADOW_OPTIMIZATIONS & SHOPT_OUT_OF_SYNC)
> -    if ( mfn_x(v->arch.paging.shadow.oos_snapshot[0]) == INVALID_MFN )
> +    if ( mfn_eq(v->arch.paging.shadow.oos_snapshot[0], INVALID_MFN) )
>      {
>          int i;
>          for(i = 0; i < SHADOW_OOS_PAGES; i++)
> @@ -3284,7 +3284,7 @@ void shadow_teardown(struct domain *d, int *preempted)
>                  if ( mfn_valid(oos_snapshot[i]) )
>                  {
>                      shadow_free(d, oos_snapshot[i]);
> -                    oos_snapshot[i] = _mfn(INVALID_MFN);
> +                    oos_snapshot[i] = INVALID_MFN;
>                  }
>          }
>  #endif /* OOS */
> @@ -3449,7 +3449,7 @@ static int shadow_one_bit_disable(struct domain *d, u32 mode)
>                      if ( mfn_valid(oos_snapshot[i]) )
>                      {
>                          shadow_free(d, oos_snapshot[i]);
> -                        oos_snapshot[i] = _mfn(INVALID_MFN);
> +                        oos_snapshot[i] = INVALID_MFN;
>                      }
>              }
>  #endif /* OOS */
> @@ -3744,7 +3744,7 @@ int shadow_track_dirty_vram(struct domain *d,
>          memcpy(dirty_bitmap, dirty_vram->dirty_bitmap, dirty_size);
>      else
>      {
> -        unsigned long map_mfn = INVALID_MFN;
> +        unsigned long map_mfn = mfn_x(INVALID_MFN);
>          void *map_sl1p = NULL;
>  
>          /* Iterate over VRAM to track dirty bits. */
> @@ -3754,7 +3754,7 @@ int shadow_track_dirty_vram(struct domain *d,
>              int dirty = 0;
>              paddr_t sl1ma = dirty_vram->sl1ma[i];
>  
> -            if (mfn_x(mfn) == INVALID_MFN)
> +            if ( !mfn_eq(mfn, INVALID_MFN) )
>              {
>                  dirty = 1;
>              }
> @@ -3830,7 +3830,7 @@ int shadow_track_dirty_vram(struct domain *d,
>              for ( i = begin_pfn; i < end_pfn; i++ )
>              {
>                  mfn_t mfn = get_gfn_query_unlocked(d, i, &t);
> -                if ( mfn_x(mfn) != INVALID_MFN )
> +                if ( !mfn_eq(mfn, INVALID_MFN) )
>                      flush_tlb |= sh_remove_write_access(d, mfn, 1, 0);
>              }
>              dirty_vram->last_dirty = -1;
> @@ -3968,7 +3968,7 @@ void shadow_audit_tables(struct vcpu *v)
>          }
>      }
>  
> -    hash_vcpu_foreach(v, mask, callbacks, _mfn(INVALID_MFN));
> +    hash_vcpu_foreach(v, mask, callbacks, INVALID_MFN_T);
>  }
>  
>  #endif /* Shadow audit */
> diff --git a/xen/arch/x86/mm/shadow/multi.c b/xen/arch/x86/mm/shadow/multi.c
> index dfe59a2..f892e2f 100644
> --- a/xen/arch/x86/mm/shadow/multi.c
> +++ b/xen/arch/x86/mm/shadow/multi.c
> @@ -177,7 +177,7 @@ sh_walk_guest_tables(struct vcpu *v, unsigned long va, walk_t *gw,
>  {
>      return guest_walk_tables(v, p2m_get_hostp2m(v->domain), va, gw, pfec,
>  #if GUEST_PAGING_LEVELS == 3 /* PAE */
> -                             _mfn(INVALID_MFN),
> +                             INVALID_MFN,
>                               v->arch.paging.shadow.gl3e
>  #else /* 32 or 64 */
>                               pagetable_get_mfn(v->arch.guest_table),
> @@ -336,32 +336,32 @@ static void sh_audit_gw(struct vcpu *v, walk_t *gw)
>      if ( mfn_valid(gw->l4mfn)
>           && mfn_valid((smfn = get_shadow_status(d, gw->l4mfn,
>                                                  SH_type_l4_shadow))) )
> -        (void) sh_audit_l4_table(v, smfn, _mfn(INVALID_MFN));
> +        (void) sh_audit_l4_table(v, smfn, INVALID_MFN);
>      if ( mfn_valid(gw->l3mfn)
>           && mfn_valid((smfn = get_shadow_status(d, gw->l3mfn,
>                                                  SH_type_l3_shadow))) )
> -        (void) sh_audit_l3_table(v, smfn, _mfn(INVALID_MFN));
> +        (void) sh_audit_l3_table(v, smfn, INVALID_MFN);
>  #endif /* PAE or 64... */
>      if ( mfn_valid(gw->l2mfn) )
>      {
>          if ( mfn_valid((smfn = get_shadow_status(d, gw->l2mfn,
>                                                   SH_type_l2_shadow))) )
> -            (void) sh_audit_l2_table(v, smfn, _mfn(INVALID_MFN));
> +            (void) sh_audit_l2_table(v, smfn, INVALID_MFN);
>  #if GUEST_PAGING_LEVELS == 3
>          if ( mfn_valid((smfn = get_shadow_status(d, gw->l2mfn,
>                                                   SH_type_l2h_shadow))) )
> -            (void) sh_audit_l2_table(v, smfn, _mfn(INVALID_MFN));
> +            (void) sh_audit_l2_table(v, smfn, INVALID_MFN);
>  #endif
>      }
>      if ( mfn_valid(gw->l1mfn)
>           && mfn_valid((smfn = get_shadow_status(d, gw->l1mfn,
>                                                  SH_type_l1_shadow))) )
> -        (void) sh_audit_l1_table(v, smfn, _mfn(INVALID_MFN));
> +        (void) sh_audit_l1_table(v, smfn, INVALID_MFN);
>      else if ( (guest_l2e_get_flags(gw->l2e) & _PAGE_PRESENT)
>                && (guest_l2e_get_flags(gw->l2e) & _PAGE_PSE)
>                && mfn_valid(
>                (smfn = get_fl1_shadow_status(d, guest_l2e_get_gfn(gw->l2e)))) )
> -        (void) sh_audit_fl1_table(v, smfn, _mfn(INVALID_MFN));
> +        (void) sh_audit_fl1_table(v, smfn, INVALID_MFN);
>  }
>  
>  #else
> @@ -1752,7 +1752,7 @@ static shadow_l2e_t * shadow_get_and_create_l2e(struct vcpu *v,
>  {
>  #if GUEST_PAGING_LEVELS >= 4 /* 64bit... */
>      struct domain *d = v->domain;
> -    mfn_t sl3mfn = _mfn(INVALID_MFN);
> +    mfn_t sl3mfn = INVALID_MFN;
>      shadow_l3e_t *sl3e;
>      if ( !mfn_valid(gw->l2mfn) ) return NULL; /* No guest page. */
>      /* Get the l3e */
> @@ -2158,7 +2158,7 @@ static int validate_gl4e(struct vcpu *v, void *new_ge, mfn_t sl4mfn, void *se)
>      shadow_l4e_t new_sl4e;
>      guest_l4e_t new_gl4e = *(guest_l4e_t *)new_ge;
>      shadow_l4e_t *sl4p = se;
> -    mfn_t sl3mfn = _mfn(INVALID_MFN);
> +    mfn_t sl3mfn = INVALID_MFN;
>      struct domain *d = v->domain;
>      p2m_type_t p2mt;
>      int result = 0;
> @@ -2217,7 +2217,7 @@ static int validate_gl3e(struct vcpu *v, void *new_ge, mfn_t sl3mfn, void *se)
>      shadow_l3e_t new_sl3e;
>      guest_l3e_t new_gl3e = *(guest_l3e_t *)new_ge;
>      shadow_l3e_t *sl3p = se;
> -    mfn_t sl2mfn = _mfn(INVALID_MFN);
> +    mfn_t sl2mfn = INVALID_MFN;
>      p2m_type_t p2mt;
>      int result = 0;
>  
> @@ -2250,7 +2250,7 @@ static int validate_gl2e(struct vcpu *v, void *new_ge, mfn_t sl2mfn, void *se)
>      shadow_l2e_t new_sl2e;
>      guest_l2e_t new_gl2e = *(guest_l2e_t *)new_ge;
>      shadow_l2e_t *sl2p = se;
> -    mfn_t sl1mfn = _mfn(INVALID_MFN);
> +    mfn_t sl1mfn = INVALID_MFN;
>      p2m_type_t p2mt;
>      int result = 0;
>  
> @@ -2608,7 +2608,7 @@ static inline void check_for_early_unshadow(struct vcpu *v, mfn_t gmfn)
>  static inline void reset_early_unshadow(struct vcpu *v)
>  {
>  #if SHADOW_OPTIMIZATIONS & SHOPT_EARLY_UNSHADOW
> -    v->arch.paging.shadow.last_emulated_mfn_for_unshadow = INVALID_MFN;
> +    v->arch.paging.shadow.last_emulated_mfn_for_unshadow = mfn_x(INVALID_MFN);
>  #endif
>  }
>  
> @@ -4105,10 +4105,10 @@ sh_update_cr3(struct vcpu *v, int do_locking)
>                                             ? SH_type_l2h_shadow
>                                             : SH_type_l2_shadow);
>                  else
> -                    sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0);
> +                    sh_set_toplevel_shadow(v, i, INVALID_MFN, 0);
>              }
>              else
> -                sh_set_toplevel_shadow(v, i, _mfn(INVALID_MFN), 0);
> +                sh_set_toplevel_shadow(v, i, INVALID_MFN, 0);
>          }
>      }
>  #elif GUEST_PAGING_LEVELS == 4
> @@ -4531,7 +4531,7 @@ static void sh_pagetable_dying(struct vcpu *v, paddr_t gpa)
>  
>          if ( fast_path ) {
>              if ( pagetable_is_null(v->arch.shadow_table[i]) )
> -                smfn = _mfn(INVALID_MFN);
> +                smfn = INVALID_MFN;
>              else
>                  smfn = _mfn(pagetable_get_pfn(v->arch.shadow_table[i]));
>          }
> @@ -4540,8 +4540,8 @@ static void sh_pagetable_dying(struct vcpu *v, paddr_t gpa)
>              /* retrieving the l2s */
>              gmfn = get_gfn_query_unlocked(d, gfn_x(guest_l3e_get_gfn(gl3e[i])),
>                                            &p2mt);
> -            smfn = unlikely(mfn_x(gmfn) == INVALID_MFN)
> -                   ? _mfn(INVALID_MFN)
> +            smfn = unlikely(mfn_eq(gmfn, INVALID_MFN))
> +                   ? INVALID_MFN
>                     : shadow_hash_lookup(d, mfn_x(gmfn), SH_type_l2_pae_shadow);
>          }
>  
> @@ -4846,7 +4846,7 @@ int sh_audit_fl1_table(struct vcpu *v, mfn_t sl1mfn, mfn_t x)
>  {
>      guest_l1e_t *gl1e, e;
>      shadow_l1e_t *sl1e;
> -    mfn_t gl1mfn = _mfn(INVALID_MFN);
> +    mfn_t gl1mfn = INVALID_MFN;
>      int f;
>      int done = 0;
>  
> diff --git a/xen/common/domain.c b/xen/common/domain.c
> index 45273d4..42c07ee 100644
> --- a/xen/common/domain.c
> +++ b/xen/common/domain.c
> @@ -117,7 +117,7 @@ static void vcpu_info_reset(struct vcpu *v)
>      v->vcpu_info = ((v->vcpu_id < XEN_LEGACY_MAX_VCPUS)
>                      ? (vcpu_info_t *)&shared_info(d, vcpu_info[v->vcpu_id])
>                      : &dummy_vcpu_info);
> -    v->vcpu_info_mfn = INVALID_MFN;
> +    v->vcpu_info_mfn = mfn_x(INVALID_MFN);
>  }
>  
>  struct vcpu *alloc_vcpu(
> @@ -1141,7 +1141,7 @@ int map_vcpu_info(struct vcpu *v, unsigned long gfn, unsigned offset)
>      if ( offset > (PAGE_SIZE - sizeof(vcpu_info_t)) )
>          return -EINVAL;
>  
> -    if ( v->vcpu_info_mfn != INVALID_MFN )
> +    if ( v->vcpu_info_mfn != mfn_x(INVALID_MFN) )
>          return -EINVAL;
>  
>      /* Run this command on yourself or on other offline VCPUS. */
> @@ -1205,7 +1205,7 @@ void unmap_vcpu_info(struct vcpu *v)
>  {
>      unsigned long mfn;
>  
> -    if ( v->vcpu_info_mfn == INVALID_MFN )
> +    if ( v->vcpu_info_mfn == mfn_x(INVALID_MFN) )
>          return;
>  
>      mfn = v->vcpu_info_mfn;
> diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
> index 3f15543..ecace07 100644
> --- a/xen/common/grant_table.c
> +++ b/xen/common/grant_table.c
> @@ -244,7 +244,7 @@ static int __get_paged_frame(unsigned long gfn, unsigned long *frame, struct pag
>                                (readonly) ? P2M_ALLOC : P2M_UNSHARE);
>      if ( !(*page) )
>      {
> -        *frame = INVALID_MFN;
> +        *frame = mfn_x(INVALID_MFN);
>          if ( p2m_is_shared(p2mt) )
>              return GNTST_eagain;
>          if ( p2m_is_paging(p2mt) )
> @@ -260,7 +260,7 @@ static int __get_paged_frame(unsigned long gfn, unsigned long *frame, struct pag
>      *page = mfn_valid(*frame) ? mfn_to_page(*frame) : NULL;
>      if ( (!(*page)) || (!get_page(*page, rd)) )
>      {
> -        *frame = INVALID_MFN;
> +        *frame = mfn_x(INVALID_MFN);
>          *page = NULL;
>          rc = GNTST_bad_page;
>      }
> @@ -1785,7 +1785,7 @@ gnttab_transfer(
>              p2m_type_t __p2mt;
>              mfn = mfn_x(get_gfn_unshare(d, gop.mfn, &__p2mt));
>              if ( p2m_is_shared(__p2mt) || !p2m_is_valid(__p2mt) )
> -                mfn = INVALID_MFN;
> +                mfn = mfn_x(INVALID_MFN);
>          }
>  #else
>          mfn = mfn_x(gfn_to_mfn(d, _gfn(gop.mfn)));
> diff --git a/xen/include/xen/mm.h b/xen/include/xen/mm.h
> index afbb1a1..7f207ec 100644
> --- a/xen/include/xen/mm.h
> +++ b/xen/include/xen/mm.h
> @@ -55,7 +55,7 @@
>  
>  TYPE_SAFE(unsigned long, mfn);
>  #define PRI_mfn          "05lx"
> -#define INVALID_MFN      (~0UL)
> +#define INVALID_MFN      _mfn(~0UL)
>  
>  #ifndef mfn_t
>  #define mfn_t /* Grep fodder: mfn_t, _mfn() and mfn_x() are defined above */
> -- 
> 1.9.1
> 

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel

  parent reply	other threads:[~2016-07-06 10:27 UTC|newest]

Thread overview: 49+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-06-28 16:17 [PATCH v5 00/17] xen/arm: Use the typesafes gfn and mfn Julien Grall
2016-06-28 16:17 ` [PATCH v5 01/17] xen: Use typesafe gfn/mfn in guest_physmap_* helpers Julien Grall
2016-06-28 16:17 ` [PATCH v5 02/17] xen: Use typesafe gfn in xenmem_add_to_physmap_one Julien Grall
2016-06-28 16:17 ` [PATCH v5 03/17] xen/arm: Rename grant_table_gfpn into grant_table_gfn and use the typesafe gfn Julien Grall
2016-06-28 16:17 ` [PATCH v5 04/17] xen: Use the typesafe mfn and gfn in map_mmio_regions Julien Grall
2016-07-06 10:23   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 05/17] xen/passthrough: x86: Use INVALID_GFN rather than INVALID_MFN Julien Grall
2016-06-28 16:43   ` Andrew Cooper
2016-06-28 16:47     ` Juergen Gross
2016-06-28 17:04       ` Julien Grall
2016-06-29  9:39   ` Jan Beulich
2016-06-28 16:17 ` [PATCH v5 06/17] xen: Use a typesafe to define INVALID_MFN Julien Grall
2016-06-28 17:05   ` Andrew Cooper
2016-07-06 10:27   ` Stefano Stabellini [this message]
2016-06-28 16:17 ` [PATCH v5 07/17] xen: Use a typesafe to define INVALID_GFN Julien Grall
2016-06-28 17:12   ` Andrew Cooper
2016-07-06 10:28   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 08/17] xen/arm: Rework the interface of p2m_lookup and use typesafe gfn and mfn Julien Grall
2016-07-06 10:32   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 09/17] xen/arm: Rework the interface of p2m_cache_flush and use typesafe gfn Julien Grall
2016-07-06 10:35   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 10/17] xen/arm: map_regions_rw_cache: Map the region with p2m->default_access Julien Grall
2016-07-06 10:43   ` Stefano Stabellini
2016-07-06 11:10     ` Julien Grall
2016-07-06 11:17       ` Stefano Stabellini
2016-07-06 11:22         ` Julien Grall
2016-07-06 11:44           ` Julien Grall
2016-07-06 15:39       ` Tamas K Lengyel
2016-06-28 16:17 ` [PATCH v5 11/17] xen/arm: dom0_build: Remove dead code in allocate_memory Julien Grall
2016-07-06 10:46   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 12/17] xen/arm: p2m: Remove unused operation ALLOCATE Julien Grall
2016-07-06 10:49   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 13/17] xen/arm: Use the typesafes mfn and gfn in map_dev_mmio_region Julien Grall
2016-06-28 17:21   ` Andrew Cooper
2016-06-29 12:20     ` Julien Grall
2016-06-28 16:17 ` [PATCH v5 14/17] xen/arm: Use the typesafes mfn and gfn in map_regions_rw_cache Julien Grall
2016-07-06 10:54   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 15/17] xen/arm: p2m: Introduce helpers to insert and remove mapping Julien Grall
2016-06-28 17:23   ` Andrew Cooper
2016-07-06 10:59   ` Stefano Stabellini
2016-07-06 11:20     ` Julien Grall
2016-06-28 16:17 ` [PATCH v5 16/17] xen/arm: p2m: Use typesafe gfn for {max, lowest}_mapped_gfn Julien Grall
2016-07-06 11:07   ` Stefano Stabellini
2016-06-28 16:17 ` [PATCH v5 17/17] xen/arm: p2m: Rework the interface of apply_p2m_changes and use typesafe Julien Grall
2016-07-06 11:06   ` Stefano Stabellini
2016-07-06 11:56     ` Julien Grall
2016-07-06 12:45       ` Andrew Cooper
2016-06-28 18:32 ` [PATCH v5 00/17] xen/arm: Use the typesafes gfn and mfn Andrew Cooper
2016-06-29  9:24   ` Jan Beulich

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=alpine.DEB.2.10.1607061127130.2575@sstabellini-ThinkPad-X260 \
    --to=sstabellini@kernel.org \
    --cc=andrew.cooper3@citrix.com \
    --cc=chegger@amazon.de \
    --cc=george.dunlap@eu.citrix.com \
    --cc=jbeulich@suse.com \
    --cc=jinsong.liu@alibaba-inc.com \
    --cc=julien.grall@arm.com \
    --cc=jun.nakajima@intel.com \
    --cc=kevin.tian@intel.com \
    --cc=mukesh.rathor@oracle.com \
    --cc=paul.durrant@citrix.com \
    --cc=tim@xen.org \
    --cc=xen-devel@lists.xen.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).