On Sun, Sep 04, 2016 at 09:23:15PM +0300, Jan Dakinevich wrote: > Expose the feature to L1 hypervisor if host CPU supports it, since > certain hypervisors requires it for own purposes. > > According to Intel SDM A.1, if CPU supports the feature, > VMX_INSTRUCTION_INFO field of VMCS will contain detailed information > about INS/OUTS instructions handling. This field is already copied to > VMCS12 for L1 hypervisor (see prepare_vmcs12 routine) independently > feature presence. > > Signed-off-by: Jan Dakinevich <jan.dakinevich@xxxxxxxxx> > --- > arch/x86/kvm/vmx.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c > index a4bb2bd..4fd22a6 100644 > --- a/arch/x86/kvm/vmx.c > +++ b/arch/x86/kvm/vmx.c > @@ -939,6 +939,7 @@ static DEFINE_SPINLOCK(vmx_vpid_lock); > static struct vmcs_config { > int size; > int order; > + u32 basic_cap; > u32 revision_id; > u32 pin_based_exec_ctrl; > u32 cpu_based_exec_ctrl; > @@ -1215,6 +1216,11 @@ static inline bool cpu_has_vmx_ple(void) > SECONDARY_EXEC_PAUSE_LOOP_EXITING; > } > > +static inline bool cpu_has_vmx_basic_inout(void) inline is useless. See Documentation/CodingStyle, Chapter 15 > +{ > + return (((u64)vmcs_config.basic_cap << 32) & VMX_BASIC_INOUT); You can shift VMX_BASIC_INOUT (at compile time) and avoid the shifting of vmcs_config.basic_cap at runtime. > +} > + > static inline bool cpu_need_virtualize_apic_accesses(struct kvm_vcpu *vcpu) > { > return flexpriority_enabled && lapic_in_kernel(vcpu); > @@ -2877,6 +2883,8 @@ static int vmx_get_vmx_msr(struct kvm_vcpu *vcpu, u32 msr_index, u64 *pdata) > *pdata = VMCS12_REVISION | VMX_BASIC_TRUE_CTLS | > ((u64)VMCS12_SIZE << VMX_BASIC_VMCS_SIZE_SHIFT) | > (VMX_BASIC_MEM_TYPE_WB << VMX_BASIC_MEM_TYPE_SHIFT); > + if (cpu_has_vmx_basic_inout()) > + *pdata |= VMX_BASIC_INOUT; > break; > case MSR_IA32_VMX_TRUE_PINBASED_CTLS: > case MSR_IA32_VMX_PINBASED_CTLS: > @@ -3458,6 +3466,7 @@ static __init int setup_vmcs_config(struct vmcs_config *vmcs_conf) > > vmcs_conf->size = vmx_msr_high & 0x1fff; > vmcs_conf->order = get_order(vmcs_config.size); > + vmcs_conf->basic_cap = vmx_msr_high; > vmcs_conf->revision_id = vmx_msr_low; > > vmcs_conf->pin_based_exec_ctrl = _pin_based_exec_control; > -- > 1.9.1 -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html