drivers/hv/mshv_root_main.c | 176 ++++++++++++++++++++++++++++++++---- include/hyperv/hvhdk.h | 86 +++++++++++++++++- include/uapi/linux/mshv.h | 34 +++++++ 3 files changed, 272 insertions(+), 24 deletions(-)
From: Muminul Islam <muislam@microsoft.com>
The existing mshv create partition ioctl does not provide a way to
specify which cpu features are enabled in the guest. This was done
to reduce unnecessary complexity in the API.
However, some new scenarios require fine-grained control over the
cpu feature bits.
Define a new mshv_create_partition_v2 structure which supports passing
through the disabled cpu flags and xsave flags to the hypervisor
directly.
When these are not specified (pt_num_cpu_fbanks == 0) or the old
structure is used, define a set of default flags which cover most
cases.
Retain backward compatibility with the old structure via a new flag
MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES which enables the new struct.
Co-developed-by: Jinank Jain <jinankjain@microsoft.com>
Signed-off-by: Jinank Jain <jinankjain@microsoft.com>
Signed-off-by: Muminul Islam <muislam@microsoft.com>
Signed-off-by: Nuno Das Neves <nunodasneves@linux.microsoft.com>
---
drivers/hv/mshv_root_main.c | 176 ++++++++++++++++++++++++++++++++----
include/hyperv/hvhdk.h | 86 +++++++++++++++++-
include/uapi/linux/mshv.h | 34 +++++++
3 files changed, 272 insertions(+), 24 deletions(-)
diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index d542a0143bb8..6d444d26e9dc 100644
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -1900,43 +1900,181 @@ add_partition(struct mshv_partition *partition)
return 0;
}
-static long
-mshv_ioctl_create_partition(void __user *user_arg, struct device *module_dev)
+static_assert(MSHV_NUM_CPU_FEATURES_BANKS <=
+ HV_PARTITION_PROCESSOR_FEATURES_BANKS);
+
+static long mshv_ioctl_process_pt_flags(void __user *user_arg, u64 *pt_flags,
+ struct hv_partition_creation_properties *cr_props,
+ union hv_partition_isolation_properties *isol_props)
{
- struct mshv_create_partition args;
- u64 creation_flags;
- struct hv_partition_creation_properties creation_properties = {};
- union hv_partition_isolation_properties isolation_properties = {};
- struct mshv_partition *partition;
- struct file *file;
- int fd;
- long ret;
+ int i;
+ struct mshv_create_partition_v2 args;
+ union hv_partition_processor_features *disabled_procs;
+ union hv_partition_processor_xsave_features *disabled_xsave;
- if (copy_from_user(&args, user_arg, sizeof(args)))
+ /* First, copy orig struct in case user is on previous versions */
+ if (copy_from_user(&args, user_arg,
+ sizeof(struct mshv_create_partition)))
return -EFAULT;
if ((args.pt_flags & ~MSHV_PT_FLAGS_MASK) ||
- args.pt_isolation >= MSHV_PT_ISOLATION_COUNT)
+ args.pt_isolation >= MSHV_PT_ISOLATION_COUNT)
return -EINVAL;
+ disabled_procs = &cr_props->disabled_processor_features;
+
+ /* Disable all processor features first */
+ for (i = 0; i < HV_PARTITION_PROCESSOR_FEATURES_BANKS; i++)
+ disabled_procs->as_uint64[i] = -1;
+
+#if IS_ENABLED(CONFIG_X86_64)
+ /* Enable default features that are known to be supported */
+ disabled_procs->cet_ibt_support = 0;
+ disabled_procs->cet_ss_support = 0;
+ disabled_procs->smep_support = 0;
+ disabled_procs->rdtscp_support = 0;
+ disabled_procs->tsc_invariant_support = 0;
+ disabled_procs->sse3_support = 0;
+ disabled_procs->lahf_sahf_support = 0;
+ disabled_procs->ssse3_support = 0;
+ disabled_procs->sse4_1_support = 0;
+ disabled_procs->sse4_2_support = 0;
+ disabled_procs->sse4a_support = 0;
+ disabled_procs->xop_support = 0;
+ disabled_procs->pop_cnt_support = 0;
+ disabled_procs->cmpxchg16b_support = 0;
+ disabled_procs->altmovcr8_support = 0;
+ disabled_procs->lzcnt_support = 0;
+ disabled_procs->mis_align_sse_support = 0;
+ disabled_procs->mmx_ext_support = 0;
+ disabled_procs->amd3dnow_support = 0;
+ disabled_procs->extended_amd3dnow_support = 0;
+ disabled_procs->aes_support = 0;
+ disabled_procs->pclmulqdq_support = 0;
+ disabled_procs->pcid_support = 0;
+ disabled_procs->fma4_support = 0;
+ disabled_procs->f16c_support = 0;
+ disabled_procs->rd_rand_support = 0;
+ disabled_procs->rd_wr_fs_gs_support = 0;
+ disabled_procs->enhanced_fast_string_support = 0;
+ disabled_procs->bmi1_support = 0;
+ disabled_procs->bmi2_support = 0;
+ disabled_procs->hle_support_deprecated = 0;
+ disabled_procs->rtm_support_deprecated = 0;
+ disabled_procs->movbe_support = 0;
+ disabled_procs->npiep1_support = 0;
+ disabled_procs->dep_x87_fpu_save_support = 0;
+ disabled_procs->rd_seed_support = 0;
+ disabled_procs->adx_support = 0;
+ disabled_procs->intel_prefetch_support = 0;
+ disabled_procs->smap_support = 0;
+ disabled_procs->hle_support = 0;
+ disabled_procs->rtm_support = 0;
+ disabled_procs->invpcid_support = 0;
+ disabled_procs->ibrs_support = 0;
+ disabled_procs->stibp_support = 0;
+ disabled_procs->mdd_support = 0;
+ disabled_procs->ibpb_support = 0;
+ disabled_procs->l1dcache_flush_support = 0;
+ disabled_procs->virt_spec_ctrl_support = 0;
+ disabled_procs->mb_clear_support = 0;
+ disabled_procs->tsx_ctrl_support = 0;
+ disabled_procs->clflushopt_support = 0;
+ disabled_procs->rdcl_no_support = 0;
+ disabled_procs->ibrs_all_support = 0;
+ disabled_procs->page_1gb_support = 0;
+ disabled_procs->skip_l1df_support = 0;
+ disabled_procs->ssb_no_support = 0;
+ disabled_procs->mbs_no_support = 0;
+ disabled_procs->taa_no_support = 0;
+ disabled_procs->fb_clear_support = 0;
+ disabled_procs->gds_no_support = 0;
+ disabled_procs->bhi_no_support = 0;
+ disabled_procs->bhi_dis_support = 0;
+ disabled_procs->btc_no_support = 0;
+ disabled_procs->mitigation_ctrl_support = 0;
+ disabled_procs->rfds_no_support = 0;
+ disabled_procs->rfds_clear_support = 0;
+ disabled_procs->unrestricted_guest_support = 0;
+ disabled_procs->fast_short_rep_mov_support = 0;
+ disabled_procs->rsb_a_no_support = 0;
+ disabled_procs->rd_pid_support = 0;
+ disabled_procs->umip_support = 0;
+ disabled_procs->vmx_exception_inject_support = 0;
+ disabled_procs->rdpru_support = 0;
+ disabled_procs->mbec_support = 0;
+ disabled_procs->psfd_support = 0;
+
+ /* Enable default XSave features that are known to be supported*/
+ disabled_xsave = &cr_props->disabled_processor_xsave_features;
+ disabled_xsave->as_uint64 = -1;
+ disabled_xsave->xsave_support = 0;
+ disabled_xsave->xsaveopt_support = 0;
+ disabled_xsave->avx_support = 0;
+ disabled_xsave->xsave_supervisor_support = 0;
+ disabled_xsave->xsave_comp_support = 0;
+#endif
+ /* Check if user provided newer struct with feature fields */
+ if (args.pt_flags & BIT(MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES)) {
+ if (copy_from_user(&args, user_arg, sizeof(args)))
+ return -EFAULT;
+
+ if (args.pt_num_cpu_fbanks > MSHV_NUM_CPU_FEATURES_BANKS ||
+ mshv_field_nonzero(args, pt_rsvd) ||
+ mshv_field_nonzero(args, pt_rsvd1))
+ return -EINVAL;
+
+ for (i = 0; i < args.pt_num_cpu_fbanks; i++)
+ disabled_procs->as_uint64[i] = args.pt_cpu_fbanks[i];
+
+#if IS_ENABLED(CONFIG_X86_64)
+ disabled_xsave->as_uint64 = args.pt_disabled_xsave;
+#else
+ if (mshv_field_nonzero(args, pt_rsvd2))
+ return -EINVAL
+#endif
+ }
+
/* Only support EXO partitions */
- creation_flags = HV_PARTITION_CREATION_FLAG_EXO_PARTITION |
- HV_PARTITION_CREATION_FLAG_INTERCEPT_MESSAGE_PAGE_ENABLED;
+ *pt_flags = HV_PARTITION_CREATION_FLAG_EXO_PARTITION |
+ HV_PARTITION_CREATION_FLAG_INTERCEPT_MESSAGE_PAGE_ENABLED;
if (args.pt_flags & BIT(MSHV_PT_BIT_LAPIC))
- creation_flags |= HV_PARTITION_CREATION_FLAG_LAPIC_ENABLED;
+ *pt_flags |= HV_PARTITION_CREATION_FLAG_LAPIC_ENABLED;
if (args.pt_flags & BIT(MSHV_PT_BIT_X2APIC))
- creation_flags |= HV_PARTITION_CREATION_FLAG_X2APIC_CAPABLE;
+ *pt_flags |= HV_PARTITION_CREATION_FLAG_X2APIC_CAPABLE;
if (args.pt_flags & BIT(MSHV_PT_BIT_GPA_SUPER_PAGES))
- creation_flags |= HV_PARTITION_CREATION_FLAG_GPA_SUPER_PAGES_ENABLED;
+ *pt_flags |= HV_PARTITION_CREATION_FLAG_GPA_SUPER_PAGES_ENABLED;
switch (args.pt_isolation) {
case MSHV_PT_ISOLATION_NONE:
- isolation_properties.isolation_type =
- HV_PARTITION_ISOLATION_TYPE_NONE;
+ isol_props->isolation_type = HV_PARTITION_ISOLATION_TYPE_NONE;
+ break;
+ case MSHV_PT_ISOLATION_SNP:
+ isol_props->isolation_type = HV_PARTITION_ISOLATION_TYPE_SNP;
break;
}
+ return 0;
+}
+
+static long
+mshv_ioctl_create_partition(void __user *user_arg, struct device *module_dev)
+{
+ u64 creation_flags;
+ struct hv_partition_creation_properties creation_properties = {};
+ union hv_partition_isolation_properties isolation_properties = {};
+ struct mshv_partition *partition;
+ struct file *file;
+ int fd;
+ long ret;
+
+ ret = mshv_ioctl_process_pt_flags(user_arg, &creation_flags,
+ &creation_properties,
+ &isolation_properties);
+ if (ret)
+ return ret;
+
partition = kzalloc(sizeof(*partition), GFP_KERNEL);
if (!partition)
return -ENOMEM;
diff --git a/include/hyperv/hvhdk.h b/include/hyperv/hvhdk.h
index 416c0d45b793..221a90ab07fa 100644
--- a/include/hyperv/hvhdk.h
+++ b/include/hyperv/hvhdk.h
@@ -220,10 +220,51 @@ union hv_partition_processor_features {
u64 serialize_support : 1;
u64 tsc_deadline_tmr_support : 1;
u64 tsc_adjust_support : 1;
- u64 fzlrep_movsb : 1;
- u64 fsrep_stosb : 1;
- u64 fsrep_cmpsb : 1;
- u64 reserved_bank1 : 42;
+ u64 fzl_rep_movsb : 1;
+ u64 fs_rep_stosb : 1;
+ u64 fs_rep_cmpsb : 1;
+ u64 tsx_ld_trk_support : 1;
+ u64 vmx_ins_outs_exit_info_support : 1;
+ u64 hlat_support : 1;
+ u64 sbdr_ssdp_no_support : 1;
+ u64 fbsdp_no_support : 1;
+ u64 psdp_no_support : 1;
+ u64 fb_clear_support : 1;
+ u64 btc_no_support : 1;
+ u64 ibpb_rsb_flush_support : 1;
+ u64 stibp_always_on_support : 1;
+ u64 perf_global_ctrl_support : 1;
+ u64 npt_execute_only_support : 1;
+ u64 npt_ad_flags_support : 1;
+ u64 npt1_gb_page_support : 1;
+ u64 amd_processor_topology_node_id_support : 1;
+ u64 local_machine_check_support : 1;
+ u64 extended_topology_leaf_fp256_amd_support : 1;
+ u64 gds_no_support : 1;
+ u64 cmpccxadd_support : 1;
+ u64 tsc_aux_virtualization_support : 1;
+ u64 rmp_query_support : 1;
+ u64 bhi_no_support : 1;
+ u64 bhi_dis_support : 1;
+ u64 prefetch_i_support : 1;
+ u64 sha512_support : 1;
+ u64 mitigation_ctrl_support : 1;
+ u64 rfds_no_support : 1;
+ u64 rfds_clear_support : 1;
+ u64 sm3_support : 1;
+ u64 sm4_support : 1;
+ u64 secure_avic_support : 1;
+ u64 guest_intercept_ctrl_support : 1;
+ u64 sbpb_supported : 1;
+ u64 ibpb_br_type_supported : 1;
+ u64 srso_no_supported : 1;
+ u64 srso_user_kernel_no_supported : 1;
+ u64 vrew_clear_supported : 1;
+ u64 tsa_l1_no_supported : 1;
+ u64 tsa_sq_no_supported : 1;
+ u64 lass_support : 1;
+ /* Remaining reserved bits */
+ u64 reserved_bank1 : 2;
} __packed;
};
@@ -232,7 +273,42 @@ union hv_partition_processor_xsave_features {
u64 xsave_support : 1;
u64 xsaveopt_support : 1;
u64 avx_support : 1;
- u64 reserved1 : 61;
+ u64 avx2_support : 1;
+ u64 fma_support: 1;
+ u64 mpx_support: 1;
+ u64 avx512_support : 1;
+ u64 avx512_dq_support : 1;
+ u64 avx512_cd_support : 1;
+ u64 avx512_bw_support : 1;
+ u64 avx512_vl_support : 1;
+ u64 xsave_comp_support : 1;
+ u64 xsave_supervisor_support : 1;
+ u64 xcr1_support : 1;
+ u64 avx512_bitalg_support : 1;
+ u64 avx512_i_fma_support : 1;
+ u64 avx512_v_bmi_support : 1;
+ u64 avx512_v_bmi2_support : 1;
+ u64 avx512_vnni_support : 1;
+ u64 gfni_support : 1;
+ u64 vaes_support : 1;
+ u64 avx512_v_popcntdq_support : 1;
+ u64 vpclmulqdq_support : 1;
+ u64 avx512_bf16_support : 1;
+ u64 avx512_vp2_intersect_support : 1;
+ u64 avx512_fp16_support : 1;
+ u64 xfd_support : 1;
+ u64 amx_tile_support : 1;
+ u64 amx_bf16_support : 1;
+ u64 amx_int8_support : 1;
+ u64 avx_vnni_support : 1;
+ u64 avx_ifma_support : 1;
+ u64 avx_ne_convert_support : 1;
+ u64 avx_vnni_int8_support : 1;
+ u64 avx_vnni_int16_support : 1;
+ u64 avx10_1_256_support : 1;
+ u64 avx10_1_512_support : 1;
+ u64 amx_fp16_support : 1;
+ u64 reserved1 : 26;
} __packed;
u64 as_uint64;
};
diff --git a/include/uapi/linux/mshv.h b/include/uapi/linux/mshv.h
index 876bfe4e4227..2687a2f27f05 100644
--- a/include/uapi/linux/mshv.h
+++ b/include/uapi/linux/mshv.h
@@ -26,6 +26,7 @@ enum {
MSHV_PT_BIT_LAPIC,
MSHV_PT_BIT_X2APIC,
MSHV_PT_BIT_GPA_SUPER_PAGES,
+ MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES,
MSHV_PT_BIT_COUNT,
};
@@ -33,6 +34,7 @@ enum {
enum {
MSHV_PT_ISOLATION_NONE,
+ MSHV_PT_ISOLATION_SNP,
MSHV_PT_ISOLATION_COUNT,
};
@@ -41,6 +43,8 @@ enum {
* @pt_flags: Bitmask of 1 << MSHV_PT_BIT_*
* @pt_isolation: MSHV_PT_ISOLATION_*
*
+ * This is the initial/v0 version for backward compatibility.
+ *
* Returns a file descriptor to act as a handle to a guest partition.
* At this point the partition is not yet initialized in the hypervisor.
* Some operations must be done with the partition in this state, e.g. setting
@@ -52,6 +56,36 @@ struct mshv_create_partition {
__u64 pt_isolation;
};
+#define MSHV_NUM_CPU_FEATURES_BANKS 2
+
+/**
+ * struct mshv_create_partition_v2
+ *
+ * This is extended version of the above initial MSHV_CREATE_PARTITION
+ * ioctl and allows for following additional parameters:
+ *
+ * @pt_num_cpu_fbanks: number of processor feature banks being provided.
+ * This must not exceed MSHV_NUM_CPU_FEATURES_BANKS.
+ * @pt_cpu_fbanks: processor feature banks array
+ * @pt_disabled_xsave: disabled xsave feature bits. Refer to
+ * union hv_partition_processor_xsave_feature
+ *
+ * Returns : same as above original mshv_create_partition
+ */
+struct mshv_create_partition_v2 {
+ __u64 pt_flags;
+ __u64 pt_isolation;
+ __u16 pt_num_cpu_fbanks;
+ __u8 pt_rsvd[6]; /* MBZ */
+ __u64 pt_cpu_fbanks[MSHV_NUM_CPU_FEATURES_BANKS];
+ __u64 pt_rsvd1[2]; /* MBZ */
+#if IS_ENABLED(CONFIG_X86_64)
+ __u64 pt_disabled_xsave;
+#else
+ __u64 pt_rsvd2; /* MBZ */
+#endif
+} __packed;
+
/* /dev/mshv */
#define MSHV_CREATE_PARTITION _IOW(MSHV_IOCTL, 0x00, struct mshv_create_partition)
--
2.34.1
Hi Nuno, kernel test robot noticed the following build errors: [auto build test ERROR on linus/master] [also build test ERROR on v6.18-rc3 next-20251029] [If your patch is applied to the wrong git tree, kindly drop us a note. And when submitting patch, we suggest to use '--base' as documented in https://git-scm.com/docs/git-format-patch#_base_tree_information] url: https://github.com/intel-lab-lkp/linux/commits/Nuno-Das-Neves/mshv-Extend-create-partition-ioctl-to-support-cpu-features/20251029-050748 base: linus/master patch link: https://lore.kernel.org/r/1761685562-6272-1-git-send-email-nunodasneves%40linux.microsoft.com patch subject: [PATCH] mshv: Extend create partition ioctl to support cpu features config: x86_64-rhel-9.4-ltp (https://download.01.org/0day-ci/archive/20251029/202510292330.LCHvPCLt-lkp@intel.com/config) compiler: gcc-14 (Debian 14.2.0-19) 14.2.0 reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251029/202510292330.LCHvPCLt-lkp@intel.com/reproduce) If you fix the issue in a separate patch/commit (i.e. not just a new version of the same patch/commit), kindly add following tags | Reported-by: kernel test robot <lkp@intel.com> | Closes: https://lore.kernel.org/oe-kbuild-all/202510292330.LCHvPCLt-lkp@intel.com/ All errors (new ones prefixed by >>): >> error: include/uapi/linux/mshv.h: leak CONFIG_X86_64 to user-space make[3]: *** [scripts/Makefile.headersinst:63: usr/include/linux/mshv.h] Error 1 make[3]: Target '__headers' not remade because of errors. make[2]: *** [Makefile:1378: headers] Error 2 make[2]: Target 'prepare' not remade because of errors. make[1]: *** [Makefile:248: __sub-make] Error 2 make[1]: Target 'prepare' not remade because of errors. make: *** [Makefile:248: __sub-make] Error 2 make: Target 'prepare' not remade because of errors. -- 0-DAY CI Kernel Test Service https://github.com/intel/lkp-tests/wiki
Hi Nuno,
kernel test robot noticed the following build errors:
[auto build test ERROR on linus/master]
[also build test ERROR on v6.18-rc3 next-20251029]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]
url: https://github.com/intel-lab-lkp/linux/commits/Nuno-Das-Neves/mshv-Extend-create-partition-ioctl-to-support-cpu-features/20251029-050748
base: linus/master
patch link: https://lore.kernel.org/r/1761685562-6272-1-git-send-email-nunodasneves%40linux.microsoft.com
patch subject: [PATCH] mshv: Extend create partition ioctl to support cpu features
config: arm64-randconfig-r072-20251029 (https://download.01.org/0day-ci/archive/20251029/202510292227.lgcNjlQ5-lkp@intel.com/config)
compiler: clang version 22.0.0git (https://github.com/llvm/llvm-project d1c086e82af239b245fe8d7832f2753436634990)
reproduce (this is a W=1 build): (https://download.01.org/0day-ci/archive/20251029/202510292227.lgcNjlQ5-lkp@intel.com/reproduce)
If you fix the issue in a separate patch/commit (i.e. not just a new version of
the same patch/commit), kindly add following tags
| Reported-by: kernel test robot <lkp@intel.com>
| Closes: https://lore.kernel.org/oe-kbuild-all/202510292227.lgcNjlQ5-lkp@intel.com/
All errors (new ones prefixed by >>):
>> drivers/hv/mshv_root_main.c:1996:18: error: expected ';' after return statement
1996 | return -EINVAL
| ^
| ;
1 error generated.
vim +1996 drivers/hv/mshv_root_main.c
1864
1865 static_assert(MSHV_NUM_CPU_FEATURES_BANKS <=
1866 HV_PARTITION_PROCESSOR_FEATURES_BANKS);
1867
1868 static long mshv_ioctl_process_pt_flags(void __user *user_arg, u64 *pt_flags,
1869 struct hv_partition_creation_properties *cr_props,
1870 union hv_partition_isolation_properties *isol_props)
1871 {
1872 int i;
1873 struct mshv_create_partition_v2 args;
1874 union hv_partition_processor_features *disabled_procs;
1875 union hv_partition_processor_xsave_features *disabled_xsave;
1876
1877 /* First, copy orig struct in case user is on previous versions */
1878 if (copy_from_user(&args, user_arg,
1879 sizeof(struct mshv_create_partition)))
1880 return -EFAULT;
1881
1882 if ((args.pt_flags & ~MSHV_PT_FLAGS_MASK) ||
1883 args.pt_isolation >= MSHV_PT_ISOLATION_COUNT)
1884 return -EINVAL;
1885
1886 disabled_procs = &cr_props->disabled_processor_features;
1887
1888 /* Disable all processor features first */
1889 for (i = 0; i < HV_PARTITION_PROCESSOR_FEATURES_BANKS; i++)
1890 disabled_procs->as_uint64[i] = -1;
1891
1892 #if IS_ENABLED(CONFIG_X86_64)
1893 /* Enable default features that are known to be supported */
1894 disabled_procs->cet_ibt_support = 0;
1895 disabled_procs->cet_ss_support = 0;
1896 disabled_procs->smep_support = 0;
1897 disabled_procs->rdtscp_support = 0;
1898 disabled_procs->tsc_invariant_support = 0;
1899 disabled_procs->sse3_support = 0;
1900 disabled_procs->lahf_sahf_support = 0;
1901 disabled_procs->ssse3_support = 0;
1902 disabled_procs->sse4_1_support = 0;
1903 disabled_procs->sse4_2_support = 0;
1904 disabled_procs->sse4a_support = 0;
1905 disabled_procs->xop_support = 0;
1906 disabled_procs->pop_cnt_support = 0;
1907 disabled_procs->cmpxchg16b_support = 0;
1908 disabled_procs->altmovcr8_support = 0;
1909 disabled_procs->lzcnt_support = 0;
1910 disabled_procs->mis_align_sse_support = 0;
1911 disabled_procs->mmx_ext_support = 0;
1912 disabled_procs->amd3dnow_support = 0;
1913 disabled_procs->extended_amd3dnow_support = 0;
1914 disabled_procs->aes_support = 0;
1915 disabled_procs->pclmulqdq_support = 0;
1916 disabled_procs->pcid_support = 0;
1917 disabled_procs->fma4_support = 0;
1918 disabled_procs->f16c_support = 0;
1919 disabled_procs->rd_rand_support = 0;
1920 disabled_procs->rd_wr_fs_gs_support = 0;
1921 disabled_procs->enhanced_fast_string_support = 0;
1922 disabled_procs->bmi1_support = 0;
1923 disabled_procs->bmi2_support = 0;
1924 disabled_procs->hle_support_deprecated = 0;
1925 disabled_procs->rtm_support_deprecated = 0;
1926 disabled_procs->movbe_support = 0;
1927 disabled_procs->npiep1_support = 0;
1928 disabled_procs->dep_x87_fpu_save_support = 0;
1929 disabled_procs->rd_seed_support = 0;
1930 disabled_procs->adx_support = 0;
1931 disabled_procs->intel_prefetch_support = 0;
1932 disabled_procs->smap_support = 0;
1933 disabled_procs->hle_support = 0;
1934 disabled_procs->rtm_support = 0;
1935 disabled_procs->invpcid_support = 0;
1936 disabled_procs->ibrs_support = 0;
1937 disabled_procs->stibp_support = 0;
1938 disabled_procs->mdd_support = 0;
1939 disabled_procs->ibpb_support = 0;
1940 disabled_procs->l1dcache_flush_support = 0;
1941 disabled_procs->virt_spec_ctrl_support = 0;
1942 disabled_procs->mb_clear_support = 0;
1943 disabled_procs->tsx_ctrl_support = 0;
1944 disabled_procs->clflushopt_support = 0;
1945 disabled_procs->rdcl_no_support = 0;
1946 disabled_procs->ibrs_all_support = 0;
1947 disabled_procs->page_1gb_support = 0;
1948 disabled_procs->skip_l1df_support = 0;
1949 disabled_procs->ssb_no_support = 0;
1950 disabled_procs->mbs_no_support = 0;
1951 disabled_procs->taa_no_support = 0;
1952 disabled_procs->fb_clear_support = 0;
1953 disabled_procs->gds_no_support = 0;
1954 disabled_procs->bhi_no_support = 0;
1955 disabled_procs->bhi_dis_support = 0;
1956 disabled_procs->btc_no_support = 0;
1957 disabled_procs->mitigation_ctrl_support = 0;
1958 disabled_procs->rfds_no_support = 0;
1959 disabled_procs->rfds_clear_support = 0;
1960 disabled_procs->unrestricted_guest_support = 0;
1961 disabled_procs->fast_short_rep_mov_support = 0;
1962 disabled_procs->rsb_a_no_support = 0;
1963 disabled_procs->rd_pid_support = 0;
1964 disabled_procs->umip_support = 0;
1965 disabled_procs->vmx_exception_inject_support = 0;
1966 disabled_procs->rdpru_support = 0;
1967 disabled_procs->mbec_support = 0;
1968 disabled_procs->psfd_support = 0;
1969
1970 /* Enable default XSave features that are known to be supported*/
1971 disabled_xsave = &cr_props->disabled_processor_xsave_features;
1972 disabled_xsave->as_uint64 = -1;
1973 disabled_xsave->xsave_support = 0;
1974 disabled_xsave->xsaveopt_support = 0;
1975 disabled_xsave->avx_support = 0;
1976 disabled_xsave->xsave_supervisor_support = 0;
1977 disabled_xsave->xsave_comp_support = 0;
1978 #endif
1979 /* Check if user provided newer struct with feature fields */
1980 if (args.pt_flags & BIT(MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES)) {
1981 if (copy_from_user(&args, user_arg, sizeof(args)))
1982 return -EFAULT;
1983
1984 if (args.pt_num_cpu_fbanks > MSHV_NUM_CPU_FEATURES_BANKS ||
1985 mshv_field_nonzero(args, pt_rsvd) ||
1986 mshv_field_nonzero(args, pt_rsvd1))
1987 return -EINVAL;
1988
1989 for (i = 0; i < args.pt_num_cpu_fbanks; i++)
1990 disabled_procs->as_uint64[i] = args.pt_cpu_fbanks[i];
1991
1992 #if IS_ENABLED(CONFIG_X86_64)
1993 disabled_xsave->as_uint64 = args.pt_disabled_xsave;
1994 #else
1995 if (mshv_field_nonzero(args, pt_rsvd2))
> 1996 return -EINVAL
1997 #endif
1998 }
1999
2000 /* Only support EXO partitions */
2001 *pt_flags = HV_PARTITION_CREATION_FLAG_EXO_PARTITION |
2002 HV_PARTITION_CREATION_FLAG_INTERCEPT_MESSAGE_PAGE_ENABLED;
2003
2004 if (args.pt_flags & BIT(MSHV_PT_BIT_LAPIC))
2005 *pt_flags |= HV_PARTITION_CREATION_FLAG_LAPIC_ENABLED;
2006 if (args.pt_flags & BIT(MSHV_PT_BIT_X2APIC))
2007 *pt_flags |= HV_PARTITION_CREATION_FLAG_X2APIC_CAPABLE;
2008 if (args.pt_flags & BIT(MSHV_PT_BIT_GPA_SUPER_PAGES))
2009 *pt_flags |= HV_PARTITION_CREATION_FLAG_GPA_SUPER_PAGES_ENABLED;
2010
2011 switch (args.pt_isolation) {
2012 case MSHV_PT_ISOLATION_NONE:
2013 isol_props->isolation_type = HV_PARTITION_ISOLATION_TYPE_NONE;
2014 break;
2015 case MSHV_PT_ISOLATION_SNP:
2016 isol_props->isolation_type = HV_PARTITION_ISOLATION_TYPE_SNP;
2017 break;
2018 }
2019
2020 return 0;
2021 }
2022
--
0-DAY CI Kernel Test Service
https://github.com/intel/lkp-tests/wiki
© 2016 - 2026 Red Hat, Inc.