diff --git a/arch/x86/kvm/svm/avic.c b/arch/x86/kvm/svm/avic.c index a199a4890a3e64f7c2fef903b3d88bb6546cb870..3fd6c10e0e54c930b9997e7e3d1b52a8fde434ac 100644 --- a/arch/x86/kvm/svm/avic.c +++ b/arch/x86/kvm/svm/avic.c @@ -204,10 +204,12 @@ void avic_init_vmcb(struct vcpu_svm *svm) vmcb->control.avic_logical_id = lpa & AVIC_HPA_MASK; vmcb->control.avic_physical_id = ppa & AVIC_HPA_MASK; vmcb->control.avic_physical_id |= AVIC_MAX_PHYSICAL_ID_COUNT; - if (kvm_apicv_activated(svm->vcpu.kvm)) + if (kvm_vcpu_apicv_active(&svm->vcpu)) { vmcb->control.int_ctl |= AVIC_ENABLE_MASK; - else + svm_clr_intercept(svm, INTERCEPT_CR8_WRITE); + } else { vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK; + } } static u64 *avic_get_physical_id_entry(struct kvm_vcpu *vcpu, @@ -677,8 +679,12 @@ void svm_refresh_apicv_exec_ctrl(struct kvm_vcpu *vcpu) */ avic_post_state_restore(vcpu); vmcb->control.int_ctl |= AVIC_ENABLE_MASK; + svm_clr_intercept(svm, INTERCEPT_CR8_WRITE); } else { vmcb->control.int_ctl &= ~AVIC_ENABLE_MASK; + + if (!sev_es_guest(vcpu->kvm)) + svm_set_intercept(svm, INTERCEPT_CR8_WRITE); } vmcb_mark_dirty(vmcb, VMCB_AVIC); diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c index 3d0f2d700efcedf6911258be8d797d09ff69f0e7..885250662ce7ef425e6a722a92398fbd0594df46 100644 --- a/arch/x86/kvm/svm/svm.c +++ b/arch/x86/kvm/svm/svm.c @@ -1176,8 +1176,7 @@ static void init_vmcb(struct vcpu_svm *svm) svm_set_intercept(svm, INTERCEPT_CR0_WRITE); svm_set_intercept(svm, INTERCEPT_CR3_WRITE); svm_set_intercept(svm, INTERCEPT_CR4_WRITE); - if (!kvm_vcpu_apicv_active(&svm->vcpu)) - svm_set_intercept(svm, INTERCEPT_CR8_WRITE); + svm_set_intercept(svm, INTERCEPT_CR8_WRITE); set_dr_intercepts(svm); @@ -1300,7 +1299,7 @@ static void init_vmcb(struct vcpu_svm *svm) svm_check_invpcid(svm); - if (kvm_vcpu_apicv_active(&svm->vcpu)) + if (avic && irqchip_in_kernel(svm->vcpu.kvm)) avic_init_vmcb(svm); /* @@ -2666,9 +2665,11 @@ static int dr_interception(struct vcpu_svm *svm) static int cr8_write_interception(struct vcpu_svm *svm) { struct kvm_run *kvm_run = svm->vcpu.run; + u8 cr8_prev = kvm_get_cr8(&svm->vcpu); int r; - u8 cr8_prev = kvm_get_cr8(&svm->vcpu); + WARN_ON_ONCE(kvm_vcpu_apicv_active(&svm->vcpu)); + /* instruction emulation calls kvm_set_cr8() */ r = cr_interception(svm); if (lapic_in_kernel(&svm->vcpu)) @@ -3782,8 +3783,7 @@ static inline void sync_lapic_to_cr8(struct kvm_vcpu *vcpu) struct vcpu_svm *svm = to_svm(vcpu); u64 cr8; - if (nested_svm_virtualize_tpr(vcpu) || - kvm_vcpu_apicv_active(vcpu)) + if (nested_svm_virtualize_tpr(vcpu)) return; cr8 = kvm_get_cr8(vcpu);