#define define_get_linear_pagetable(level) \
static int \
get_##level##_linear_pagetable( \
- level##_pgentry_t pde, unsigned long pde_pfn, struct domain *d) \
+ level##_pgentry_t pde, mfn_t pde_mfn, struct domain *d) \
{ \
unsigned long x, y; \
- unsigned long pfn; \
+ mfn_t mfn; \
\
if ( !opt_pv_linear_pt ) \
{ \
return 0; \
} \
\
- if ( (pfn = level##e_get_pfn(pde)) != pde_pfn ) \
+ if ( !mfn_eq(mfn = level##e_get_mfn(pde), pde_mfn) ) \
{ \
- struct page_info *page, *ptpg = mfn_to_page(_mfn(pde_pfn)); \
+ struct page_info *page, *ptpg = mfn_to_page(pde_mfn); \
\
/* Make sure the page table belongs to the correct domain. */ \
if ( unlikely(page_get_owner(ptpg) != d) ) \
return 0; \
\
/* Make sure the mapped frame belongs to the correct domain. */ \
- page = get_page_from_mfn(_mfn(pfn), d); \
+ page = get_page_from_mfn(mfn, d); \
if ( unlikely(!page) ) \
return 0; \
\
#define define_get_linear_pagetable(level) \
static int \
get_##level##_linear_pagetable( \
- level##_pgentry_t pde, unsigned long pde_pfn, struct domain *d) \
+ level##_pgentry_t pde, mfn_t pde_mfn, struct domain *d) \
{ \
return 0; \
}
define_get_linear_pagetable(l2);
static int
get_page_from_l2e(
- l2_pgentry_t l2e, unsigned long l2mfn, struct domain *d, unsigned int flags)
+ l2_pgentry_t l2e, mfn_t l2mfn, struct domain *d, unsigned int flags)
{
unsigned long mfn = l2e_get_pfn(l2e);
int rc;
define_get_linear_pagetable(l3);
static int
get_page_from_l3e(
- l3_pgentry_t l3e, unsigned long l3mfn, struct domain *d, unsigned int flags)
+ l3_pgentry_t l3e, mfn_t l3mfn, struct domain *d, unsigned int flags)
{
int rc;
define_get_linear_pagetable(l4);
static int
get_page_from_l4e(
- l4_pgentry_t l4e, unsigned long l4mfn, struct domain *d, unsigned int flags)
+ l4_pgentry_t l4e, mfn_t l4mfn, struct domain *d, unsigned int flags)
{
int rc;
* NB. Virtual address 'l2e' maps to a machine address within frame 'pfn'.
* Note also that this automatically deals correctly with linear p.t.'s.
*/
-static int put_page_from_l2e(l2_pgentry_t l2e, unsigned long l2mfn,
- unsigned int flags)
+static int put_page_from_l2e(l2_pgentry_t l2e, mfn_t l2mfn, unsigned int flags)
{
- if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) || (l2e_get_pfn(l2e) == l2mfn) )
+ if ( !(l2e_get_flags(l2e) & _PAGE_PRESENT) || mfn_eq(l2e_get_mfn(l2e), l2mfn) )
return 1;
if ( l2e_get_flags(l2e) & _PAGE_PSE )
l2e_get_flags(l2e) & _PAGE_RW,
L2_PAGETABLE_SHIFT);
- return put_pt_page(l2e_get_page(l2e), mfn_to_page(_mfn(l2mfn)), flags);
+ return put_pt_page(l2e_get_page(l2e), mfn_to_page(l2mfn), flags);
}
-static int put_page_from_l3e(l3_pgentry_t l3e, unsigned long l3mfn,
- unsigned int flags)
+static int put_page_from_l3e(l3_pgentry_t l3e, mfn_t l3mfn, unsigned int flags)
{
- if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) || (l3e_get_pfn(l3e) == l3mfn) )
+ if ( !(l3e_get_flags(l3e) & _PAGE_PRESENT) || mfn_eq(l3e_get_mfn(l3e), l3mfn) )
return 1;
if ( unlikely(l3e_get_flags(l3e) & _PAGE_PSE) )
l3e_get_flags(l3e) & _PAGE_RW,
L3_PAGETABLE_SHIFT);
- return put_pt_page(l3e_get_page(l3e), mfn_to_page(_mfn(l3mfn)), flags);
+ return put_pt_page(l3e_get_page(l3e), mfn_to_page(l3mfn), flags);
}
-static int put_page_from_l4e(l4_pgentry_t l4e, unsigned long l4mfn,
- unsigned int flags)
+static int put_page_from_l4e(l4_pgentry_t l4e, mfn_t l4mfn, unsigned int flags)
{
- if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) || (l4e_get_pfn(l4e) == l4mfn) )
+ if ( !(l4e_get_flags(l4e) & _PAGE_PRESENT) || mfn_eq(l4e_get_mfn(l4e), l4mfn) )
return 1;
- return put_pt_page(l4e_get_page(l4e), mfn_to_page(_mfn(l4mfn)), flags);
+ return put_pt_page(l4e_get_page(l4e), mfn_to_page(l4mfn), flags);
}
static int alloc_l1_table(struct page_info *page)
static int alloc_l2_table(struct page_info *page, unsigned long type)
{
struct domain *d = page_get_owner(page);
- unsigned long l2mfn = mfn_x(page_to_mfn(page));
+ mfn_t l2mfn = page_to_mfn(page);
l2_pgentry_t *pl2e;
unsigned int i;
int rc = 0;
unsigned int partial_flags = page->partial_flags;
- pl2e = map_domain_page(_mfn(l2mfn));
+ pl2e = map_domain_page(l2mfn);
/*
* NB that alloc_l2_table will never set partial_pte on an l2; but
static int alloc_l3_table(struct page_info *page)
{
struct domain *d = page_get_owner(page);
- unsigned long l3mfn = mfn_x(page_to_mfn(page));
+ mfn_t l3mfn = page_to_mfn(page);
l3_pgentry_t *pl3e;
unsigned int i;
int rc = 0;
unsigned int partial_flags = page->partial_flags;
l3_pgentry_t l3e = l3e_empty();
- pl3e = map_domain_page(_mfn(l3mfn));
+ pl3e = map_domain_page(l3mfn);
/*
* PAE guests allocate full pages, but aren't required to initialize
static int alloc_l4_table(struct page_info *page)
{
struct domain *d = page_get_owner(page);
- unsigned long l4mfn = mfn_x(page_to_mfn(page));
- l4_pgentry_t *pl4e = map_domain_page(_mfn(l4mfn));
+ mfn_t l4mfn = page_to_mfn(page);
+ l4_pgentry_t *pl4e = map_domain_page(l4mfn);
unsigned int i;
int rc = 0;
unsigned int partial_flags = page->partial_flags;
if ( !rc )
{
- init_xen_l4_slots(pl4e, _mfn(l4mfn),
+ init_xen_l4_slots(pl4e, l4mfn,
d, INVALID_MFN, VM_ASSIST(d, m2p_strict));
atomic_inc(&d->arch.pv.nr_l4_pages);
}
static int free_l2_table(struct page_info *page)
{
struct domain *d = page_get_owner(page);
- unsigned long l2mfn = mfn_x(page_to_mfn(page));
+ mfn_t l2mfn = page_to_mfn(page);
l2_pgentry_t *pl2e;
int rc = 0;
unsigned int partial_flags = page->partial_flags,
i = page->nr_validated_ptes - !(partial_flags & PTF_partial_set);
- pl2e = map_domain_page(_mfn(l2mfn));
+ pl2e = map_domain_page(l2mfn);
for ( ; ; )
{
static int free_l3_table(struct page_info *page)
{
struct domain *d = page_get_owner(page);
- unsigned long l3mfn = mfn_x(page_to_mfn(page));
+ mfn_t l3mfn = page_to_mfn(page);
l3_pgentry_t *pl3e;
int rc = 0;
unsigned int partial_flags = page->partial_flags,
i = page->nr_validated_ptes - !(partial_flags & PTF_partial_set);
- pl3e = map_domain_page(_mfn(l3mfn));
+ pl3e = map_domain_page(l3mfn);
for ( ; ; )
{
static int free_l4_table(struct page_info *page)
{
struct domain *d = page_get_owner(page);
- unsigned long l4mfn = mfn_x(page_to_mfn(page));
- l4_pgentry_t *pl4e = map_domain_page(_mfn(l4mfn));
+ mfn_t l4mfn = page_to_mfn(page);
+ l4_pgentry_t *pl4e = map_domain_page(l4mfn);
int rc = 0;
unsigned partial_flags = page->partial_flags,
i = page->nr_validated_ptes - !(partial_flags & PTF_partial_set);
return -EBUSY;
}
- if ( unlikely((rc = get_page_from_l2e(nl2e, mfn_x(mfn), d, 0)) < 0) )
+ if ( unlikely((rc = get_page_from_l2e(nl2e, mfn, d, 0)) < 0) )
return rc;
nl2e = adjust_guest_l2e(nl2e, d);
return -EBUSY;
}
- put_page_from_l2e(ol2e, mfn_x(mfn), PTF_defer);
+ put_page_from_l2e(ol2e, mfn, PTF_defer);
return rc;
}
return rc ? 0 : -EFAULT;
}
- rc = get_page_from_l3e(nl3e, mfn_x(mfn), d, 0);
+ rc = get_page_from_l3e(nl3e, mfn, d, 0);
if ( unlikely(rc < 0) )
return rc;
rc = 0;
if ( !create_pae_xen_mappings(d, pl3e) )
BUG();
- put_page_from_l3e(ol3e, mfn_x(mfn), PTF_defer);
+ put_page_from_l3e(ol3e, mfn, PTF_defer);
return rc;
}
return rc ? 0 : -EFAULT;
}
- rc = get_page_from_l4e(nl4e, mfn_x(mfn), d, 0);
+ rc = get_page_from_l4e(nl4e, mfn, d, 0);
if ( unlikely(rc < 0) )
return rc;
rc = 0;
return -EFAULT;
}
- put_page_from_l4e(ol4e, mfn_x(mfn), PTF_defer);
+ put_page_from_l4e(ol4e, mfn, PTF_defer);
return rc;
}
#endif /* CONFIG_PV */