'pfn' and 'start_pfn' are ambiguous, both these functions expect GFNs as input.
On x86 the interface of p2m_set_mem_access() in p2m.c doesn't match the
declaration in p2m-common.h as 'pfn' is being used instead of 'start_pfn'.
On ARM both p2m_set_mem_access and p2m_get_mem_access interfaces don't match
declarations from p2m-common.h: p2m_set_mem_access uses 'pfn' instead of
'start_pfn' and p2m_get_mem_access uses 'gpfn' instead of 'pfn'.
Convert p2m_get_mem_access/p2m_set_mem_access (and __p2m_get_mem_access on ARM)
interfaces to using gft_t instead of unsigned long and update all users of
these functions.
There is also an issue in p2m_get_mem_access on x86: 'gfn' parameter passed to
gfn_lock/gfn_unlock is not defined. This code compiles only because of a
coincidence: gfn_lock/gfn_unlock are currently macros which don't use their
second argument.
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Reviewed-by: George Dunlap <george.dunlap@eu.citrix.com>
Reviewed-by: Julien Grall <julien.grall@citrix.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
return 0;
}
-static int __p2m_get_mem_access(struct domain *d, unsigned long gpfn,
+static int __p2m_get_mem_access(struct domain *d, gfn_t gfn,
xenmem_access_t *access)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
return 0;
}
- /* If request to get default access */
- if ( gpfn == ~0ul )
+ /* If request to get default access. */
+ if ( gfn_x(gfn) == INVALID_GFN )
{
*access = memaccess[p2m->default_access];
return 0;
}
- i = radix_tree_lookup(&p2m->mem_access_settings, gpfn);
+ i = radix_tree_lookup(&p2m->mem_access_settings, gfn_x(gfn));
if ( !i )
{
* No setting was found in the Radix tree. Check if the
* entry exists in the page-tables.
*/
- paddr_t maddr = p2m_lookup(d, gpfn << PAGE_SHIFT, NULL);
+ paddr_t maddr = p2m_lookup(d, gfn_x(gfn) << PAGE_SHIFT, NULL);
if ( INVALID_PADDR == maddr )
return -ESRCH;
* We do this first as this is faster in the default case when no
* permission is set on the page.
*/
- rc = __p2m_get_mem_access(current->domain, paddr_to_pfn(ipa), &xma);
+ rc = __p2m_get_mem_access(current->domain, _gfn(paddr_to_pfn(ipa)), &xma);
if ( rc < 0 )
goto err;
if ( !p2m->mem_access_enabled )
return true;
- rc = p2m_get_mem_access(v->domain, paddr_to_pfn(gpa), &xma);
+ rc = p2m_get_mem_access(v->domain, _gfn(paddr_to_pfn(gpa)), &xma);
if ( rc )
return true;
/* First, handle rx2rw and n2rwx conversion automatically. */
if ( npfec.write_access && xma == XENMEM_access_rx2rw )
{
- rc = p2m_set_mem_access(v->domain, paddr_to_pfn(gpa), 1,
+ rc = p2m_set_mem_access(v->domain, _gfn(paddr_to_pfn(gpa)), 1,
0, ~0, XENMEM_access_rw);
return false;
}
else if ( xma == XENMEM_access_n2rwx )
{
- rc = p2m_set_mem_access(v->domain, paddr_to_pfn(gpa), 1,
+ rc = p2m_set_mem_access(v->domain, _gfn(paddr_to_pfn(gpa)), 1,
0, ~0, XENMEM_access_rwx);
}
{
/* A listener is not required, so clear the access
* restrictions. */
- rc = p2m_set_mem_access(v->domain, paddr_to_pfn(gpa), 1,
+ rc = p2m_set_mem_access(v->domain, _gfn(paddr_to_pfn(gpa)), 1,
0, ~0, XENMEM_access_rwx);
}
}
/*
* Set access type for a region of pfns.
- * If start_pfn == -1ul, sets the default access type.
+ * If gfn == INVALID_GFN, sets the default access type.
*/
-long p2m_set_mem_access(struct domain *d, unsigned long pfn, uint32_t nr,
+long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr,
uint32_t start, uint32_t mask, xenmem_access_t access)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
p2m->mem_access_enabled = true;
/* If request to set default access. */
- if ( pfn == ~0ul )
+ if ( gfn_x(gfn) == INVALID_GFN )
{
p2m->default_access = a;
return 0;
}
rc = apply_p2m_changes(d, MEMACCESS,
- pfn_to_paddr(pfn+start), pfn_to_paddr(pfn+nr),
+ pfn_to_paddr(gfn_x(gfn) + start),
+ pfn_to_paddr(gfn_x(gfn) + nr),
0, MATTR_MEM, mask, 0, a);
if ( rc < 0 )
return rc;
return 0;
}
-int p2m_get_mem_access(struct domain *d, unsigned long gpfn,
+int p2m_get_mem_access(struct domain *d, gfn_t gfn,
xenmem_access_t *access)
{
int ret;
struct p2m_domain *p2m = p2m_get_hostp2m(d);
spin_lock(&p2m->lock);
- ret = __p2m_get_mem_access(d, gpfn, access);
+ ret = __p2m_get_mem_access(d, gfn, access);
spin_unlock(&p2m->lock);
return ret;
bool_t violation = 1;
const struct vm_event_mem_access *data = &rsp->u.mem_access;
- if ( p2m_get_mem_access(v->domain, data->gfn, &access) == 0 )
+ if ( p2m_get_mem_access(v->domain, _gfn(data->gfn), &access) == 0 )
{
switch ( access )
{
return (p2ma == p2m_access_n2rwx);
}
-/* Set access type for a region of pfns.
- * If start_pfn == -1ul, sets the default access type */
-long p2m_set_mem_access(struct domain *d, unsigned long pfn, uint32_t nr,
+/*
+ * Set access type for a region of gfns.
+ * If gfn == INVALID_GFN, sets the default access type.
+ */
+long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr,
uint32_t start, uint32_t mask, xenmem_access_t access)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
p2m_access_t a, _a;
p2m_type_t t;
mfn_t mfn;
+ unsigned long gfn_l;
long rc = 0;
static const p2m_access_t memaccess[] = {
return -EINVAL;
}
- /* If request to set default access */
- if ( pfn == ~0ul )
+ /* If request to set default access. */
+ if ( gfn_x(gfn) == INVALID_GFN )
{
p2m->default_access = a;
return 0;
}
p2m_lock(p2m);
- for ( pfn += start; nr > start; ++pfn )
+ for ( gfn_l = gfn_x(gfn) + start; nr > start; ++gfn_l )
{
- mfn = p2m->get_entry(p2m, pfn, &t, &_a, 0, NULL);
- rc = p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a);
+ mfn = p2m->get_entry(p2m, gfn_l, &t, &_a, 0, NULL);
+ rc = p2m->set_entry(p2m, gfn_l, mfn, PAGE_ORDER_4K, t, a);
if ( rc )
break;
return rc;
}
-/* Get access type for a pfn
- * If pfn == -1ul, gets the default access type */
-int p2m_get_mem_access(struct domain *d, unsigned long pfn,
- xenmem_access_t *access)
+/*
+ * Get access type for a gfn.
+ * If gfn == INVALID_GFN, gets the default access type.
+ */
+int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
p2m_type_t t;
#undef ACCESS
};
- /* If request to get default access */
- if ( pfn == ~0ull )
+ /* If request to get default access. */
+ if ( gfn_x(gfn) == INVALID_GFN )
{
*access = memaccess[p2m->default_access];
return 0;
}
gfn_lock(p2m, gfn, 0);
- mfn = p2m->get_entry(p2m, pfn, &t, &a, 0, NULL);
+ mfn = p2m->get_entry(p2m, gfn_x(gfn), &t, &a, 0, NULL);
gfn_unlock(p2m, gfn, 0);
if ( mfn_x(mfn) == INVALID_MFN )
((mao.pfn + mao.nr - 1) > domain_get_maximum_gpfn(d))) )
break;
- rc = p2m_set_mem_access(d, mao.pfn, mao.nr, start_iter,
+ rc = p2m_set_mem_access(d, _gfn(mao.pfn), mao.nr, start_iter,
MEMOP_CMD_MASK, mao.access);
if ( rc > 0 )
{
if ( (mao.pfn > domain_get_maximum_gpfn(d)) && mao.pfn != ~0ull )
break;
- rc = p2m_get_mem_access(d, mao.pfn, &access);
+ rc = p2m_get_mem_access(d, _gfn(mao.pfn), &access);
if ( rc != 0 )
break;
unsigned long mfn);
/*
- * Set access type for a region of pfns.
- * If start_pfn == -1ul, sets the default access type.
+ * Set access type for a region of gfns.
+ * If gfn == INVALID_GFN, sets the default access type.
*/
-long p2m_set_mem_access(struct domain *d, unsigned long start_pfn, uint32_t nr,
+long p2m_set_mem_access(struct domain *d, gfn_t gfn, uint32_t nr,
uint32_t start, uint32_t mask, xenmem_access_t access);
/*
- * Get access type for a pfn.
- * If pfn == -1ul, gets the default access type.
+ * Get access type for a gfn.
+ * If gfn == INVALID_GFN, gets the default access type.
*/
-int p2m_get_mem_access(struct domain *d, unsigned long pfn,
- xenmem_access_t *access);
+int p2m_get_mem_access(struct domain *d, gfn_t gfn, xenmem_access_t *access);
#endif /* _XEN_P2M_COMMON_H */