aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBandan Das <bsd@redhat.com>2017-05-05 15:25:15 -0400
committerPaolo Bonzini <pbonzini@redhat.com>2017-05-09 05:54:29 -0400
commit03efce6f935f89f90a98997ceea514aeff47b6dc (patch)
tree81ea5c8b20ef9c876ceca664b763730f9c7f0b4a
parentc5f983f6e8455bbff8b6b39f3ad470317fcd808e (diff)
nVMX: Advertise PML to L1 hypervisor
Advertise the PML bit in vmcs12 but don't try to enable it in hardware when running L2 since L0 is emulating it. Also, preserve L0's settings for PML since it may still want to log writes. Signed-off-by: Bandan Das <bsd@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
-rw-r--r--arch/x86/kvm/vmx.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/arch/x86/kvm/vmx.c b/arch/x86/kvm/vmx.c
index 7d056f5385e7..c6f4ad44aa95 100644
--- a/arch/x86/kvm/vmx.c
+++ b/arch/x86/kvm/vmx.c
@@ -2766,8 +2766,11 @@ static void nested_vmx_setup_ctls_msrs(struct vcpu_vmx *vmx)
2766 vmx->nested.nested_vmx_ept_caps |= VMX_EPT_EXTENT_GLOBAL_BIT | 2766 vmx->nested.nested_vmx_ept_caps |= VMX_EPT_EXTENT_GLOBAL_BIT |
2767 VMX_EPT_EXTENT_CONTEXT_BIT | VMX_EPT_2MB_PAGE_BIT | 2767 VMX_EPT_EXTENT_CONTEXT_BIT | VMX_EPT_2MB_PAGE_BIT |
2768 VMX_EPT_1GB_PAGE_BIT; 2768 VMX_EPT_1GB_PAGE_BIT;
2769 if (enable_ept_ad_bits) 2769 if (enable_ept_ad_bits) {
2770 vmx->nested.nested_vmx_secondary_ctls_high |=
2771 SECONDARY_EXEC_ENABLE_PML;
2770 vmx->nested.nested_vmx_ept_caps |= VMX_EPT_AD_BIT; 2772 vmx->nested.nested_vmx_ept_caps |= VMX_EPT_AD_BIT;
2773 }
2771 } else 2774 } else
2772 vmx->nested.nested_vmx_ept_caps = 0; 2775 vmx->nested.nested_vmx_ept_caps = 0;
2773 2776
@@ -8129,7 +8132,7 @@ static bool nested_vmx_exit_handled(struct kvm_vcpu *vcpu)
8129 case EXIT_REASON_PREEMPTION_TIMER: 8132 case EXIT_REASON_PREEMPTION_TIMER:
8130 return false; 8133 return false;
8131 case EXIT_REASON_PML_FULL: 8134 case EXIT_REASON_PML_FULL:
8132 /* We don't expose PML support to L1. */ 8135 /* We emulate PML support to L1. */
8133 return false; 8136 return false;
8134 default: 8137 default:
8135 return true; 8138 return true;
@@ -9924,7 +9927,7 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
9924 bool from_vmentry, u32 *entry_failure_code) 9927 bool from_vmentry, u32 *entry_failure_code)
9925{ 9928{
9926 struct vcpu_vmx *vmx = to_vmx(vcpu); 9929 struct vcpu_vmx *vmx = to_vmx(vcpu);
9927 u32 exec_control; 9930 u32 exec_control, vmcs12_exec_ctrl;
9928 9931
9929 vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector); 9932 vmcs_write16(GUEST_ES_SELECTOR, vmcs12->guest_es_selector);
9930 vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector); 9933 vmcs_write16(GUEST_CS_SELECTOR, vmcs12->guest_cs_selector);
@@ -10055,8 +10058,11 @@ static int prepare_vmcs02(struct kvm_vcpu *vcpu, struct vmcs12 *vmcs12,
10055 SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY | 10058 SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY |
10056 SECONDARY_EXEC_APIC_REGISTER_VIRT); 10059 SECONDARY_EXEC_APIC_REGISTER_VIRT);
10057 if (nested_cpu_has(vmcs12, 10060 if (nested_cpu_has(vmcs12,
10058 CPU_BASED_ACTIVATE_SECONDARY_CONTROLS)) 10061 CPU_BASED_ACTIVATE_SECONDARY_CONTROLS)) {
10059 exec_control |= vmcs12->secondary_vm_exec_control; 10062 vmcs12_exec_ctrl = vmcs12->secondary_vm_exec_control &
10063 ~SECONDARY_EXEC_ENABLE_PML;
10064 exec_control |= vmcs12_exec_ctrl;
10065 }
10060 10066
10061 if (exec_control & SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY) { 10067 if (exec_control & SECONDARY_EXEC_VIRTUAL_INTR_DELIVERY) {
10062 vmcs_write64(EOI_EXIT_BITMAP0, 10068 vmcs_write64(EOI_EXIT_BITMAP0,