if ( !libxl_defbool_val(info->oos) )
create.flags |= XEN_DOMCTL_CDF_oos_off;
+
+ if ( libxl_defbool_val(b_info->nested_hvm) )
+ create.flags |= XEN_DOMCTL_CDF_nested_virt;
}
assert(info->passthrough != LIBXL_PASSTHROUGH_DEFAULT);
| CDF_OOS_OFF
| CDF_XS_DOMAIN
| CDF_IOMMU
+ | CDF_NESTED_VIRT
type domain_create_iommu_opts =
| IOMMU_NO_SHAREPT
| CDF_OOS_OFF
| CDF_XS_DOMAIN
| CDF_IOMMU
+ | CDF_NESTED_VIRT
type domain_create_iommu_opts =
| IOMMU_NO_SHAREPT
{
bool hvm = config->flags & XEN_DOMCTL_CDF_hvm;
bool hap = config->flags & XEN_DOMCTL_CDF_hap;
+ bool nested_virt = config->flags & XEN_DOMCTL_CDF_nested_virt;
unsigned int max_vcpus;
if ( hvm ? !hvm_enabled : !IS_ENABLED(CONFIG_PV) )
*/
config->flags |= XEN_DOMCTL_CDF_oos_off;
+ if ( nested_virt && !hap )
+ {
+ dprintk(XENLOG_INFO, "Nested virt not supported without HAP\n");
+ return -EINVAL;
+ }
+
return 0;
}
bool hap = config->flags & XEN_DOMCTL_CDF_hap;
bool iommu = config->flags & XEN_DOMCTL_CDF_iommu;
- if ( config->flags & ~(XEN_DOMCTL_CDF_hvm |
- XEN_DOMCTL_CDF_hap |
- XEN_DOMCTL_CDF_s3_integrity |
- XEN_DOMCTL_CDF_oos_off |
- XEN_DOMCTL_CDF_xs_domain |
- XEN_DOMCTL_CDF_iommu) )
+ if ( config->flags &
+ ~(XEN_DOMCTL_CDF_hvm | XEN_DOMCTL_CDF_hap |
+ XEN_DOMCTL_CDF_s3_integrity | XEN_DOMCTL_CDF_oos_off |
+ XEN_DOMCTL_CDF_xs_domain | XEN_DOMCTL_CDF_iommu |
+ XEN_DOMCTL_CDF_nested_virt) )
{
dprintk(XENLOG_INFO, "Unknown CDF flags %#x\n", config->flags);
return -EINVAL;
/* Should this domain be permitted to use the IOMMU? */
#define _XEN_DOMCTL_CDF_iommu 5
#define XEN_DOMCTL_CDF_iommu (1U<<_XEN_DOMCTL_CDF_iommu)
+#define _XEN_DOMCTL_CDF_nested_virt 6
+#define XEN_DOMCTL_CDF_nested_virt (1U << _XEN_DOMCTL_CDF_nested_virt)
/* Max XEN_DOMCTL_CDF_* constant. Used for ABI checking. */
-#define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_iommu
+#define XEN_DOMCTL_CDF_MAX XEN_DOMCTL_CDF_nested_virt
uint32_t flags;