|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen master] x86/compat: manage argument translation area separately from l4
commit 64cb2c00d544d7d2b0beb4f93ed4851eeab8c567
Author: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
AuthorDate: Tue Jun 23 18:04:23 2015 +0200
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Tue Jun 23 18:06:27 2015 +0200
x86/compat: manage argument translation area separately from l4
Managing l4 page table and argument translation area are two unrelated
operations and should be handled separately
Signed-off-by: Boris Ostrovsky <boris.ostrovsky@xxxxxxxxxx>
---
xen/arch/x86/domain.c | 38 +++++++++++++++++++++++++++-----------
1 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c
index ba28f38..29f3c1a 100644
--- a/xen/arch/x86/domain.c
+++ b/xen/arch/x86/domain.c
@@ -321,19 +321,11 @@ static int setup_compat_l4(struct vcpu *v)
{
struct page_info *pg;
l4_pgentry_t *l4tab;
- int rc;
pg = alloc_domheap_page(v->domain, MEMF_no_owner);
if ( pg == NULL )
return -ENOMEM;
- rc = setup_compat_arg_xlat(v);
- if ( rc )
- {
- free_domheap_page(pg);
- return rc;
- }
-
/* This page needs to look like a pagetable so that it can be shadowed */
pg->u.inuse.type_info = PGT_l4_page_table|PGT_validated|1;
@@ -350,7 +342,6 @@ static int setup_compat_l4(struct vcpu *v)
static void release_compat_l4(struct vcpu *v)
{
- free_compat_arg_xlat(v);
free_domheap_page(pagetable_get_page(v->arch.guest_table));
v->arch.guest_table = pagetable_null();
v->arch.guest_table_user = pagetable_null();
@@ -373,7 +364,10 @@ int switch_native(struct domain *d)
d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;
for_each_vcpu( d, v )
+ {
+ free_compat_arg_xlat(v);
release_compat_l4(v);
+ }
return 0;
}
@@ -398,8 +392,13 @@ int switch_compat(struct domain *d)
d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 1;
for_each_vcpu( d, v )
- if ( (rc = setup_compat_l4(v)) )
+ {
+ rc = setup_compat_arg_xlat(v);
+ if ( !rc )
+ rc = setup_compat_l4(v);
+ if ( rc )
goto undo_and_fail;
+ }
domain_set_alloc_bitsize(d);
@@ -408,8 +407,12 @@ int switch_compat(struct domain *d)
undo_and_fail:
d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0;
for_each_vcpu( d, v )
+ {
+ free_compat_arg_xlat(v);
+
if ( !pagetable_is_null(v->arch.guest_table) )
release_compat_l4(v);
+ }
return rc;
}
@@ -481,7 +484,17 @@ int vcpu_initialise(struct vcpu *v)
v->arch.pv_vcpu.ctrlreg[4] = real_cr4_to_pv_guest_cr4(mmu_cr4_features);
- rc = is_pv_32on64_domain(d) ? setup_compat_l4(v) : 0;
+ if ( is_pv_32on64_domain(d) )
+ {
+ if ( (rc = setup_compat_arg_xlat(v)) )
+ goto done;
+
+ if ( (rc = setup_compat_l4(v)) )
+ {
+ free_compat_arg_xlat(v);
+ goto done;
+ }
+ }
done:
if ( rc )
{
@@ -497,7 +510,10 @@ int vcpu_initialise(struct vcpu *v)
void vcpu_destroy(struct vcpu *v)
{
if ( is_pv_32on64_vcpu(v) )
+ {
+ free_compat_arg_xlat(v);
release_compat_l4(v);
+ }
vcpu_destroy_fpu(v);
--
generated by git-patchbot for /home/xen/git/xen.git#master
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |