Message ID | 20220708144223.610080-6-vkuznets@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: VMX: Support updated eVMCSv1 revision + use vmcs_config for L1 VMX MSRs | expand |
On Fri, 2022-07-08 at 16:42 +0200, Vitaly Kuznetsov wrote: > Enlightened VMCS v1 definition was updated with new fields, add > support for them for Hyper-V on KVM. > > Note: SSP, CET and Guest LBR features are not supported by KVM yet > and 'struct vmcs12' has no corresponding fields. > > Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> > --- > arch/x86/kvm/vmx/nested.c | 31 +++++++++++++++++++++++++++++++ > 1 file changed, 31 insertions(+) > > diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c > index 778f82015f03..4fc84f0f5875 100644 > --- a/arch/x86/kvm/vmx/nested.c > +++ b/arch/x86/kvm/vmx/nested.c > @@ -1603,6 +1603,10 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields > vmcs12->guest_rflags = evmcs->guest_rflags; > vmcs12->guest_interruptibility_info = > evmcs->guest_interruptibility_info; > + /* > + * Not present in struct vmcs12: > + * vmcs12->guest_ssp = evmcs->guest_ssp; > + */ > } > > if (unlikely(!(hv_clean_fields & > @@ -1649,6 +1653,13 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields > vmcs12->host_fs_selector = evmcs->host_fs_selector; > vmcs12->host_gs_selector = evmcs->host_gs_selector; > vmcs12->host_tr_selector = evmcs->host_tr_selector; > + vmcs12->host_ia32_perf_global_ctrl = evmcs->host_ia32_perf_global_ctrl; > + /* > + * Not present in struct vmcs12: > + * vmcs12->host_ia32_s_cet = evmcs->host_ia32_s_cet; > + * vmcs12->host_ssp = evmcs->host_ssp; > + * vmcs12->host_ia32_int_ssp_table_addr = evmcs->host_ia32_int_ssp_table_addr; > + */ > } > > if (unlikely(!(hv_clean_fields & > @@ -1716,6 +1727,8 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields > vmcs12->tsc_offset = evmcs->tsc_offset; > vmcs12->virtual_apic_page_addr = evmcs->virtual_apic_page_addr; > vmcs12->xss_exit_bitmap = evmcs->xss_exit_bitmap; > + vmcs12->encls_exiting_bitmap = evmcs->encls_exiting_bitmap; > + vmcs12->tsc_multiplier = evmcs->tsc_multiplier; > } > > if (unlikely(!(hv_clean_fields & > @@ -1763,6 +1776,13 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields > vmcs12->guest_bndcfgs = evmcs->guest_bndcfgs; > vmcs12->guest_activity_state = evmcs->guest_activity_state; > vmcs12->guest_sysenter_cs = evmcs->guest_sysenter_cs; > + vmcs12->guest_ia32_perf_global_ctrl = evmcs->guest_ia32_perf_global_ctrl; > + /* > + * Not present in struct vmcs12: > + * vmcs12->guest_ia32_s_cet = evmcs->guest_ia32_s_cet; > + * vmcs12->guest_ia32_lbr_ctl = evmcs->guest_ia32_lbr_ctl; > + * vmcs12->guest_ia32_int_ssp_table_addr = evmcs->guest_ia32_int_ssp_table_addr; > + */ > } > > /* > @@ -1865,12 +1885,23 @@ static void copy_vmcs12_to_enlightened(struct vcpu_vmx *vmx) > * evmcs->vm_exit_msr_store_count = vmcs12->vm_exit_msr_store_count; > * evmcs->vm_exit_msr_load_count = vmcs12->vm_exit_msr_load_count; > * evmcs->vm_entry_msr_load_count = vmcs12->vm_entry_msr_load_count; > + * evmcs->guest_ia32_perf_global_ctrl = vmcs12->guest_ia32_perf_global_ctrl; > + * evmcs->host_ia32_perf_global_ctrl = vmcs12->host_ia32_perf_global_ctrl; > + * evmcs->encls_exiting_bitmap = vmcs12->encls_exiting_bitmap; > + * evmcs->tsc_multiplier = vmcs12->tsc_multiplier; > * > * Not present in struct vmcs12: > * evmcs->exit_io_instruction_ecx = vmcs12->exit_io_instruction_ecx; > * evmcs->exit_io_instruction_esi = vmcs12->exit_io_instruction_esi; > * evmcs->exit_io_instruction_edi = vmcs12->exit_io_instruction_edi; > * evmcs->exit_io_instruction_eip = vmcs12->exit_io_instruction_eip; > + * evmcs->host_ia32_s_cet = vmcs12->host_ia32_s_cet; > + * evmcs->host_ssp = vmcs12->host_ssp; > + * evmcs->host_ia32_int_ssp_table_addr = vmcs12->host_ia32_int_ssp_table_addr; > + * evmcs->guest_ia32_s_cet = vmcs12->guest_ia32_s_cet; > + * evmcs->guest_ia32_lbr_ctl = vmcs12->guest_ia32_lbr_ctl; > + * evmcs->guest_ia32_int_ssp_table_addr = vmcs12->guest_ia32_int_ssp_table_addr; > + * evmcs->guest_ssp = vmcs12->guest_ssp; > */ > > evmcs->guest_es_selector = vmcs12->guest_es_selector; Looks good. Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com> Best regards, Maxim Levitsky
diff --git a/arch/x86/kvm/vmx/nested.c b/arch/x86/kvm/vmx/nested.c index 778f82015f03..4fc84f0f5875 100644 --- a/arch/x86/kvm/vmx/nested.c +++ b/arch/x86/kvm/vmx/nested.c @@ -1603,6 +1603,10 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields vmcs12->guest_rflags = evmcs->guest_rflags; vmcs12->guest_interruptibility_info = evmcs->guest_interruptibility_info; + /* + * Not present in struct vmcs12: + * vmcs12->guest_ssp = evmcs->guest_ssp; + */ } if (unlikely(!(hv_clean_fields & @@ -1649,6 +1653,13 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields vmcs12->host_fs_selector = evmcs->host_fs_selector; vmcs12->host_gs_selector = evmcs->host_gs_selector; vmcs12->host_tr_selector = evmcs->host_tr_selector; + vmcs12->host_ia32_perf_global_ctrl = evmcs->host_ia32_perf_global_ctrl; + /* + * Not present in struct vmcs12: + * vmcs12->host_ia32_s_cet = evmcs->host_ia32_s_cet; + * vmcs12->host_ssp = evmcs->host_ssp; + * vmcs12->host_ia32_int_ssp_table_addr = evmcs->host_ia32_int_ssp_table_addr; + */ } if (unlikely(!(hv_clean_fields & @@ -1716,6 +1727,8 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields vmcs12->tsc_offset = evmcs->tsc_offset; vmcs12->virtual_apic_page_addr = evmcs->virtual_apic_page_addr; vmcs12->xss_exit_bitmap = evmcs->xss_exit_bitmap; + vmcs12->encls_exiting_bitmap = evmcs->encls_exiting_bitmap; + vmcs12->tsc_multiplier = evmcs->tsc_multiplier; } if (unlikely(!(hv_clean_fields & @@ -1763,6 +1776,13 @@ static void copy_enlightened_to_vmcs12(struct vcpu_vmx *vmx, u32 hv_clean_fields vmcs12->guest_bndcfgs = evmcs->guest_bndcfgs; vmcs12->guest_activity_state = evmcs->guest_activity_state; vmcs12->guest_sysenter_cs = evmcs->guest_sysenter_cs; + vmcs12->guest_ia32_perf_global_ctrl = evmcs->guest_ia32_perf_global_ctrl; + /* + * Not present in struct vmcs12: + * vmcs12->guest_ia32_s_cet = evmcs->guest_ia32_s_cet; + * vmcs12->guest_ia32_lbr_ctl = evmcs->guest_ia32_lbr_ctl; + * vmcs12->guest_ia32_int_ssp_table_addr = evmcs->guest_ia32_int_ssp_table_addr; + */ } /* @@ -1865,12 +1885,23 @@ static void copy_vmcs12_to_enlightened(struct vcpu_vmx *vmx) * evmcs->vm_exit_msr_store_count = vmcs12->vm_exit_msr_store_count; * evmcs->vm_exit_msr_load_count = vmcs12->vm_exit_msr_load_count; * evmcs->vm_entry_msr_load_count = vmcs12->vm_entry_msr_load_count; + * evmcs->guest_ia32_perf_global_ctrl = vmcs12->guest_ia32_perf_global_ctrl; + * evmcs->host_ia32_perf_global_ctrl = vmcs12->host_ia32_perf_global_ctrl; + * evmcs->encls_exiting_bitmap = vmcs12->encls_exiting_bitmap; + * evmcs->tsc_multiplier = vmcs12->tsc_multiplier; * * Not present in struct vmcs12: * evmcs->exit_io_instruction_ecx = vmcs12->exit_io_instruction_ecx; * evmcs->exit_io_instruction_esi = vmcs12->exit_io_instruction_esi; * evmcs->exit_io_instruction_edi = vmcs12->exit_io_instruction_edi; * evmcs->exit_io_instruction_eip = vmcs12->exit_io_instruction_eip; + * evmcs->host_ia32_s_cet = vmcs12->host_ia32_s_cet; + * evmcs->host_ssp = vmcs12->host_ssp; + * evmcs->host_ia32_int_ssp_table_addr = vmcs12->host_ia32_int_ssp_table_addr; + * evmcs->guest_ia32_s_cet = vmcs12->guest_ia32_s_cet; + * evmcs->guest_ia32_lbr_ctl = vmcs12->guest_ia32_lbr_ctl; + * evmcs->guest_ia32_int_ssp_table_addr = vmcs12->guest_ia32_int_ssp_table_addr; + * evmcs->guest_ssp = vmcs12->guest_ssp; */ evmcs->guest_es_selector = vmcs12->guest_es_selector;
Enlightened VMCS v1 definition was updated with new fields, add support for them for Hyper-V on KVM. Note: SSP, CET and Guest LBR features are not supported by KVM yet and 'struct vmcs12' has no corresponding fields. Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> --- arch/x86/kvm/vmx/nested.c | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+)