aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVitaly Kuznetsov <vkuznets@redhat.com>2018-10-19 10:16:03 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2018-10-19 12:45:14 -0400
commitcbe3f898d159f4a6ed12121672c823b780df32d3 (patch)
tree0078a25798a55c8b514601f204f65094b4f21a5c
parentf15ac811e80b857a443476de60ce70d3e6049ae5 (diff)
x86/kvm/nVMX: tweak shadow fields
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@redhat.com> Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/vmx.c10
-rw-r--r--arch/x86/kvm/vmx_shadow_fields.h5
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)
12715 if (!hv_evmcs || !(hv_evmcs->hv_clean_fields & 12715 if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
12716 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) { 12716 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) {
12717 vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector); 12717 vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector);
12718 vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector);
12718 vmcs_write16(GUEST_SS_SELECTOR, vmcs12->guest_ss_selector); 12719 vmcs_write16(GUEST_SS_SELECTOR, vmcs12->guest_ss_selector);
12719 vmcs_write16(GUEST_DS_SELECTOR, vmcs12->guest_ds_selector); 12720 vmcs_write16(GUEST_DS_SELECTOR, vmcs12->guest_ds_selector);
12720 vmcs_write16(GUEST_FS_SELECTOR, vmcs12->guest_fs_selector); 12721 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)
12722 vmcs_write16(GUEST_LDTR_SELECTOR, vmcs12->guest_ldtr_selector); 12723 vmcs_write16(GUEST_LDTR_SELECTOR, vmcs12->guest_ldtr_selector);
12723 vmcs_write16(GUEST_TR_SELECTOR, vmcs12->guest_tr_selector); 12724 vmcs_write16(GUEST_TR_SELECTOR, vmcs12->guest_tr_selector);
12724 vmcs_write32(GUEST_ES_LIMIT, vmcs12->guest_es_limit); 12725 vmcs_write32(GUEST_ES_LIMIT, vmcs12->guest_es_limit);
12726 vmcs_write32(GUEST_CS_LIMIT, vmcs12->guest_cs_limit);
12725 vmcs_write32(GUEST_SS_LIMIT, vmcs12->guest_ss_limit); 12727 vmcs_write32(GUEST_SS_LIMIT, vmcs12->guest_ss_limit);
12726 vmcs_write32(GUEST_DS_LIMIT, vmcs12->guest_ds_limit); 12728 vmcs_write32(GUEST_DS_LIMIT, vmcs12->guest_ds_limit);
12727 vmcs_write32(GUEST_FS_LIMIT, vmcs12->guest_fs_limit); 12729 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)
12731 vmcs_write32(GUEST_GDTR_LIMIT, vmcs12->guest_gdtr_limit); 12733 vmcs_write32(GUEST_GDTR_LIMIT, vmcs12->guest_gdtr_limit);
12732 vmcs_write32(GUEST_IDTR_LIMIT, vmcs12->guest_idtr_limit); 12734 vmcs_write32(GUEST_IDTR_LIMIT, vmcs12->guest_idtr_limit);
12733 vmcs_write32(GUEST_ES_AR_BYTES, vmcs12->guest_es_ar_bytes); 12735 vmcs_write32(GUEST_ES_AR_BYTES, vmcs12->guest_es_ar_bytes);
12734 vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes);
12735 vmcs_write32(GUEST_DS_AR_BYTES, vmcs12->guest_ds_ar_bytes); 12736 vmcs_write32(GUEST_DS_AR_BYTES, vmcs12->guest_ds_ar_bytes);
12736 vmcs_write32(GUEST_FS_AR_BYTES, vmcs12->guest_fs_ar_bytes); 12737 vmcs_write32(GUEST_FS_AR_BYTES, vmcs12->guest_fs_ar_bytes);
12737 vmcs_write32(GUEST_GS_AR_BYTES, vmcs12->guest_gs_ar_bytes); 12738 vmcs_write32(GUEST_GS_AR_BYTES, vmcs12->guest_gs_ar_bytes);
12738 vmcs_write32(GUEST_LDTR_AR_BYTES, vmcs12->guest_ldtr_ar_bytes); 12739 vmcs_write32(GUEST_LDTR_AR_BYTES, vmcs12->guest_ldtr_ar_bytes);
12739 vmcs_write32(GUEST_TR_AR_BYTES, vmcs12->guest_tr_ar_bytes); 12740 vmcs_write32(GUEST_TR_AR_BYTES, vmcs12->guest_tr_ar_bytes);
12741 vmcs_writel(GUEST_ES_BASE, vmcs12->guest_es_base);
12742 vmcs_writel(GUEST_CS_BASE, vmcs12->guest_cs_base);
12740 vmcs_writel(GUEST_SS_BASE, vmcs12->guest_ss_base); 12743 vmcs_writel(GUEST_SS_BASE, vmcs12->guest_ss_base);
12741 vmcs_writel(GUEST_DS_BASE, vmcs12->guest_ds_base); 12744 vmcs_writel(GUEST_DS_BASE, vmcs12->guest_ds_base);
12742 vmcs_writel(GUEST_FS_BASE, vmcs12->guest_fs_base); 12745 vmcs_writel(GUEST_FS_BASE, vmcs12->guest_fs_base);
@@ -12838,11 +12841,8 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
12838 */ 12841 */
12839 if (!hv_evmcs || !(hv_evmcs->hv_clean_fields & 12842 if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
12840 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) { 12843 HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) {
12841 vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector);
12842 vmcs_write32(GUEST_CS_LIMIT, vmcs12->guest_cs_limit);
12843 vmcs_write32(GUEST_CS_AR_BYTES, vmcs12->guest_cs_ar_bytes); 12844 vmcs_write32(GUEST_CS_AR_BYTES, vmcs12->guest_cs_ar_bytes);
12844 vmcs_writel(GUEST_ES_BASE, vmcs12->guest_es_base); 12845 vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes);
12845 vmcs_writel(GUEST_CS_BASE, vmcs12->guest_cs_base);
12846 } 12846 }
12847 12847
12848 if (vmx->nested.nested_run_pending && 12848 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 @@
28 */ 28 */
29 29
30/* 16-bits */ 30/* 16-bits */
31SHADOW_FIELD_RW(GUEST_CS_SELECTOR)
32SHADOW_FIELD_RW(GUEST_INTR_STATUS) 31SHADOW_FIELD_RW(GUEST_INTR_STATUS)
33SHADOW_FIELD_RW(GUEST_PML_INDEX) 32SHADOW_FIELD_RW(GUEST_PML_INDEX)
34SHADOW_FIELD_RW(HOST_FS_SELECTOR) 33SHADOW_FIELD_RW(HOST_FS_SELECTOR)
@@ -47,8 +46,8 @@ SHADOW_FIELD_RW(VM_ENTRY_EXCEPTION_ERROR_CODE)
47SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD) 46SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD)
48SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN) 47SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN)
49SHADOW_FIELD_RW(TPR_THRESHOLD) 48SHADOW_FIELD_RW(TPR_THRESHOLD)
50SHADOW_FIELD_RW(GUEST_CS_LIMIT)
51SHADOW_FIELD_RW(GUEST_CS_AR_BYTES) 49SHADOW_FIELD_RW(GUEST_CS_AR_BYTES)
50SHADOW_FIELD_RW(GUEST_SS_AR_BYTES)
52SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO) 51SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO)
53SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE) 52SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE)
54 53
@@ -61,8 +60,6 @@ SHADOW_FIELD_RW(GUEST_CR0)
61SHADOW_FIELD_RW(GUEST_CR3) 60SHADOW_FIELD_RW(GUEST_CR3)
62SHADOW_FIELD_RW(GUEST_CR4) 61SHADOW_FIELD_RW(GUEST_CR4)
63SHADOW_FIELD_RW(GUEST_RFLAGS) 62SHADOW_FIELD_RW(GUEST_RFLAGS)
64SHADOW_FIELD_RW(GUEST_CS_BASE)
65SHADOW_FIELD_RW(GUEST_ES_BASE)
66SHADOW_FIELD_RW(CR0_GUEST_HOST_MASK) 63SHADOW_FIELD_RW(CR0_GUEST_HOST_MASK)
67SHADOW_FIELD_RW(CR0_READ_SHADOW) 64SHADOW_FIELD_RW(CR0_READ_SHADOW)
68SHADOW_FIELD_RW(CR4_READ_SHADOW) 65SHADOW_FIELD_RW(CR4_READ_SHADOW)