From: Wei Liu <[email protected]>

For legacy create-partition callers, disable all processor and xsave
features first, then enable only the default feature set known to be
supported. Passing an all-zero disabled feature mask can make SEV-SNP
partition creation fail on Hyper-V.

Signed-off-by: Wei Liu <[email protected]>
---
 drivers/hv/mshv_root_main.c | 90 ++++++++++++++++++++++++++++++++-----
 1 file changed, 80 insertions(+), 10 deletions(-)

diff --git a/drivers/hv/mshv_root_main.c b/drivers/hv/mshv_root_main.c
index cc38507570ac..11d3c86050b4 100644
--- a/drivers/hv/mshv_root_main.c
+++ b/drivers/hv/mshv_root_main.c
@@ -2333,6 +2333,86 @@ static long mshv_ioctl_process_pt_flags(void __user 
*user_arg, u64 *pt_flags,
        disabled_procs = &cr_props->disabled_processor_features;
        disabled_xsave = &cr_props->disabled_processor_xsave_features;
 
+       /* Disable all processor features first. */
+       for (i = 0; i < HV_PARTITION_PROCESSOR_FEATURES_BANKS; i++)
+               disabled_procs->as_uint64[i] = U64_MAX;
+
+#if IS_ENABLED(CONFIG_X86_64)
+       /* Enable default features that are known to be supported. */
+       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->page_1gb_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->smep_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->rdtscp_support = 0;
+       disabled_procs->clflushopt_support = 0;
+       disabled_procs->invpcid_support = 0;
+       disabled_procs->ibrs_support = 0;
+       disabled_procs->stibp_support = 0;
+       disabled_procs->ibpb_support = 0;
+       disabled_procs->unrestricted_guest_support = 0;
+       disabled_procs->mdd_support = 0;
+       disabled_procs->fast_short_rep_mov_support = 0;
+       disabled_procs->l1dcache_flush_support = 0;
+       disabled_procs->rdcl_no_support = 0;
+       disabled_procs->ibrs_all_support = 0;
+       disabled_procs->skip_l1df_support = 0;
+       disabled_procs->ssb_no_support = 0;
+       disabled_procs->rsb_a_no_support = 0;
+       disabled_procs->virt_spec_ctrl_support = 0;
+       disabled_procs->rd_pid_support = 0;
+       disabled_procs->umip_support = 0;
+       disabled_procs->mbs_no_support = 0;
+       disabled_procs->mb_clear_support = 0;
+       disabled_procs->taa_no_support = 0;
+       disabled_procs->tsx_ctrl_support = 0;
+       disabled_procs->tsc_invariant_support = 0;
+       disabled_procs->rdpru_support = 0;
+       disabled_procs->mbec_support = 0;
+       disabled_procs->psfd_support = 0;
+       disabled_procs->cet_ss_support = 0;
+       disabled_procs->cet_ibt_support = 0;
+       disabled_procs->vmx_exception_inject_support = 0;
+
+       disabled_xsave->as_uint64 = U64_MAX;
+       disabled_xsave->xsave_support = 0;
+       disabled_xsave->xsaveopt_support = 0;
+       disabled_xsave->avx_support = 0;
+#endif
+
        /* Check if user provided newer struct with feature fields */
        if (args.pt_flags & BIT_ULL(MSHV_PT_BIT_CPU_AND_XSAVE_FEATURES)) {
                if (copy_from_user(&args, user_arg, sizeof(args)))
@@ -2371,16 +2451,6 @@ static long mshv_ioctl_process_pt_flags(void __user 
*user_arg, u64 *pt_flags,
                if (mshv_field_nonzero(args, pt_rsvd2))
                        return -EINVAL;
 #endif
-       } else {
-               /*
-                * v1 behavior: try to enable everything. The hypervisor will
-                * disable features that are not supported. The banks can be
-                * queried via the get partition property hypercall.
-                */
-               for (i = 0; i < HV_PARTITION_PROCESSOR_FEATURES_BANKS; i++)
-                       disabled_procs->as_uint64[i] = 0;
-
-               disabled_xsave->as_uint64 = 0;
        }
 
        /* Only support EXO partitions */
-- 
2.43.0


Reply via email to