From: Andrew Cooper Date: Fri, 15 Jul 2016 15:43:48 +0000 (+0100) Subject: xen/domctl: Add DOMINFO_hap to xen_domctl_getdomaininfo X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~686 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=7179cd39efdb22ac847ae465d1aa11cd6263f19b;p=xen.git xen/domctl: Add DOMINFO_hap to xen_domctl_getdomaininfo This allows a toolstack to identify whether a running domain is using hardware assisted paging or not. The appropriate tests differ by architecture, so introduce arch_get_domain_info(). ARM unconditionally sets the new flag, while x86 checks with the paging subsystem first. Signed-off-by: Andrew Cooper Acked-by: Wei Liu Reviewed-by: Julien Grall Reviewed-by: George Dunlap --- diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h index e904bd5911..fdc148ac2d 100644 --- a/tools/libxc/include/xenctrl.h +++ b/tools/libxc/include/xenctrl.h @@ -442,7 +442,7 @@ typedef struct xc_dominfo { uint32_t ssidref; unsigned int dying:1, crashed:1, shutdown:1, paused:1, blocked:1, running:1, - hvm:1, debugged:1, pvh:1, xenstore:1; + hvm:1, debugged:1, pvh:1, xenstore:1, hap:1; unsigned int shutdown_reason; /* only meaningful if shutdown==1 */ unsigned long nr_pages; /* current number, not maximum */ unsigned long nr_outstanding_pages; diff --git a/tools/libxc/xc_domain.c b/tools/libxc/xc_domain.c index 050216e028..296b8523b5 100644 --- a/tools/libxc/xc_domain.c +++ b/tools/libxc/xc_domain.c @@ -372,6 +372,7 @@ int xc_domain_getinfo(xc_interface *xch, info->debugged = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_debugged); info->pvh = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_pvh_guest); info->xenstore = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_xs_domain); + info->hap = !!(domctl.u.getdomaininfo.flags&XEN_DOMINF_hap); info->shutdown_reason = (domctl.u.getdomaininfo.flags>>XEN_DOMINF_shutdownshift) & diff --git a/xen/arch/arm/domctl.c b/xen/arch/arm/domctl.c index f61f98aac7..09d9959ed7 100644 --- a/xen/arch/arm/domctl.c +++ b/xen/arch/arm/domctl.c @@ -14,6 +14,13 @@ #include #include +void arch_get_domain_info(const struct domain *d, + struct xen_domctl_getdomaininfo *info) +{ + /* All ARM domains use hardware assisted paging. */ + info->flags |= XEN_DOMINF_hap; +} + long arch_do_domctl(struct xen_domctl *domctl, struct domain *d, XEN_GUEST_HANDLE_PARAM(xen_domctl_t) u_domctl) { diff --git a/xen/arch/x86/domctl.c b/xen/arch/x86/domctl.c index aedf26494b..bed70aad66 100644 --- a/xen/arch/x86/domctl.c +++ b/xen/arch/x86/domctl.c @@ -229,6 +229,13 @@ static void update_domain_cpuid_info(struct domain *d, } } +void arch_get_domain_info(const struct domain *d, + struct xen_domctl_getdomaininfo *info) +{ + if ( paging_mode_hap(d) ) + info->flags |= XEN_DOMINF_hap; +} + #define MAX_IOPORTS 0x10000 long arch_do_domctl( diff --git a/xen/common/domctl.c b/xen/common/domctl.c index 87640b63be..8f25131b1b 100644 --- a/xen/common/domctl.c +++ b/xen/common/domctl.c @@ -215,6 +215,8 @@ void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info) info->cpupool = d->cpupool ? d->cpupool->cpupool_id : CPUPOOLID_NONE; memcpy(info->handle, d->handle, sizeof(xen_domain_handle_t)); + + arch_get_domain_info(d, info); } bool_t domctl_lock_acquire(void) diff --git a/xen/include/public/domctl.h b/xen/include/public/domctl.h index d6d2319501..ddd3de44be 100644 --- a/xen/include/public/domctl.h +++ b/xen/include/public/domctl.h @@ -103,6 +103,9 @@ struct xen_domctl_getdomaininfo { /* domain is a xenstore domain */ #define _XEN_DOMINF_xs_domain 8 #define XEN_DOMINF_xs_domain (1U<<_XEN_DOMINF_xs_domain) +/* domain has hardware assisted paging */ +#define _XEN_DOMINF_hap 9 +#define XEN_DOMINF_hap (1U<<_XEN_DOMINF_hap) /* XEN_DOMINF_shutdown guest-supplied code. */ #define XEN_DOMINF_shutdownmask 255 #define XEN_DOMINF_shutdownshift 16 diff --git a/xen/include/xen/domain.h b/xen/include/xen/domain.h index a1a6f2528a..bce0ea1ea9 100644 --- a/xen/include/xen/domain.h +++ b/xen/include/xen/domain.h @@ -18,6 +18,8 @@ int vcpu_reset(struct vcpu *); struct xen_domctl_getdomaininfo; void getdomaininfo(struct domain *d, struct xen_domctl_getdomaininfo *info); +void arch_get_domain_info(const struct domain *d, + struct xen_domctl_getdomaininfo *info); /* * Arch-specifics.