void *top_map;
p2m_type_t p2mt;
walk_t gw;
- unsigned long top_gfn;
+ gfn_t top_gfn;
struct page_info *top_page;
/* Get the top-level table's MFN */
- top_gfn = cr3 >> PAGE_SHIFT;
- top_page = get_page_from_gfn_p2m(p2m->domain, p2m, top_gfn,
- &p2mt, NULL, P2M_ALLOC | P2M_UNSHARE);
+ top_gfn = _gfn(cr3 >> PAGE_SHIFT);
+ top_page = p2m_get_page_from_gfn(p2m, top_gfn, &p2mt, NULL,
+ P2M_ALLOC | P2M_UNSHARE);
if ( p2m_is_paging(p2mt) )
{
ASSERT(p2m_is_hostp2m(p2m));
{
gfn_t gfn = guest_walk_to_gfn(&gw);
struct page_info *page;
- page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), &p2mt,
- NULL, P2M_ALLOC | P2M_UNSHARE);
+
+ page = p2m_get_page_from_gfn(p2m, gfn, &p2mt, NULL,
+ P2M_ALLOC | P2M_UNSHARE);
if ( page )
put_page(page);
if ( p2m_is_paging(p2mt) )
}
/* Atomically look up a GFN and take a reference count on the backing page. */
-struct page_info *get_page_from_gfn_p2m(
- struct domain *d, struct p2m_domain *p2m, unsigned long gfn,
+struct page_info *p2m_get_page_from_gfn(
+ struct p2m_domain *p2m, gfn_t gfn,
p2m_type_t *t, p2m_access_t *a, p2m_query_t q)
{
struct page_info *page = NULL;
{
/* Fast path: look up and get out */
p2m_read_lock(p2m);
- mfn = __get_gfn_type_access(p2m, gfn, t, a, 0, NULL, 0);
+ mfn = __get_gfn_type_access(p2m, gfn_x(gfn), t, a, 0, NULL, 0);
if ( p2m_is_any_ram(*t) && mfn_valid(mfn)
&& !((q & P2M_UNSHARE) && p2m_is_shared(*t)) )
{
if ( unlikely(p2m_is_foreign(*t)) )
{
struct domain *fdom = page_get_owner_and_reference(page);
- ASSERT(fdom != d);
+
+ ASSERT(fdom != p2m->domain);
if ( fdom == NULL )
page = NULL;
}
- else if ( !get_page(page, d) &&
+ else if ( !get_page(page, p2m->domain) &&
/* Page could be shared */
(!p2m_is_shared(*t) || !get_page(page, dom_cow)) )
page = NULL;
}
/* Slow path: take the write lock and do fixups */
- mfn = get_gfn_type_access(p2m, gfn, t, a, q, NULL);
+ mfn = get_gfn_type_access(p2m, gfn_x(gfn), t, a, q, NULL);
if ( p2m_is_ram(*t) && mfn_valid(mfn) )
{
page = mfn_to_page(mfn);
- if ( !get_page(page, d) )
+ if ( !get_page(page, p2m->domain) )
page = NULL;
}
- put_gfn(d, gfn);
+ put_gfn(p2m->domain, gfn_x(gfn));
return page;
}
}
/* Translate the gfn, unsharing if shared. */
- page = get_page_from_gfn_p2m(p2m->domain, p2m, gfn_x(gfn), p2mt, NULL, q);
+ page = p2m_get_page_from_gfn(p2m, gfn, p2mt, NULL, q);
if ( p2m_is_paging(*p2mt) )
{
ASSERT(p2m_is_hostp2m(p2m));
* and should be used by any path that intends to write to the backing page.
* Returns NULL if the page is not backed by RAM.
* The caller is responsible for calling put_page() afterwards. */
-struct page_info *get_page_from_gfn_p2m(struct domain *d,
- struct p2m_domain *p2m,
- unsigned long gfn,
+struct page_info *p2m_get_page_from_gfn(struct p2m_domain *p2m, gfn_t gfn,
p2m_type_t *t, p2m_access_t *a,
p2m_query_t q);
struct page_info *page;
if ( paging_mode_translate(d) )
- return get_page_from_gfn_p2m(d, p2m_get_hostp2m(d), gfn, t, NULL, q);
+ return p2m_get_page_from_gfn(p2m_get_hostp2m(d), _gfn(gfn), t, NULL, q);
/* Non-translated guests see 1-1 RAM / MMIO mappings everywhere */
if ( t )