diff --git a/tools/libxl/libxl.c b/tools/libxl/libxl.c index b41ade9fda..a0d9f2bfe7 100644 --- a/tools/libxl/libxl.c +++ b/tools/libxl/libxl.c @@ -396,8 +396,9 @@ int libxl_get_physinfo(libxl_ctx *ctx, libxl_physinfo *physinfo) memcpy(physinfo->hw_cap,xcphysinfo.hw_cap, sizeof(physinfo->hw_cap)); physinfo->cap_hvm = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_hvm); - physinfo->cap_hvm_directio = - !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_hvm_directio); + physinfo->cap_directio = + !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_directio); + physinfo->cap_hvm_directio = physinfo->cap_hvm && physinfo->cap_directio; GC_FREE; return 0; diff --git a/tools/libxl/libxl.h b/tools/libxl/libxl.h index ae2d63df0c..2cfc1b08ad 100644 --- a/tools/libxl/libxl.h +++ b/tools/libxl/libxl.h @@ -67,6 +67,12 @@ * the same $(XEN_VERSION) (e.g. throughout a major release). */ +/* LIBXL_HAVE_PHYSINFO_CAP_DIRECTIO + * + * If this is defined, libxl_physinfo has a "cap_directio" field. + */ +#define LIBXL_HAVE_PHYSINFO_CAP_DIRECTIO 1 + /* LIBXL_HAVE_CONSOLE_NOTIFY_FD * * If this is defined, libxl_console_exec and diff --git a/tools/libxl/libxl_types.idl b/tools/libxl/libxl_types.idl index 4a385801ba..2cceb8c057 100644 --- a/tools/libxl/libxl_types.idl +++ b/tools/libxl/libxl_types.idl @@ -1014,6 +1014,7 @@ libxl_physinfo = Struct("physinfo", [ ("cap_hvm", bool), ("cap_hvm_directio", bool), + ("cap_directio", bool), ], dir=DIR_OUT) libxl_connectorinfo = Struct("connectorinfo", [ diff --git a/tools/xl/xl_info.c b/tools/xl/xl_info.c index 6c8be26119..93e2c5fa7d 100644 --- a/tools/xl/xl_info.c +++ b/tools/xl/xl_info.c @@ -210,9 +210,10 @@ static void output_physinfo(void) info.hw_cap[4], info.hw_cap[5], info.hw_cap[6], info.hw_cap[7] ); - maybe_printf("virt_caps :%s%s\n", + maybe_printf("virt_caps :%s%s%s\n", info.cap_hvm ? " hvm" : "", - info.cap_hvm_directio ? " hvm_directio" : "" + info.cap_hvm_directio ? " hvm_directio" : "", + info.cap_directio ? " directio" : "" ); vinfo = libxl_get_version_info(ctx); diff --git a/xen/arch/x86/sysctl.c b/xen/arch/x86/sysctl.c index e704ed7f1c..456dc58d8f 100644 --- a/xen/arch/x86/sysctl.c +++ b/xen/arch/x86/sysctl.c @@ -93,7 +93,7 @@ void arch_do_physinfo(struct xen_sysctl_physinfo *pi) if ( hvm_enabled ) pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm; if ( iommu_enabled ) - pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm_directio; + pi->capabilities |= XEN_SYSCTL_PHYSCAP_directio; } long arch_do_sysctl( diff --git a/xen/include/public/sysctl.h b/xen/include/public/sysctl.h index 839c1b9f25..8cd0a9cb0d 100644 --- a/xen/include/public/sysctl.h +++ b/xen/include/public/sysctl.h @@ -36,7 +36,7 @@ #include "physdev.h" #include "tmem.h" -#define XEN_SYSCTL_INTERFACE_VERSION 0x00000011 +#define XEN_SYSCTL_INTERFACE_VERSION 0x00000012 /* * Read console content from Xen buffer ring. @@ -85,9 +85,9 @@ struct xen_sysctl_tbuf_op { /* (x86) The platform supports HVM guests. */ #define _XEN_SYSCTL_PHYSCAP_hvm 0 #define XEN_SYSCTL_PHYSCAP_hvm (1u<<_XEN_SYSCTL_PHYSCAP_hvm) - /* (x86) The platform supports HVM-guest direct access to I/O devices. */ -#define _XEN_SYSCTL_PHYSCAP_hvm_directio 1 -#define XEN_SYSCTL_PHYSCAP_hvm_directio (1u<<_XEN_SYSCTL_PHYSCAP_hvm_directio) + /* (x86) The platform supports direct access to I/O devices with IOMMU. */ +#define _XEN_SYSCTL_PHYSCAP_directio 1 +#define XEN_SYSCTL_PHYSCAP_directio (1u<<_XEN_SYSCTL_PHYSCAP_directio) struct xen_sysctl_physinfo { uint32_t threads_per_core; uint32_t cores_per_socket;