physinfo->cap_pv = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_pv);
physinfo->cap_hvm_directio =
!!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_directio);
+ physinfo->cap_hap = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_hap);
GC_FREE;
return 0;
*/
#define LIBXL_HAVE_EXTENDED_VKB 1
+/*
+ * LIBXL_HAVE_PHYSINFO_CAP_HAP indicates that libxl_physinfo has a cap_hap
+ * field that indicates whether the hardware supports Hardware Assisted
+ * Paging.
+ */
+#define LIBXL_HAVE_PHYSINFO_CAP_HAP 1
+
/*
* libxl ABI compatibility
*
libxl__arch_domain_create_info_setdefault(gc, c_info);
if (c_info->type != LIBXL_DOMAIN_TYPE_PV) {
- libxl_defbool_setdefault(&c_info->hap, true);
+ libxl_physinfo info;
+ int rc = libxl_get_physinfo(CTX, &info);
+
+ if (rc)
+ return rc;
+
+ libxl_defbool_setdefault(&c_info->hap, info.cap_hap);
libxl_defbool_setdefault(&c_info->oos, true);
}
("cap_hvm", bool),
("cap_pv", bool),
("cap_hvm_directio", bool), # No longer HVM specific
+ ("cap_hap", bool),
], dir=DIR_OUT)
libxl_connectorinfo = Struct("connectorinfo", [
| CAP_HVM
| CAP_PV
| CAP_DirectIO
+ | CAP_HAP
type physinfo =
{
| CAP_HVM
| CAP_PV
| CAP_DirectIO
+ | CAP_HAP
type physinfo = {
threads_per_core : int;
cores_per_socket : int;
info.hw_cap[4], info.hw_cap[5], info.hw_cap[6], info.hw_cap[7]
);
- maybe_printf("virt_caps :%s%s%s%s\n",
+ maybe_printf("virt_caps :%s%s%s%s%s\n",
info.cap_pv ? " pv" : "",
info.cap_hvm ? " hvm" : "",
info.cap_hvm && info.cap_hvm_directio ? " hvm_directio" : "",
- info.cap_pv && info.cap_hvm_directio ? " pv_directio" : ""
+ info.cap_pv && info.cap_hvm_directio ? " pv_directio" : "",
+ info.cap_hap ? " hap" : ""
);
vinfo = libxl_get_version_info(ctx);
void arch_do_physinfo(struct xen_sysctl_physinfo *pi)
{
- pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm;
+ pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm | XEN_SYSCTL_PHYSCAP_hap;
}
long arch_do_sysctl(struct xen_sysctl *sysctl,
pi->capabilities |= XEN_SYSCTL_PHYSCAP_hvm;
if ( IS_ENABLED(CONFIG_PV) )
pi->capabilities |= XEN_SYSCTL_PHYSCAP_pv;
+ if ( hvm_hap_supported() )
+ pi->capabilities |= XEN_SYSCTL_PHYSCAP_hap;
}
long arch_do_sysctl(
/* The platform supports direct access to I/O devices with IOMMU. */
#define _XEN_SYSCTL_PHYSCAP_directio 2
#define XEN_SYSCTL_PHYSCAP_directio (1u<<_XEN_SYSCTL_PHYSCAP_directio)
+/* The platform supports Hardware Assisted Paging. */
+#define _XEN_SYSCTL_PHYSCAP_hap 3
+#define XEN_SYSCTL_PHYSCAP_hap (1u<<_XEN_SYSCTL_PHYSCAP_hap)
/* Max XEN_SYSCTL_PHYSCAP_* constant. Used for ABI checking. */
-#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_directio
+#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_hap
struct xen_sysctl_physinfo {
uint32_t threads_per_core;