From mboxrd@z Thu Jan 1 00:00:00 1970 From: Boris Ostrovsky Subject: [PATCH 4/9] x86/compat: Manage argument translation area separately from l4 Date: Fri, 19 Jun 2015 23:09:27 -0400 Message-ID: <1434769773-5157-5-git-send-email-boris.ostrovsky@oracle.com> References: <1434769773-5157-1-git-send-email-boris.ostrovsky@oracle.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: <1434769773-5157-1-git-send-email-boris.ostrovsky@oracle.com> List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: xen-devel@lists.xen.org Cc: elena.ufimtseva@oracle.com, Keir Fraser , Andrew Cooper , tim@xen.org, Jan Beulich , Boris Ostrovsky , roger.pau@citrix.com List-Id: xen-devel@lists.xenproject.org Managing l4 page table and argument translation area are two unrelated operations and should be handled separately Signed-off-by: Boris Ostrovsky CC: Keir Fraser CC: Jan Beulich CC: Andrew Cooper --- xen/arch/x86/domain.c | 36 ++++++++++++++++++++++++++---------- 1 files changed, 26 insertions(+), 10 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index ba28f38..2445b8b 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_arg_xlat(v)) ) + goto undo_and_fail; + if ( (rc = setup_compat_l4(v)) ) 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); -- 1.7.1