/* For next iteration */
unmap_domain_page(mapping);
- mapping = map_domain_page(_mfn(pte.walk.base));
+ mapping = map_domain_page(lpae_get_mfn(pte));
}
unmap_domain_page(mapping);
ASSERT(!(mfn_to_maddr(mfn) & ~PADDR_MASK));
- e.pt.base = mfn_x(mfn);
+ lpae_set_mfn(e, mfn);
return e;
}
ASSERT(slot >= 0 && slot < DOMHEAP_ENTRIES);
ASSERT(map[slot].pt.avail != 0);
- return _mfn(map[slot].pt.base + offset);
+ return mfn_add(lpae_get_mfn(map[slot]), offset);
}
#endif
/* mfn_to_virt is not valid on the 1st 1st mfn, since it
* is not within the xenheap. */
first = slot == xenheap_first_first_slot ?
- xenheap_first_first : __mfn_to_virt(p->pt.base);
+ xenheap_first_first : mfn_to_virt(lpae_get_mfn(*p));
}
else if ( xenheap_first_first_slot == -1)
{
BUG_ON(!lpae_is_valid(*entry));
- third = __mfn_to_virt(entry->pt.base);
+ third = mfn_to_virt(lpae_get_mfn(*entry));
entry = &third[third_table_offset(addr)];
switch ( op ) {
if ( lpae_is_mapping(*entry, level) )
return GUEST_TABLE_SUPER_PAGE;
- mfn = _mfn(entry->p2m.base);
+ mfn = lpae_get_mfn(*entry);
unmap_domain_page(*table);
*table = map_domain_page(mfn);
if ( a )
*a = p2m_mem_access_radix_get(p2m, gfn);
- mfn = _mfn(entry.p2m.base);
+ mfn = lpae_get_mfn(entry);
/*
* The entry may point to a superpage. Find the MFN associated
* to the GFN.
ASSERT(!(mfn_to_maddr(mfn) & ~PADDR_MASK));
- e.p2m.base = mfn_x(mfn);
+ lpae_set_mfn(e, mfn);
return e;
}
*/
if ( p2m_is_foreign(pte.p2m.type) )
{
- mfn_t mfn = _mfn(pte.p2m.base);
+ mfn_t mfn = lpae_get_mfn(pte);
ASSERT(mfn_valid(mfn));
put_page(mfn_to_page(mfn));
return;
}
- table = map_domain_page(_mfn(entry.p2m.base));
+ table = map_domain_page(lpae_get_mfn(entry));
for ( i = 0; i < LPAE_ENTRIES; i++ )
p2m_free_entry(p2m, *(table + i), level + 1);
*/
p2m_tlb_flush_sync(p2m);
- mfn = _mfn(entry.p2m.base);
+ mfn = lpae_get_mfn(entry);
ASSERT(mfn_valid(mfn));
pg = mfn_to_page(mfn);
bool rv = true;
/* Convenience aliases */
- mfn_t mfn = _mfn(entry->p2m.base);
+ mfn_t mfn = lpae_get_mfn(*entry);
unsigned int next_level = level + 1;
unsigned int level_order = level_orders[next_level];
* the necessary fields. So the correct permission are kept.
*/
pte = *entry;
- pte.p2m.base = mfn_x(mfn_add(mfn, i << level_order));
+ lpae_set_mfn(pte, mfn_add(mfn, i << level_order));
/*
* First and second level pages set p2m.table = 0, but third
* Free the entry only if the original pte was valid and the base
* is different (to avoid freeing when permission is changed).
*/
- if ( lpae_is_valid(orig_pte) && entry->p2m.base != orig_pte.p2m.base )
+ if ( lpae_is_valid(orig_pte) &&
+ !mfn_eq(lpae_get_mfn(*entry), lpae_get_mfn(orig_pte)) )
p2m_free_entry(p2m, orig_pte, level);
if ( need_iommu_pt_sync(p2m->domain) &&