Messages in this thread | | | Subject | Re: [PART1 RFC v2 09/10] svm: Do not intercept CR8 when enable AVIC | From | Paolo Bonzini <> | Date | Mon, 7 Mar 2016 16:39:35 +0100 |
| |
On 04/03/2016 21:46, Suravee Suthikulpanit wrote: > + > + /* Do not do cr8 intercept if AVIC is enabled. */
No need for this comment.
> + svm_x86_ops.update_cr8_intercept = NULL; > } else { > svm_x86_ops.deliver_posted_interrupt = NULL; > } > @@ -1116,7 +1119,8 @@ static void init_vmcb(struct vcpu_svm *svm) > set_cr_intercept(svm, INTERCEPT_CR0_WRITE); > set_cr_intercept(svm, INTERCEPT_CR3_WRITE); > set_cr_intercept(svm, INTERCEPT_CR4_WRITE); > - set_cr_intercept(svm, INTERCEPT_CR8_WRITE); > + if (!avic)
Remember that AVIC enabled/disabled must be refreshed when the .refresh_apicv_exec_ctrl callback is invoked, so it is not enough to use the global variable.
Paolo
> + set_cr_intercept(svm, INTERCEPT_CR8_WRITE); > > set_dr_intercepts(svm); > > @@ -4277,7 +4281,8 @@ static void update_cr8_intercept(struct kvm_vcpu *vcpu, int tpr, int irr) > { > struct vcpu_svm *svm = to_svm(vcpu); > > - if (is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) > + if ((is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) || > + avic) > return; > > clr_cr_intercept(svm, INTERCEPT_CR8_WRITE); > @@ -4472,8 +4477,10 @@ static inline void sync_lapic_to_cr8(struct kvm_vcpu *vcpu) > if (is_guest_mode(vcpu) && (vcpu->arch.hflags & HF_VINTR_MASK)) > return; > > - cr8 = kvm_get_cr8(vcpu); > - svm->vmcb->control.v_tpr = cr8 & V_TPR_MASK; > + svm->vmcb->control.v_tpr = cr8 = kvm_get_cr8(vcpu) & V_TPR_MASK; > + > + if (avic) > + *(avic_get_bk_page_entry(svm, APIC_TASKPRI)) = (u32)cr8 << 4;
| |