From patchwork Wed Jan 4 12:39:23 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andrew Cooper X-Patchwork-Id: 9496629 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 101EE606DD for ; Wed, 4 Jan 2017 12:42:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 0183D27F86 for ; Wed, 4 Jan 2017 12:42:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id EAC8727F8C; Wed, 4 Jan 2017 12:42:28 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.2 required=2.0 tests=BAYES_00, RCVD_IN_DNSWL_MED autolearn=ham version=3.3.1 Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id 985F527F86 for ; Wed, 4 Jan 2017 12:42:28 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cOkrg-00045g-Fe; Wed, 04 Jan 2017 12:40:24 +0000 Received: from mail6.bemta6.messagelabs.com ([193.109.254.103]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cOkre-00040a-DE for xen-devel@lists.xen.org; Wed, 04 Jan 2017 12:40:22 +0000 Received: from [193.109.254.147] by server-6.bemta-6.messagelabs.com id 57/2B-15112-63DEC685; Wed, 04 Jan 2017 12:40:22 +0000 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmphkeJIrShJLcpLzFFi42JxWrrBXtf4bU6 Ewb0TShZLPi5mcWD0OLr7N1MAYxRrZl5SfkUCa8bNzvVsBbskKr6fX8rawPhcqIuRk0NCwF/i 37tVjCA2m4C+xO4Xn5hAbBEBdYnTHRdZuxg5OJgF/CQOPfAFCQsDmdven2YFsVkEVCQ2XPvLD GLzCnhIbFx1lhlipJzE+eM/wWxOAU+JZxvXgY0XAqqZcnEZO4StJnGt/xI7RK+gxMmZT1hAbG YBCYmDL14wT2DknYUkNQtJagEj0ypGjeLUorLUIl0jY72kosz0jJLcxMwcXUMDM73c1OLixPT UnMSkYr3k/NxNjMDQYQCCHYx/5gceYpTkYFIS5e1rz4kQ4kvKT6nMSCzOiC8qzUktPsQow8Gh JMGr9gYoJ1iUmp5akZaZAwximLQEB4+SCG/na6A0b3FBYm5xZjpE6hSjopQ4rzZInwBIIqM0D 64NFjmXGGWlhHkZgQ4R4ilILcrNLEGVf8UozsGoJMzrAzKFJzOvBG76K6DFTECLtwdkgywuSU RISTUwargbBrDFlUakq6/aUL4p5nlEo2NqcNqkHUECyjOncd1gLEtw4Y97l2d8xf32KUP/fhP dd+4bmT9O5OFim/YidtK3aQx3w1pfZ5e2BW24sXWG9lGnVpPXOtunvPfhmsGh6iaxqWNz1MHK lv0bpussmlrX909T33zxuY0GJdrsc3ZrSa+/dFhBiaU4I9FQi7moOBEAs2mf0pcCAAA= X-Env-Sender: prvs=1701003ad=Andrew.Cooper3@citrix.com X-Msg-Ref: server-6.tower-27.messagelabs.com!1483533615!80438114!3 X-Originating-IP: [66.165.176.63] X-SpamReason: No, hits=0.0 required=7.0 tests=sa_preprocessor: VHJ1c3RlZCBJUDogNjYuMTY1LjE3Ni42MyA9PiAzMDYwNDg=\n, received_headers: No Received headers X-StarScan-Received: X-StarScan-Version: 9.1.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 60182 invoked from network); 4 Jan 2017 12:40:19 -0000 Received: from smtp02.citrix.com (HELO SMTP02.CITRIX.COM) (66.165.176.63) by server-6.tower-27.messagelabs.com with RC4-SHA encrypted SMTP; 4 Jan 2017 12:40:19 -0000 X-IronPort-AV: E=Sophos;i="5.33,459,1477958400"; d="scan'208";a="406723821" From: Andrew Cooper To: Xen-devel Date: Wed, 4 Jan 2017 12:39:23 +0000 Message-ID: <1483533584-8015-7-git-send-email-andrew.cooper3@citrix.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1483533584-8015-1-git-send-email-andrew.cooper3@citrix.com> References: <1483533584-8015-1-git-send-email-andrew.cooper3@citrix.com> MIME-Version: 1.0 Cc: Andrew Cooper , Jan Beulich Subject: [Xen-devel] [PATCH 06/27] x86/domctl: Make XEN_DOMCTL_set_address_size singleshot X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" X-Virus-Scanned: ClamAV using ClamSMTP Toolstacks (including some out-of-tree ones) use XEN_DOMCTL_set_address_size at most once per domain, and it ends up having a destructive effect on the available CPUID policy for a domain. To avoid ordering issues between altering the policy via domctl, and the constructive effects which would have to happen from switching back to native, explicitly reject this case. Signed-off-by: Andrew Cooper Reviewed-by: Jan Beulich --- CC: Jan Beulich --- xen/arch/x86/domain.c | 33 +-------------------------------- xen/arch/x86/domctl.c | 17 ++++++----------- xen/include/xen/compat.h | 1 - 3 files changed, 7 insertions(+), 44 deletions(-) diff --git a/xen/arch/x86/domain.c b/xen/arch/x86/domain.c index 3082a6c..c1f95cc 100644 --- a/xen/arch/x86/domain.c +++ b/xen/arch/x86/domain.c @@ -322,43 +322,12 @@ static void release_compat_l4(struct vcpu *v) v->arch.guest_table_user = pagetable_null(); } -static inline int may_switch_mode(struct domain *d) -{ - return (!is_hvm_domain(d) && (d->tot_pages == 0)); -} - -int switch_native(struct domain *d) -{ - struct vcpu *v; - - if ( !may_switch_mode(d) ) - return -EACCES; - if ( !is_pv_32bit_domain(d) && !is_pvh_32bit_domain(d) ) - return 0; - - d->arch.is_32bit_pv = d->arch.has_32bit_shinfo = 0; - - for_each_vcpu( d, v ) - { - free_compat_arg_xlat(v); - - if ( !is_pvh_domain(d) ) - release_compat_l4(v); - else - hvm_set_mode(v, 8); - } - - d->arch.x87_fip_width = cpu_has_fpu_sel ? 0 : 8; - - return 0; -} - int switch_compat(struct domain *d) { struct vcpu *v; int rc; - if ( !may_switch_mode(d) ) + if ( is_hvm_domain(d) || d->tot_pages != 0 ) return -EACCES; if ( is_pv_32bit_domain(d) || is_pvh_32bit_domain(d) ) return 0; diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index eb71c9e..069f1fe 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -514,18 +514,13 @@ long arch_do_domctl( break; case XEN_DOMCTL_set_address_size: - switch ( domctl->u.address_size.size ) - { - case 32: + if ( ((domctl->u.address_size.size == 64) && !d->arch.is_32bit_pv) || + ((domctl->u.address_size.size == 32) && d->arch.is_32bit_pv) ) + ret = 0; + else if ( domctl->u.address_size.size == 32 ) ret = switch_compat(d); - break; - case 64: - ret = switch_native(d); - break; - default: - ret = (domctl->u.address_size.size == BITS_PER_LONG) ? 0 : -EINVAL; - break; - } + else + ret = -EINVAL; break; case XEN_DOMCTL_get_address_size: diff --git a/xen/include/xen/compat.h b/xen/include/xen/compat.h index ce913ac..0868350 100644 --- a/xen/include/xen/compat.h +++ b/xen/include/xen/compat.h @@ -231,7 +231,6 @@ struct vcpu_runstate_info; void xlat_vcpu_runstate_info(struct vcpu_runstate_info *); int switch_compat(struct domain *); -int switch_native(struct domain *); #else