Re: [PATCH] x86/kvm/nVMX: tweak shadow fields

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 19/10/2018 16:16, Vitaly Kuznetsov wrote:
> It seems we have some leftovers from times when 'unrestricted guest'
> wasn't exposed to L1. Stop shadowing GUEST_CS_{BASE,LIMIT,AR_SELECTOR}
> and GUEST_ES_BASE, shadow GUEST_SS_AR_BYTES as it was found that some
> hypervisors (e.g. Hyper-V without Enlightened VMCS) access it pretty
> often.
> 
> Suggested-by: Paolo Bonzini <pbonzini@xxxxxxxxxx>
> Signed-off-by: Vitaly Kuznetsov <vkuznets@xxxxxxxxxx>

Queued, thanks.

Paolo

> ---
>  arch/x86/kvm/vmx.c               | 10 +++++-----
>  arch/x86/kvm/vmx_shadow_fields.h |  5 +----
>  2 files changed, 6 insertions(+), 9 deletions(-)
> 
> diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
> index abeeb45d1c33..641a65b30685 100644
> --- a/arch/x86/kvm/vmx.c
> +++ b/arch/x86/kvm/vmx.c
> @@ -12715,6 +12715,7 @@ static void prepare_vmcs02_full(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
>  	if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
>  			   HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) {
>  		vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector);
> +		vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector);
>  		vmcs_write16(GUEST_SS_SELECTOR, vmcs12->guest_ss_selector);
>  		vmcs_write16(GUEST_DS_SELECTOR, vmcs12->guest_ds_selector);
>  		vmcs_write16(GUEST_FS_SELECTOR, vmcs12->guest_fs_selector);
> @@ -12722,6 +12723,7 @@ static void prepare_vmcs02_full(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
>  		vmcs_write16(GUEST_LDTR_SELECTOR, vmcs12->guest_ldtr_selector);
>  		vmcs_write16(GUEST_TR_SELECTOR, vmcs12->guest_tr_selector);
>  		vmcs_write32(GUEST_ES_LIMIT, vmcs12->guest_es_limit);
> +		vmcs_write32(GUEST_CS_LIMIT, vmcs12->guest_cs_limit);
>  		vmcs_write32(GUEST_SS_LIMIT, vmcs12->guest_ss_limit);
>  		vmcs_write32(GUEST_DS_LIMIT, vmcs12->guest_ds_limit);
>  		vmcs_write32(GUEST_FS_LIMIT, vmcs12->guest_fs_limit);
> @@ -12731,12 +12733,13 @@ static void prepare_vmcs02_full(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
>  		vmcs_write32(GUEST_GDTR_LIMIT, vmcs12->guest_gdtr_limit);
>  		vmcs_write32(GUEST_IDTR_LIMIT, vmcs12->guest_idtr_limit);
>  		vmcs_write32(GUEST_ES_AR_BYTES, vmcs12->guest_es_ar_bytes);
> -		vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes);
>  		vmcs_write32(GUEST_DS_AR_BYTES, vmcs12->guest_ds_ar_bytes);
>  		vmcs_write32(GUEST_FS_AR_BYTES, vmcs12->guest_fs_ar_bytes);
>  		vmcs_write32(GUEST_GS_AR_BYTES, vmcs12->guest_gs_ar_bytes);
>  		vmcs_write32(GUEST_LDTR_AR_BYTES, vmcs12->guest_ldtr_ar_bytes);
>  		vmcs_write32(GUEST_TR_AR_BYTES, vmcs12->guest_tr_ar_bytes);
> +		vmcs_writel(GUEST_ES_BASE, vmcs12->guest_es_base);
> +		vmcs_writel(GUEST_CS_BASE, vmcs12->guest_cs_base);
>  		vmcs_writel(GUEST_SS_BASE, vmcs12->guest_ss_base);
>  		vmcs_writel(GUEST_DS_BASE, vmcs12->guest_ds_base);
>  		vmcs_writel(GUEST_FS_BASE, vmcs12->guest_fs_base);
> @@ -12838,11 +12841,8 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
>  	 */
>  	if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
>  			   HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) {
> -		vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector);
> -		vmcs_write32(GUEST_CS_LIMIT, vmcs12->guest_cs_limit);
>  		vmcs_write32(GUEST_CS_AR_BYTES, vmcs12->guest_cs_ar_bytes);
> -		vmcs_writel(GUEST_ES_BASE, vmcs12->guest_es_base);
> -		vmcs_writel(GUEST_CS_BASE, vmcs12->guest_cs_base);
> +		vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes);
>  	}
>  
>  	if (vmx->nested.nested_run_pending &&
> diff --git a/arch/x86/kvm/vmx_shadow_fields.h b/arch/x86/kvm/vmx_shadow_fields.h
> index cd0c75f6d037..132432f375c2 100644
> --- a/arch/x86/kvm/vmx_shadow_fields.h
> +++ b/arch/x86/kvm/vmx_shadow_fields.h
> @@ -28,7 +28,6 @@
>   */
>  
>  /* 16-bits */
> -SHADOW_FIELD_RW(GUEST_CS_SELECTOR)
>  SHADOW_FIELD_RW(GUEST_INTR_STATUS)
>  SHADOW_FIELD_RW(GUEST_PML_INDEX)
>  SHADOW_FIELD_RW(HOST_FS_SELECTOR)
> @@ -47,8 +46,8 @@ SHADOW_FIELD_RW(VM_ENTRY_EXCEPTION_ERROR_CODE)
>  SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD)
>  SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN)
>  SHADOW_FIELD_RW(TPR_THRESHOLD)
> -SHADOW_FIELD_RW(GUEST_CS_LIMIT)
>  SHADOW_FIELD_RW(GUEST_CS_AR_BYTES)
> +SHADOW_FIELD_RW(GUEST_SS_AR_BYTES)
>  SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO)
>  SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE)
>  
> @@ -61,8 +60,6 @@ SHADOW_FIELD_RW(GUEST_CR0)
>  SHADOW_FIELD_RW(GUEST_CR3)
>  SHADOW_FIELD_RW(GUEST_CR4)
>  SHADOW_FIELD_RW(GUEST_RFLAGS)
> -SHADOW_FIELD_RW(GUEST_CS_BASE)
> -SHADOW_FIELD_RW(GUEST_ES_BASE)
>  SHADOW_FIELD_RW(CR0_GUEST_HOST_MASK)
>  SHADOW_FIELD_RW(CR0_READ_SHADOW)
>  SHADOW_FIELD_RW(CR4_READ_SHADOW)
> 




[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux