physinfo->cap_hvm_directio =
!!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_directio);
physinfo->cap_hap = !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_hap);
+ physinfo->cap_shadow =
+ !!(xcphysinfo.capabilities & XEN_SYSCTL_PHYSCAP_shadow);
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.
+ * LIBXL_HAVE_PHYSINFO_CAP_HAP_SHADOW indicates that libxl_physinfo has
+ * cap_hap and cap_shadow fields reflecting the hardware and Xen availability
+ * of Hardware Assisted, and Shadow paging support.
*/
-#define LIBXL_HAVE_PHYSINFO_CAP_HAP 1
+#define LIBXL_HAVE_PHYSINFO_CAP_HAP_SHADOW 1
/*
* libxl ABI compatibility
if (rc)
return rc;
- libxl_defbool_setdefault(&c_info->hap, info.cap_hap);
+ if (info.cap_hap)
+ libxl_defbool_setdefault(&c_info->hap, true);
+ else if (info.cap_shadow)
+ libxl_defbool_setdefault(&c_info->hap, false);
+ else {
+ LOG(ERROR, "neither hap nor shadow paging available");
+ return ERROR_INVAL;
+ }
+
libxl_defbool_setdefault(&c_info->oos, true);
}
("cap_pv", bool),
("cap_hvm_directio", bool), # No longer HVM specific
("cap_hap", bool),
+ ("cap_shadow", bool),
], dir=DIR_OUT)
libxl_connectorinfo = Struct("connectorinfo", [
| CAP_PV
| CAP_DirectIO
| CAP_HAP
+ | CAP_Shadow
type physinfo =
{
| CAP_PV
| CAP_DirectIO
| CAP_HAP
+ | CAP_Shadow
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%s\n",
+ maybe_printf("virt_caps :%s%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_hap ? " hap" : ""
+ info.cap_hap ? " hap" : "",
+ info.cap_shadow ? " shadow" : ""
);
vinfo = libxl_get_version_info(ctx);
pi->capabilities |= XEN_SYSCTL_PHYSCAP_pv;
if ( hvm_hap_supported() )
pi->capabilities |= XEN_SYSCTL_PHYSCAP_hap;
+ if ( IS_ENABLED(CONFIG_SHADOW_PAGING) )
+ pi->capabilities |= XEN_SYSCTL_PHYSCAP_shadow;
}
long arch_do_sysctl(
/* The platform supports Hardware Assisted Paging. */
#define _XEN_SYSCTL_PHYSCAP_hap 3
#define XEN_SYSCTL_PHYSCAP_hap (1u<<_XEN_SYSCTL_PHYSCAP_hap)
+/* The platform supports software paging. */
+#define _XEN_SYSCTL_PHYSCAP_shadow 4
+#define XEN_SYSCTL_PHYSCAP_shadow (1u<<_XEN_SYSCTL_PHYSCAP_shadow)
/* Max XEN_SYSCTL_PHYSCAP_* constant. Used for ABI checking. */
-#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_hap
+#define XEN_SYSCTL_PHYSCAP_MAX XEN_SYSCTL_PHYSCAP_shadow
struct xen_sysctl_physinfo {
uint32_t threads_per_core;