On Mon, Aug 09, 2021, Zeng Guang wrote: > diff --git a/arch/x86/kvm/vmx/vmx.c b/arch/x86/kvm/vmx/vmx.c > index 927a552393b9..ee8c5664dc95 100644 > --- a/arch/x86/kvm/vmx/vmx.c > +++ b/arch/x86/kvm/vmx/vmx.c > @@ -2391,6 +2391,23 @@ static __init int adjust_vmx_controls(u32 ctl_min, u32 ctl_opt, > return 0; > } > > +static __init int adjust_vmx_controls_64(u64 ctl_min, u64 ctl_opt, > + u32 msr, u64 *result) > +{ > + u64 vmx_msr; > + u64 ctl = ctl_min | ctl_opt; > + > + rdmsrl(msr, vmx_msr); > + ctl &= vmx_msr; /* bit == 1 means it can be set */ > + > + /* Ensure minimum (required) set of control bits are supported. */ > + if (ctl_min & ~ctl) > + return -EIO; > + > + *result = ctl; > + return 0; > +} More succinctly, since we don't need to force-set bits in the final value: u64 allowed1; rdmsrl(msr, allowed1); /* Ensure minimum (required) set of control bits are supported. */ if (ctl_min & ~allowed1) return -EIO; *result = (ctl_min | ctl_opt) & allowed1; return 0; > static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf, > struct vmx_capability *vmx_cap) > {