diff options
author | Vitaly Kuznetsov <vkuznets@redhat.com> | 2018-10-19 10:16:03 -0400 |
---|---|---|
committer | Paolo Bonzini <pbonzini@redhat.com> | 2018-10-19 12:45:14 -0400 |
commit | cbe3f898d159f4a6ed12121672c823b780df32d3 (patch) | |
tree | 0078a25798a55c8b514601f204f65094b4f21a5c | |
parent | f15ac811e80b857a443476de60ce70d3e6049ae5 (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.c | 10 | ||||
-rw-r--r-- | 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) | |||
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 */ |
31 | SHADOW_FIELD_RW(GUEST_CS_SELECTOR) | ||
32 | SHADOW_FIELD_RW(GUEST_INTR_STATUS) | 31 | SHADOW_FIELD_RW(GUEST_INTR_STATUS) |
33 | SHADOW_FIELD_RW(GUEST_PML_INDEX) | 32 | SHADOW_FIELD_RW(GUEST_PML_INDEX) |
34 | SHADOW_FIELD_RW(HOST_FS_SELECTOR) | 33 | SHADOW_FIELD_RW(HOST_FS_SELECTOR) |
@@ -47,8 +46,8 @@ SHADOW_FIELD_RW(VM_ENTRY_EXCEPTION_ERROR_CODE) | |||
47 | SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD) | 46 | SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD) |
48 | SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN) | 47 | SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN) |
49 | SHADOW_FIELD_RW(TPR_THRESHOLD) | 48 | SHADOW_FIELD_RW(TPR_THRESHOLD) |
50 | SHADOW_FIELD_RW(GUEST_CS_LIMIT) | ||
51 | SHADOW_FIELD_RW(GUEST_CS_AR_BYTES) | 49 | SHADOW_FIELD_RW(GUEST_CS_AR_BYTES) |
50 | SHADOW_FIELD_RW(GUEST_SS_AR_BYTES) | ||
52 | SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO) | 51 | SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO) |
53 | SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE) | 52 | SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE) |
54 | 53 | ||
@@ -61,8 +60,6 @@ SHADOW_FIELD_RW(GUEST_CR0) | |||
61 | SHADOW_FIELD_RW(GUEST_CR3) | 60 | SHADOW_FIELD_RW(GUEST_CR3) |
62 | SHADOW_FIELD_RW(GUEST_CR4) | 61 | SHADOW_FIELD_RW(GUEST_CR4) |
63 | SHADOW_FIELD_RW(GUEST_RFLAGS) | 62 | SHADOW_FIELD_RW(GUEST_RFLAGS) |
64 | SHADOW_FIELD_RW(GUEST_CS_BASE) | ||
65 | SHADOW_FIELD_RW(GUEST_ES_BASE) | ||
66 | SHADOW_FIELD_RW(CR0_GUEST_HOST_MASK) | 63 | SHADOW_FIELD_RW(CR0_GUEST_HOST_MASK) |
67 | SHADOW_FIELD_RW(CR0_READ_SHADOW) | 64 | SHADOW_FIELD_RW(CR0_READ_SHADOW) |
68 | SHADOW_FIELD_RW(CR4_READ_SHADOW) | 65 | SHADOW_FIELD_RW(CR4_READ_SHADOW) |