Skip to content

Commit cbe3f89

Browse files
vittyvkbonzini
authored andcommitted
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>
1 parent f15ac81 commit cbe3f89

File tree

2 files changed

+6
-9
lines changed

2 files changed

+6
-9
lines changed

arch/x86/kvm/vmx.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12715,13 +12715,15 @@ static void prepare_vmcs02_full(struct vcpu_vmx *vmx, struct vmcs12 *vmcs12)
1271512715
if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
1271612716
HV_VMX_ENLIGHTENED_CLEAN_FIELD_GUEST_GRP2)) {
1271712717
vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector);
12718+
vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector);
1271812719
vmcs_write16(GUEST_SS_SELECTOR, vmcs12->guest_ss_selector);
1271912720
vmcs_write16(GUEST_DS_SELECTOR, vmcs12->guest_ds_selector);
1272012721
vmcs_write16(GUEST_FS_SELECTOR, vmcs12->guest_fs_selector);
1272112722
vmcs_write16(GUEST_GS_SELECTOR, vmcs12->guest_gs_selector);
1272212723
vmcs_write16(GUEST_LDTR_SELECTOR, vmcs12->guest_ldtr_selector);
1272312724
vmcs_write16(GUEST_TR_SELECTOR, vmcs12->guest_tr_selector);
1272412725
vmcs_write32(GUEST_ES_LIMIT, vmcs12->guest_es_limit);
12726+
vmcs_write32(GUEST_CS_LIMIT, vmcs12->guest_cs_limit);
1272512727
vmcs_write32(GUEST_SS_LIMIT, vmcs12->guest_ss_limit);
1272612728
vmcs_write32(GUEST_DS_LIMIT, vmcs12->guest_ds_limit);
1272712729
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)
1273112733
vmcs_write32(GUEST_GDTR_LIMIT, vmcs12->guest_gdtr_limit);
1273212734
vmcs_write32(GUEST_IDTR_LIMIT, vmcs12->guest_idtr_limit);
1273312735
vmcs_write32(GUEST_ES_AR_BYTES, vmcs12->guest_es_ar_bytes);
12734-
vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes);
1273512736
vmcs_write32(GUEST_DS_AR_BYTES, vmcs12->guest_ds_ar_bytes);
1273612737
vmcs_write32(GUEST_FS_AR_BYTES, vmcs12->guest_fs_ar_bytes);
1273712738
vmcs_write32(GUEST_GS_AR_BYTES, vmcs12->guest_gs_ar_bytes);
1273812739
vmcs_write32(GUEST_LDTR_AR_BYTES, vmcs12->guest_ldtr_ar_bytes);
1273912740
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);
1274012743
vmcs_writel(GUEST_SS_BASE, vmcs12->guest_ss_base);
1274112744
vmcs_writel(GUEST_DS_BASE, vmcs12->guest_ds_base);
1274212745
vmcs_writel(GUEST_FS_BASE, vmcs12->guest_fs_base);
@@ -12838,11 +12841,8 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
1283812841
*/
1283912842
if (!hv_evmcs || !(hv_evmcs->hv_clean_fields &
1284012843
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);
1284312844
vmcs_write32(GUEST_CS_AR_BYTES, vmcs12->guest_cs_ar_bytes);
12844-
vmcs_writel(GUEST_ES_BASE, vmcs12->guest_es_base);
12845-
vmcs_writel(GUEST_CS_BASE, vmcs12->guest_cs_base);
12845+
vmcs_write32(GUEST_SS_AR_BYTES, vmcs12->guest_ss_ar_bytes);
1284612846
}
1284712847

1284812848
if (vmx->nested.nested_run_pending &&

arch/x86/kvm/vmx_shadow_fields.h

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
*/
2929

3030
/* 16-bits */
31-
SHADOW_FIELD_RW(GUEST_CS_SELECTOR)
3231
SHADOW_FIELD_RW(GUEST_INTR_STATUS)
3332
SHADOW_FIELD_RW(GUEST_PML_INDEX)
3433
SHADOW_FIELD_RW(HOST_FS_SELECTOR)
@@ -47,8 +46,8 @@ SHADOW_FIELD_RW(VM_ENTRY_EXCEPTION_ERROR_CODE)
4746
SHADOW_FIELD_RW(VM_ENTRY_INTR_INFO_FIELD)
4847
SHADOW_FIELD_RW(VM_ENTRY_INSTRUCTION_LEN)
4948
SHADOW_FIELD_RW(TPR_THRESHOLD)
50-
SHADOW_FIELD_RW(GUEST_CS_LIMIT)
5149
SHADOW_FIELD_RW(GUEST_CS_AR_BYTES)
50+
SHADOW_FIELD_RW(GUEST_SS_AR_BYTES)
5251
SHADOW_FIELD_RW(GUEST_INTERRUPTIBILITY_INFO)
5352
SHADOW_FIELD_RW(VMX_PREEMPTION_TIMER_VALUE)
5453

@@ -61,8 +60,6 @@ SHADOW_FIELD_RW(GUEST_CR0)
6160
SHADOW_FIELD_RW(GUEST_CR3)
6261
SHADOW_FIELD_RW(GUEST_CR4)
6362
SHADOW_FIELD_RW(GUEST_RFLAGS)
64-
SHADOW_FIELD_RW(GUEST_CS_BASE)
65-
SHADOW_FIELD_RW(GUEST_ES_BASE)
6663
SHADOW_FIELD_RW(CR0_GUEST_HOST_MASK)
6764
SHADOW_FIELD_RW(CR0_READ_SHADOW)
6865
SHADOW_FIELD_RW(CR4_READ_SHADOW)

0 commit comments

Comments
 (0)