|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [V1 PATCH 3/3] P2M error code propogation
Because some of the leaf p2m functions return 0 for failure and
TRUE for success, the real errno is lost. We change some of those
functions to return proper -errno. Also, any code in the immediate
vicinity that is in coding style violation is fixed up.
This patch doesn't change any functionality.
Signed-off-by: Mukesh Rathor <mukesh.rathor@xxxxxxxxxx>
---
xen/arch/x86/domctl.c | 19 ++++----
xen/arch/x86/mm/hap/nested_hap.c | 11 ++---
xen/arch/x86/mm/mem_sharing.c | 10 ++---
xen/arch/x86/mm/p2m-ept.c | 17 ++++---
xen/arch/x86/mm/p2m-pod.c | 7 ++-
xen/arch/x86/mm/p2m-pt.c | 48 ++++++++++----------
xen/arch/x86/mm/p2m.c | 96 +++++++++++++++++++---------------------
7 files changed, 102 insertions(+), 106 deletions(-)
diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c
index 26635ff..cd58e37 100644
--- a/xen/arch/x86/domctl.c
+++ b/xen/arch/x86/domctl.c
@@ -671,13 +671,12 @@ long arch_do_domctl(
if ( !ret && paging_mode_translate(d) )
{
for ( i = 0; !ret && i < nr_mfns; i++ )
- if ( !set_mmio_p2m_entry(d, gfn + i, _mfn(mfn + i)) )
- ret = -EIO;
+ ret = set_mmio_p2m_entry(d, gfn + i, _mfn(mfn + i));
if ( ret )
{
printk(XENLOG_G_WARNING
- "memory_map:fail: dom%d gfn=%lx mfn=%lx\n",
- d->domain_id, gfn + i, mfn + i);
+ "memory_map:fail: dom%d gfn=%lx mfn=%lx ret:%ld\n",
+ d->domain_id, gfn + i, mfn + i, ret);
while ( i-- )
clear_mmio_p2m_entry(d, gfn + i);
if ( iomem_deny_access(d, mfn, mfn + nr_mfns - 1) &&
@@ -690,20 +689,22 @@ long arch_do_domctl(
}
else
{
+ int tmp_rc;
printk(XENLOG_G_INFO
"memory_map:remove: dom%d gfn=%lx mfn=%lx nr=%lx\n",
d->domain_id, gfn, mfn, nr_mfns);
if ( paging_mode_translate(d) )
for ( i = 0; i < nr_mfns; i++ )
- add |= !clear_mmio_p2m_entry(d, gfn + i);
- ret = iomem_deny_access(d, mfn, mfn + nr_mfns - 1);
- if ( !ret && add )
- ret = -EIO;
+ if ( (tmp_rc = clear_mmio_p2m_entry(d, gfn + i)) )
+ ret = tmp_rc;
+ tmp_rc = iomem_deny_access(d, mfn, mfn + nr_mfns - 1);
+ if ( !ret && tmp_rc )
+ ret = tmp_rc;
if ( ret && is_hardware_domain(current->domain) )
printk(XENLOG_ERR
"memory_map: error %ld %s dom%d access to [%lx,%lx]\n",
- ret, add ? "removing" : "denying", d->domain_id,
+ ret, tmp_rc ? "denying" : "removing", d->domain_id,
mfn, mfn + nr_mfns - 1);
}
}
diff --git a/xen/arch/x86/mm/hap/nested_hap.c b/xen/arch/x86/mm/hap/nested_hap.c
index 78701dc..5c41725 100644
--- a/xen/arch/x86/mm/hap/nested_hap.c
+++ b/xen/arch/x86/mm/hap/nested_hap.c
@@ -103,7 +103,7 @@ nestedhap_fix_p2m(struct vcpu *v, struct p2m_domain *p2m,
paddr_t L2_gpa, paddr_t L0_gpa,
unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
{
- int rv = 1;
+ int rc = 0;
ASSERT(p2m);
ASSERT(p2m->set_entry);
@@ -124,15 +124,16 @@ nestedhap_fix_p2m(struct vcpu *v, struct p2m_domain *p2m,
gfn = (L2_gpa >> PAGE_SHIFT) & mask;
mfn = _mfn((L0_gpa >> PAGE_SHIFT) & mask);
- rv = p2m_set_entry(p2m, gfn, mfn, page_order, p2mt, p2ma);
+ rc = p2m_set_entry(p2m, gfn, mfn, page_order, p2mt, p2ma);
}
p2m_unlock(p2m);
- if (rv == 0) {
+ if ( rc )
+ {
gdprintk(XENLOG_ERR,
- "failed to set entry for %#"PRIx64" -> %#"PRIx64"\n",
- L2_gpa, L0_gpa);
+ "failed to set entry for %#"PRIx64" -> %#"PRIx64" rc:%d\n",
+ L2_gpa, L0_gpa, rc);
BUG();
}
}
diff --git a/xen/arch/x86/mm/mem_sharing.c b/xen/arch/x86/mm/mem_sharing.c
index 0968681..61f0b22 100644
--- a/xen/arch/x86/mm/mem_sharing.c
+++ b/xen/arch/x86/mm/mem_sharing.c
@@ -1021,7 +1021,7 @@ int mem_sharing_share_pages(struct domain *sd, unsigned
long sgfn, shr_handle_t
put_page_and_type(cpage);
d = get_domain_by_id(gfn->domain);
BUG_ON(!d);
- BUG_ON(set_shared_p2m_entry(d, gfn->gfn, smfn) == 0);
+ BUG_ON(set_shared_p2m_entry(d, gfn->gfn, smfn));
put_domain(d);
}
ASSERT(list_empty(&cpage->sharing->gfns));
@@ -1095,13 +1095,11 @@ int mem_sharing_add_to_physmap(struct domain *sd,
unsigned long sgfn, shr_handle
ret = p2m_set_entry(p2m, cgfn, smfn, PAGE_ORDER_4K, p2m_ram_shared, a);
/* Tempted to turn this into an assert */
- if ( !ret )
+ if ( ret )
{
- ret = -ENOENT;
mem_sharing_gfn_destroy(spage, cd, gfn_info);
put_page_and_type(spage);
} else {
- ret = 0;
/* There is a chance we're plugging a hole where a paged out page was
*/
if ( p2m_is_paging(cmfn_type) && (cmfn_type != p2m_ram_paging_out) )
{
@@ -1232,7 +1230,7 @@ int __mem_sharing_unshare_page(struct domain *d,
unmap_domain_page(s);
unmap_domain_page(t);
- BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)) == 0);
+ BUG_ON(set_shared_p2m_entry(d, gfn, page_to_mfn(page)));
mem_sharing_gfn_destroy(old_page, d, gfn_info);
mem_sharing_page_unlock(old_page);
put_page_and_type(old_page);
@@ -1288,7 +1286,7 @@ int relinquish_shared_pages(struct domain *d)
* we hold the p2m lock. */
set_rc = p2m->set_entry(p2m, gfn, _mfn(0), PAGE_ORDER_4K,
p2m_invalid, p2m_access_rwx);
- ASSERT(set_rc != 0);
+ ASSERT(set_rc == 0);
count += 0x10;
}
else
diff --git a/xen/arch/x86/mm/p2m-ept.c b/xen/arch/x86/mm/p2m-ept.c
index 99a1084..a219f8b 100644
--- a/xen/arch/x86/mm/p2m-ept.c
+++ b/xen/arch/x86/mm/p2m-ept.c
@@ -273,6 +273,8 @@ static int ept_next_level(struct p2m_domain *p2m, bool_t
read_only,
/*
* ept_set_entry() computes 'need_modify_vtd_table' for itself,
* by observing whether any gfn->mfn translations are modified.
+ *
+ * Returns: 0 for success, -errno for failure
*/
static int
ept_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
@@ -281,7 +283,7 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn,
mfn_t mfn,
ept_entry_t *table, *ept_entry = NULL;
unsigned long gfn_remainder = gfn;
int i, target = order / EPT_TABLE_ORDER;
- int rv = 0;
+ int rc = 0;
int ret = 0;
bool_t direct_mmio = (p2mt == p2m_mmio_direct);
uint8_t ipat = 0;
@@ -302,7 +304,7 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn,
mfn_t mfn,
if ( ((gfn | mfn_x(mfn)) & ((1UL << order) - 1)) ||
((u64)gfn >> ((ept_get_wl(ept) + 1) * EPT_TABLE_ORDER)) ||
(order % EPT_TABLE_ORDER) )
- return 0;
+ return -EINVAL;
ASSERT((target == 2 && hvm_hap_has_1gb()) ||
(target == 1 && hvm_hap_has_2mb()) ||
@@ -314,7 +316,10 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn,
mfn_t mfn,
{
ret = ept_next_level(p2m, 0, &table, &gfn_remainder, i);
if ( !ret )
+ {
+ rc = -ENOENT;
goto out;
+ }
else if ( ret != GUEST_TABLE_NORMAL_PAGE )
break;
}
@@ -386,6 +391,7 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn,
mfn_t mfn,
if ( !ept_split_super_page(p2m, &split_ept_entry, i, target) )
{
ept_free_entry(p2m, &split_ept_entry, i);
+ rc = -ENOMEM;
goto out;
}
@@ -426,9 +432,6 @@ ept_set_entry(struct p2m_domain *p2m, unsigned long gfn,
mfn_t mfn,
(gfn + (1UL << order) - 1 > p2m->max_mapped_pfn) )
p2m->max_mapped_pfn = gfn + (1UL << order) - 1;
- /* Success */
- rv = 1;
-
out:
unmap_domain_page(table);
@@ -436,7 +439,7 @@ out:
ept_sync_domain(p2m);
/* For non-nested p2m, may need to change VT-d page table.*/
- if ( rv && !p2m_is_nestedp2m(p2m) && need_iommu(d) &&
+ if ( rc == 0 && !p2m_is_nestedp2m(p2m) && need_iommu(d) &&
need_modify_vtd_table )
{
if ( iommu_hap_pt_share )
@@ -460,7 +463,7 @@ out:
if ( is_epte_present(&old_entry) )
ept_free_entry(p2m, &old_entry, target);
- return rv;
+ return rc;
}
/* Read ept p2m entries */
diff --git a/xen/arch/x86/mm/p2m-pod.c b/xen/arch/x86/mm/p2m-pod.c
index 3c86255..68db937 100644
--- a/xen/arch/x86/mm/p2m-pod.c
+++ b/xen/arch/x86/mm/p2m-pod.c
@@ -1150,10 +1150,9 @@ guest_physmap_mark_populate_on_demand(struct domain *d,
unsigned long gfn,
}
/* Now, actually do the two-way mapping */
- if ( !p2m_set_entry(p2m, gfn, _mfn(0), order,
- p2m_populate_on_demand, p2m->default_access) )
- rc = -EINVAL;
- else
+ rc = p2m_set_entry(p2m, gfn, _mfn(0), order, p2m_populate_on_demand,
+ p2m->default_access);
+ if ( rc == 0 )
{
pod_lock(p2m);
p2m->pod.entry_count += 1 << order;
diff --git a/xen/arch/x86/mm/p2m-pt.c b/xen/arch/x86/mm/p2m-pt.c
index 849ae08..3c4e688 100644
--- a/xen/arch/x86/mm/p2m-pt.c
+++ b/xen/arch/x86/mm/p2m-pt.c
@@ -154,6 +154,7 @@ static void p2m_add_iommu_flags(l1_pgentry_t *p2m_entry,
l1e_add_flags(*p2m_entry, iommu_nlevel_to_flags(nlevel, flags));
}
+/* Returns: 0 for success, -errno for failure */
static int
p2m_next_level(struct p2m_domain *p2m, mfn_t *table_mfn, void **table,
unsigned long *gfn_remainder, unsigned long gfn, u32 shift,
@@ -167,7 +168,7 @@ p2m_next_level(struct p2m_domain *p2m, mfn_t *table_mfn,
void **table,
if ( !(p2m_entry = p2m_find_entry(*table, gfn_remainder, gfn,
shift, max)) )
- return 0;
+ return -ENOENT;
/* PoD/paging: Not present doesn't imply empty. */
if ( !l1e_get_flags(*p2m_entry) )
@@ -176,7 +177,7 @@ p2m_next_level(struct p2m_domain *p2m, mfn_t *table_mfn,
void **table,
pg = p2m_alloc_ptp(p2m, type);
if ( pg == NULL )
- return 0;
+ return -ENOMEM;
new_entry = l1e_from_pfn(mfn_x(page_to_mfn(pg)),
__PAGE_HYPERVISOR | _PAGE_USER);
@@ -210,7 +211,7 @@ p2m_next_level(struct p2m_domain *p2m, mfn_t *table_mfn,
void **table,
pg = p2m_alloc_ptp(p2m, PGT_l2_page_table);
if ( pg == NULL )
- return 0;
+ return -ENOMEM;
flags = l1e_get_flags(*p2m_entry);
pfn = l1e_get_pfn(*p2m_entry);
@@ -239,7 +240,7 @@ p2m_next_level(struct p2m_domain *p2m, mfn_t *table_mfn,
void **table,
pg = p2m_alloc_ptp(p2m, PGT_l1_page_table);
if ( pg == NULL )
- return 0;
+ return -ENOMEM;
/* New splintered mappings inherit the flags of the old superpage,
* with a little reorganisation for the _PAGE_PSE_PAT bit. */
@@ -272,23 +273,23 @@ p2m_next_level(struct p2m_domain *p2m, mfn_t *table_mfn,
void **table,
unmap_domain_page(*table);
*table = next;
- return 1;
+ return 0;
}
-// Returns 0 on error (out of memory)
+/* Returns: 0 for success, -errno for failure */
static int
p2m_pt_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
{
- // XXX -- this might be able to be faster iff current->domain == d
+ /* XXX -- this might be able to be faster iff current->domain == d */
mfn_t table_mfn = pagetable_get_mfn(p2m_get_pagetable(p2m));
- void *table =map_domain_page(mfn_x(table_mfn));
+ void *table = map_domain_page(mfn_x(table_mfn));
unsigned long i, gfn_remainder = gfn;
l1_pgentry_t *p2m_entry;
l1_pgentry_t entry_content;
l2_pgentry_t l2e_content;
l3_pgentry_t l3e_content;
- int rv=0;
+ int rc;
unsigned int iommu_pte_flags = (p2mt == p2m_ram_rw) ?
IOMMUF_readable|IOMMUF_writable:
0;
@@ -311,9 +312,10 @@ p2m_pt_set_entry(struct p2m_domain *p2m, unsigned long
gfn, mfn_t mfn,
__trace_var(TRC_MEM_SET_P2M_ENTRY, 0, sizeof(t), &t);
}
- if ( !p2m_next_level(p2m, &table_mfn, &table, &gfn_remainder, gfn,
- L4_PAGETABLE_SHIFT - PAGE_SHIFT,
- L4_PAGETABLE_ENTRIES, PGT_l3_page_table) )
+ rc = p2m_next_level(p2m, &table_mfn, &table, &gfn_remainder, gfn,
+ L4_PAGETABLE_SHIFT - PAGE_SHIFT,
+ L4_PAGETABLE_ENTRIES, PGT_l3_page_table);
+ if ( rc )
goto out;
/*
@@ -354,17 +356,18 @@ p2m_pt_set_entry(struct p2m_domain *p2m, unsigned long
gfn, mfn_t mfn,
if ( l1e_get_flags(old_entry) & _PAGE_PRESENT )
p2m_free_entry(p2m, &old_entry, page_order);
}
- else if ( !p2m_next_level(p2m, &table_mfn, &table, &gfn_remainder, gfn,
- L3_PAGETABLE_SHIFT - PAGE_SHIFT,
- L3_PAGETABLE_ENTRIES,
- PGT_l2_page_table) )
+ else if ( (rc = p2m_next_level(p2m, &table_mfn, &table, &gfn_remainder,
+ gfn, L3_PAGETABLE_SHIFT - PAGE_SHIFT,
+ L3_PAGETABLE_ENTRIES,
+ PGT_l2_page_table)) )
goto out;
if ( page_order == PAGE_ORDER_4K )
{
- if ( !p2m_next_level(p2m, &table_mfn, &table, &gfn_remainder, gfn,
- L2_PAGETABLE_SHIFT - PAGE_SHIFT,
- L2_PAGETABLE_ENTRIES, PGT_l1_page_table) )
+ rc = p2m_next_level(p2m, &table_mfn, &table, &gfn_remainder, gfn,
+ L2_PAGETABLE_SHIFT - PAGE_SHIFT,
+ L2_PAGETABLE_ENTRIES, PGT_l1_page_table);
+ if ( rc )
goto out;
p2m_entry = p2m_find_entry(table, &gfn_remainder, gfn,
@@ -452,12 +455,9 @@ p2m_pt_set_entry(struct p2m_domain *p2m, unsigned long
gfn, mfn_t mfn,
}
}
- /* Success */
- rv = 1;
-
-out:
+ out:
unmap_domain_page(table);
- return rv;
+ return rc;
}
static mfn_t
diff --git a/xen/arch/x86/mm/p2m.c b/xen/arch/x86/mm/p2m.c
index e16f31a..0c300a3 100644
--- a/xen/arch/x86/mm/p2m.c
+++ b/xen/arch/x86/mm/p2m.c
@@ -308,14 +308,14 @@ struct page_info *get_page_from_gfn_p2m(
return page;
}
-
+/* Returns: 0 for success, -errno for failure */
int p2m_set_entry(struct p2m_domain *p2m, unsigned long gfn, mfn_t mfn,
unsigned int page_order, p2m_type_t p2mt, p2m_access_t p2ma)
{
struct domain *d = p2m->domain;
unsigned long todo = 1ul << page_order;
unsigned int order;
- int rc = 1;
+ int set_rc, rc = 1;
ASSERT(gfn_locked_by_me(p2m, gfn));
@@ -329,8 +329,8 @@ int p2m_set_entry(struct p2m_domain *p2m, unsigned long
gfn, mfn_t mfn,
else
order = 0;
- if ( !p2m->set_entry(p2m, gfn, mfn, order, p2mt, p2ma) )
- rc = 0;
+ if ( (set_rc = p2m->set_entry(p2m, gfn, mfn, order, p2mt, p2ma)) )
+ rc = set_rc;
gfn += 1ul << order;
if ( mfn_x(mfn) != INVALID_MFN )
mfn = _mfn(mfn_x(mfn) + (1ul << order));
@@ -370,17 +370,19 @@ void p2m_free_ptp(struct p2m_domain *p2m, struct
page_info *pg)
return;
}
-// Allocate a new p2m table for a domain.
-//
-// The structure of the p2m table is that of a pagetable for xen (i.e. it is
-// controlled by CONFIG_PAGING_LEVELS).
-//
-// Returns 0 for success or -errno.
-//
+/*
+ * Allocate a new p2m table for a domain.
+ *
+ * The structure of the p2m table is that of a pagetable for xen (i.e. it is
+ * controlled by CONFIG_PAGING_LEVELS).
+ *
+ * Returns 0 for success, -errno for failure.
+ */
int p2m_alloc_table(struct p2m_domain *p2m)
{
struct page_info *p2m_top;
struct domain *d = p2m->domain;
+ int rc = 0;
p2m_lock(p2m);
@@ -417,8 +419,8 @@ int p2m_alloc_table(struct p2m_domain *p2m)
/* Initialise physmap tables for slot zero. Other code assumes this. */
p2m->defer_nested_flush = 1;
- if ( !p2m_set_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K,
- p2m_invalid, p2m->default_access) )
+ if ( (rc = p2m_set_entry(p2m, 0, _mfn(INVALID_MFN), PAGE_ORDER_4K,
+ p2m_invalid, p2m->default_access)) )
goto error;
p2m->defer_nested_flush = 0;
@@ -428,9 +430,9 @@ int p2m_alloc_table(struct p2m_domain *p2m)
spin_unlock(&p2m->domain->page_alloc_lock);
error:
- P2M_PRINTK("failed to initialise p2m table for slot zero\n");
+ P2M_PRINTK("failed to initialise p2m table for slot zero. rc:%d\n", rc);
p2m_unlock(p2m);
- return -ENOMEM;
+ return rc;
}
void p2m_teardown(struct p2m_domain *p2m)
@@ -636,12 +638,10 @@ guest_physmap_add_entry(struct domain *d, unsigned long
gfn,
/* Now, actually do the two-way mapping */
if ( mfn_valid(_mfn(mfn)) )
{
- if ( !p2m_set_entry(p2m, gfn, _mfn(mfn), page_order, t,
- p2m->default_access) )
- {
- rc = -EINVAL;
+ if ( (rc = p2m_set_entry(p2m, gfn, _mfn(mfn), page_order, t,
+ p2m->default_access)) )
goto out; /* Failed to update p2m, bail without updating m2p. */
- }
+
if ( !p2m_is_grant(t) )
{
for ( i = 0; i < (1UL << page_order); i++ )
@@ -652,10 +652,8 @@ guest_physmap_add_entry(struct domain *d, unsigned long
gfn,
{
gdprintk(XENLOG_WARNING, "Adding bad mfn to p2m map (%#lx -> %#lx)\n",
gfn, mfn);
- if ( !p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order,
- p2m_invalid, p2m->default_access) )
- rc = -EINVAL;
- else
+ if ( (rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), page_order,
+ p2m_invalid, p2m->default_access)) == 0 )
{
pod_lock(p2m);
p2m->pod.entry_count -= pod_count;
@@ -742,9 +740,8 @@ void p2m_change_type_range(struct domain *d,
}
-
-int
-set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
+/* Returns: 0 for success, -errno for failure */
+int set_mmio_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
{
int rc = 0;
p2m_access_t a;
@@ -753,7 +750,7 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn,
mfn_t mfn)
struct p2m_domain *p2m = p2m_get_hostp2m(d);
if ( !paging_mode_translate(d) )
- return 0;
+ return -EPERM;
gfn_lock(p2m, gfn, 0);
omfn = p2m->get_entry(p2m, gfn, &ot, &a, 0, NULL);
@@ -761,7 +758,7 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn,
mfn_t mfn)
{
p2m_unlock(p2m);
domain_crash(d);
- return 0;
+ return -ENOENT;
}
else if ( p2m_is_ram(ot) )
{
@@ -773,24 +770,24 @@ set_mmio_p2m_entry(struct domain *d, unsigned long gfn,
mfn_t mfn)
rc = p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_mmio_direct,
p2m->default_access);
gfn_unlock(p2m, gfn, 0);
- if ( 0 == rc )
+ if ( rc )
gdprintk(XENLOG_ERR,
- "set_mmio_p2m_entry: p2m_set_entry failed! mfn=%08lx\n",
- mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot)));
+ "p2m_set_entry failed! mfn=%08lx rc:%d\n",
+ mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot)), rc);
return rc;
}
-int
-clear_mmio_p2m_entry(struct domain *d, unsigned long gfn)
+/* Returns: 0 for success, -errno for failure */
+int clear_mmio_p2m_entry(struct domain *d, unsigned long gfn)
{
- int rc = 0;
+ int rc = -EINVAL;
mfn_t mfn;
p2m_access_t a;
p2m_type_t t;
struct p2m_domain *p2m = p2m_get_hostp2m(d);
if ( !paging_mode_translate(d) )
- return 0;
+ return -EPERM;
gfn_lock(p2m, gfn, 0);
mfn = p2m->get_entry(p2m, gfn, &t, &a, 0, NULL);
@@ -799,20 +796,20 @@ clear_mmio_p2m_entry(struct domain *d, unsigned long gfn)
if ( (INVALID_MFN == mfn_x(mfn)) || (t != p2m_mmio_direct) )
{
gdprintk(XENLOG_ERR,
- "clear_mmio_p2m_entry: gfn_to_mfn failed! gfn=%08lx\n", gfn);
+ "gfn_to_mfn failed! gfn=%08lx type:%d\n", gfn, t);
goto out;
}
rc = p2m_set_entry(p2m, gfn, _mfn(INVALID_MFN), PAGE_ORDER_4K, p2m_invalid,
p2m->default_access);
-out:
+ out:
gfn_unlock(p2m, gfn, 0);
return rc;
}
-int
-set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
+/* Returns: 0 for success, -errno for failure */
+int set_shared_p2m_entry(struct domain *d, unsigned long gfn, mfn_t mfn)
{
struct p2m_domain *p2m = p2m_get_hostp2m(d);
int rc = 0;
@@ -822,7 +819,7 @@ set_shared_p2m_entry(struct domain *d, unsigned long gfn,
mfn_t mfn)
unsigned long pg_type;
if ( !paging_mode_translate(p2m->domain) )
- return 0;
+ return -EPERM;
gfn_lock(p2m, gfn, 0);
omfn = p2m->get_entry(p2m, gfn, &ot, &a, 0, NULL);
@@ -841,10 +838,10 @@ set_shared_p2m_entry(struct domain *d, unsigned long gfn,
mfn_t mfn)
rc = p2m_set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2m_ram_shared,
p2m->default_access);
gfn_unlock(p2m, gfn, 0);
- if ( 0 == rc )
+ if ( rc )
gdprintk(XENLOG_ERR,
- "set_shared_p2m_entry: p2m_set_entry failed! mfn=%08lx\n",
- mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot)));
+ "p2m_set_entry failed! mfn=%08lx rc:%d\n",
+ mfn_x(get_gfn_query_unlocked(p2m->domain, gfn, &ot)), rc);
return rc;
}
@@ -1263,7 +1260,7 @@ bool_t p2m_mem_access_check(paddr_t gpa, bool_t
gla_valid, unsigned long gla,
if ( access_w && p2ma == p2m_access_rx2rw )
{
rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K, p2mt, p2m_access_rw);
- ASSERT(rc);
+ ASSERT(rc == 0);
gfn_unlock(p2m, gfn, 0);
return 1;
}
@@ -1272,7 +1269,7 @@ bool_t p2m_mem_access_check(paddr_t gpa, bool_t
gla_valid, unsigned long gla,
ASSERT(access_w || access_r || access_x);
rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
p2mt, p2m_access_rwx);
- ASSERT(rc);
+ ASSERT(rc == 0);
}
gfn_unlock(p2m, gfn, 0);
@@ -1299,7 +1296,7 @@ bool_t p2m_mem_access_check(paddr_t gpa, bool_t
gla_valid, unsigned long gla,
* gfn locked and just did a successful get_entry(). */
rc = p2m->set_entry(p2m, gfn, mfn, PAGE_ORDER_4K,
p2mt, p2m_access_rwx);
- ASSERT(rc);
+ ASSERT(rc == 0);
}
gfn_unlock(p2m, gfn, 0);
return 1;
@@ -1401,11 +1398,8 @@ long p2m_set_mem_access(struct domain *d, unsigned long
pfn, uint32_t nr,
for ( pfn += start; nr > start; ++pfn )
{
mfn = p2m->get_entry(p2m, pfn, &t, &_a, 0, NULL);
- if ( p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a) == 0 )
- {
- rc = -ENOMEM;
+ if ( (rc = p2m->set_entry(p2m, pfn, mfn, PAGE_ORDER_4K, t, a)) )
break;
- }
/* Check for continuation if it's not the last interation. */
if ( nr > ++start && !(start & mask) && hypercall_preempt_check() )
--
1.8.3.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |