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

