From patchwork Fri Jan 8 13:08:32 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Juergen Gross X-Patchwork-Id: 7985601 Return-Path: X-Original-To: patchwork-xen-devel@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 2D9599F6FA for ; Fri, 8 Jan 2016 13:11:06 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 1FC1F2017E for ; Fri, 8 Jan 2016 13:11:05 +0000 (UTC) Received: from lists.xen.org (lists.xenproject.org [50.57.142.19]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id F11B12014A for ; Fri, 8 Jan 2016 13:11:03 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=lists.xen.org) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aHWmn-0006Ck-4V; Fri, 08 Jan 2016 13:08:57 +0000 Received: from mail6.bemta14.messagelabs.com ([193.109.254.103]) by lists.xen.org with esmtp (Exim 4.72) (envelope-from ) id 1aHWmk-0006BS-C1 for xen-devel@lists.xen.org; Fri, 08 Jan 2016 13:08:54 +0000 Received: from [193.109.254.147] by server-9.bemta-14.messagelabs.com id E8/4B-13475-5E4BF865; Fri, 08 Jan 2016 13:08:53 +0000 X-Env-Sender: jgross@suse.com X-Msg-Ref: server-2.tower-27.messagelabs.com!1452258532!13554403!1 X-Originating-IP: [195.135.220.15] X-SpamReason: No, hits=0.5 required=7.0 tests=BODY_RANDOM_LONG X-StarScan-Received: X-StarScan-Version: 7.35.1; banners=-,-,- X-VirusChecked: Checked Received: (qmail 36537 invoked from network); 8 Jan 2016 13:08:52 -0000 Received: from mx2.suse.de (HELO mx2.suse.de) (195.135.220.15) by server-2.tower-27.messagelabs.com with DHE-RSA-CAMELLIA256-SHA encrypted SMTP; 8 Jan 2016 13:08:52 -0000 X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay1.suse.de (charybdis-ext.suse.de [195.135.220.254]) by mx2.suse.de (Postfix) with ESMTP id 16AF4AD69; Fri, 8 Jan 2016 13:08:51 +0000 (UTC) From: Juergen Gross To: xen-devel@lists.xen.org, Ian.Campbell@citrix.com, ian.jackson@eu.citrix.com, stefano.stabellini@eu.citrix.com, wei.liu2@citrix.com, dgdegra@tycho.nsa.gov Date: Fri, 8 Jan 2016 14:08:32 +0100 Message-Id: <1452258526-4797-2-git-send-email-jgross@suse.com> X-Mailer: git-send-email 2.6.2 In-Reply-To: <1452258526-4797-1-git-send-email-jgross@suse.com> References: <1452258526-4797-1-git-send-email-jgross@suse.com> Cc: Juergen Gross , Keir Fraser , Andrew Cooper , Tim Deegan , David Vrabel , Jan Beulich Subject: [Xen-devel] [PATCH v3 01/15] xen: add xenstore domain flag to hypervisor X-BeenThere: xen-devel@lists.xen.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org X-Spam-Status: No, score=-4.2 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_MED, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP In order to be able to have full support of a xenstore domain in Xen add a "Xenstore-domain" flag to the hypervisor. This flag must be specified at domain creation time and is returned by XEN_DOMCTL_getdomaininfo. It will allow the domain to retrieve domain information by issuing the XEN_DOMCTL_getdomaininfo itself in order to be able to check for domains having been destroyed. At the same time this flag will inhibit the domain to be migrated, as this wouldn't be a very wise thing to do. In case of a later support of a rebootable Dom0 this flag will allow to recognize a xenstore domain already being present to connect to. Cc: Jan Beulich Cc: Keir Fraser Cc: Tim Deegan Cc: Andrew Cooper Cc: David Vrabel Signed-off-by: Juergen Gross Acked-by: Daniel De Graaf Reviewed-by: Andrew Cooper Acked-by: Ian Campbell --- V3: changed comment as requested by Ian Campbell --- xen/common/domain.c | 6 ++++++ xen/common/domctl.c | 14 +++++++++----- xen/include/public/domctl.h | 6 ++++++ xen/include/xen/sched.h | 5 +++++ xen/include/xsm/dummy.h | 6 ++++++ xen/include/xsm/xsm.h | 1 + 6 files changed, 33 insertions(+), 5 deletions(-) diff --git a/xen/common/domain.c b/xen/common/domain.c index 1017efb..2979c1b 100644 --- a/xen/common/domain.c +++ b/xen/common/domain.c @@ -318,6 +318,12 @@ struct domain *domain_create(domid_t domid, unsigned int domcr_flags, hardware_domain = d; } + if ( domcr_flags & DOMCRF_xs_domain ) + { + d->is_xenstore = 1; + d->disable_migrate = 1; + } + rangeset_domain_initialise(d); init_status |= INIT_rangeset; diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 1fab587..dc1ea06 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -183,10 +183,11 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info) info->cpu_time = cpu_time; info->flags = (info->nr_online_vcpus ? flags : 0) | - ((d->is_dying == DOMDYING_dead) ? XEN_DOMINF_dying : 0) | - (d->is_shut_down ? XEN_DOMINF_shutdown : 0) | - (d->controller_pause_count > 0 ? XEN_DOMINF_paused : 0) | - (d->debugger_attached ? XEN_DOMINF_debugged : 0) | + ((d->is_dying == DOMDYING_dead) ? XEN_DOMINF_dying : 0) | + (d->is_shut_down ? XEN_DOMINF_shutdown : 0) | + (d->controller_pause_count > 0 ? XEN_DOMINF_paused : 0) | + (d->debugger_attached ? XEN_DOMINF_debugged : 0) | + (d->is_xenstore ? XEN_DOMINF_xs_domain : 0) | d->shutdown_code << XEN_DOMINF_shutdownshift; switch ( d->guest_type ) @@ -551,7 +552,8 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) | XEN_DOMCTL_CDF_pvh_guest | XEN_DOMCTL_CDF_hap | XEN_DOMCTL_CDF_s3_integrity - | XEN_DOMCTL_CDF_oos_off)) ) + | XEN_DOMCTL_CDF_oos_off + | XEN_DOMCTL_CDF_xs_domain)) ) break; dom = op->domain; @@ -593,6 +595,8 @@ long do_domctl(XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) domcr_flags |= DOMCRF_s3_integrity; if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_oos_off ) domcr_flags |= DOMCRF_oos_off; + if ( op->u.createdomain.flags & XEN_DOMCTL_CDF_xs_domain ) + domcr_flags |= DOMCRF_xs_domain; d = domain_create(dom, domcr_flags, op->u.createdomain.ssidref, &op->u.createdomain.config); diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index 7a56b3f..2d8076c 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -63,6 +63,9 @@ struct xen_domctl_createdomain { /* Is this a PVH guest (as opposed to an HVM or PV guest)? */ #define _XEN_DOMCTL_CDF_pvh_guest 4 #define XEN_DOMCTL_CDF_pvh_guest (1U<<_XEN_DOMCTL_CDF_pvh_guest) + /* Is this a xenstore domain? */ +#define _XEN_DOMCTL_CDF_xs_domain 5 +#define XEN_DOMCTL_CDF_xs_domain (1U<<_XEN_DOMCTL_CDF_xs_domain) uint32_t flags; struct xen_arch_domainconfig config; }; @@ -97,6 +100,9 @@ struct xen_domctl_getdomaininfo { /* domain is PVH */ #define _XEN_DOMINF_pvh_guest 7 #define XEN_DOMINF_pvh_guest (1U<<_XEN_DOMINF_pvh_guest) +/* domain is a xenstore domain */ +#define _XEN_DOMINF_xs_domain 8 +#define XEN_DOMINF_xs_domain (1U<<_XEN_DOMINF_xs_domain) /* XEN_DOMINF_shutdown guest-supplied code. */ #define XEN_DOMINF_shutdownmask 255 #define XEN_DOMINF_shutdownshift 16 diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index e1428f7..82b6dd1 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -374,6 +374,8 @@ struct domain bool_t auto_node_affinity; /* Is this guest fully privileged (aka dom0)? */ bool_t is_privileged; + /* Is this a xenstore domain (not dom0)? */ + bool_t is_xenstore; /* Domain's VCPUs are pinned 1:1 to physical CPUs? */ bool_t is_pinned; /* Non-migratable and non-restoreable? */ @@ -533,6 +535,9 @@ struct domain *domain_create(domid_t domid, unsigned int domcr_flags, /* DOMCRF_pvh: Create PV domain in HVM container. */ #define _DOMCRF_pvh 5 #define DOMCRF_pvh (1U<<_DOMCRF_pvh) + /* DOMCRF_xs_domain: xenstore domain */ +#define _DOMCRF_xs_domain 6 +#define DOMCRF_xs_domain (1U<<_DOMCRF_xs_domain) /* * rcu_lock_domain_by_id() is more efficient than get_domain_by_id(). diff --git a/xen/include/xsm/dummy.h b/xen/include/xsm/dummy.h index 55b84f0..1d13826 100644 --- a/xen/include/xsm/dummy.h +++ b/xen/include/xsm/dummy.h @@ -71,6 +71,10 @@ static always_inline int xsm_default_action( if ( src->is_privileged ) return 0; return -EPERM; + case XSM_XS_PRIV: + if ( src->is_xenstore || src->is_privileged ) + return 0; + return -EPERM; default: LINKER_BUG_ON(1); return -EPERM; @@ -123,6 +127,8 @@ static XSM_INLINE int xsm_domctl(XSM_DEFAULT_ARG struct domain *d, int cmd) case XEN_DOMCTL_bind_pt_irq: case XEN_DOMCTL_unbind_pt_irq: return xsm_default_action(XSM_DM_PRIV, current->domain, d); + case XEN_DOMCTL_getdomaininfo: + return xsm_default_action(XSM_XS_PRIV, current->domain, d); default: return xsm_default_action(XSM_PRIV, current->domain, d); } diff --git a/xen/include/xsm/xsm.h b/xen/include/xsm/xsm.h index 2c365cd..3afed70 100644 --- a/xen/include/xsm/xsm.h +++ b/xen/include/xsm/xsm.h @@ -35,6 +35,7 @@ enum xsm_default { XSM_DM_PRIV, /* Device model can perform on its target domain */ XSM_TARGET, /* Can perform on self or your target domain */ XSM_PRIV, /* Privileged - normally restricted to dom0 */ + XSM_XS_PRIV, /* Xenstore domain - can do some privileged operations */ XSM_OTHER /* Something more complex */ }; typedef enum xsm_default xsm_default_t;