KVM: SVM: Use common kvm_apic_write_nodecode() for AVIC write traps

commit ed60920efe upstream.

Use the common kvm_apic_write_nodecode() to handle AVIC/APIC-write traps
instead of open coding the same exact code.  This will allow making the
low level lapic helpers inaccessible outside of lapic.c code.

Opportunistically clean up the params to eliminate a bunch of svm=>vcpu
reflection.

No functional change intended.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Message-Id: <20220204214205.3306634-5-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Chen Zhuo <sagazchen@tencent.com>
Signed-off-by: Xinghui Li <korantli@tencent.com>
This commit is contained in:
Sean Christopherson 2022-02-04 21:41:58 +00:00 committed by Jianping Liu
parent 1169358b99
commit 0406967391
1 changed files with 7 additions and 9 deletions

View File

@ -4722,30 +4722,28 @@ static void avic_handle_dfr_update(struct kvm_vcpu *vcpu)
svm->dfr_reg = dfr; svm->dfr_reg = dfr;
} }
static int avic_unaccel_trap_write(struct vcpu_svm *svm) static int avic_unaccel_trap_write(struct kvm_vcpu *vcpu)
{ {
struct kvm_lapic *apic = svm->vcpu.arch.apic; u32 offset = to_svm(vcpu)->vmcb->control.exit_info_1 &
u32 offset = svm->vmcb->control.exit_info_1 &
AVIC_UNACCEL_ACCESS_OFFSET_MASK; AVIC_UNACCEL_ACCESS_OFFSET_MASK;
switch (offset) { switch (offset) {
case APIC_ID: case APIC_ID:
if (avic_handle_apic_id_update(&svm->vcpu)) if (avic_handle_apic_id_update(vcpu))
return 0; return 0;
break; break;
case APIC_LDR: case APIC_LDR:
if (avic_handle_ldr_update(&svm->vcpu)) if (avic_handle_ldr_update(vcpu))
return 0; return 0;
break; break;
case APIC_DFR: case APIC_DFR:
avic_handle_dfr_update(&svm->vcpu); avic_handle_dfr_update(vcpu);
break; break;
default: default:
break; break;
} }
kvm_lapic_reg_write(apic, offset, kvm_lapic_get_reg(apic, offset)); kvm_apic_write_nodecode(vcpu, offset);
return 1; return 1;
} }
@ -4794,7 +4792,7 @@ static int avic_unaccelerated_access_interception(struct vcpu_svm *svm)
if (trap) { if (trap) {
/* Handling Trap */ /* Handling Trap */
WARN_ONCE(!write, "svm: Handling trap read.\n"); WARN_ONCE(!write, "svm: Handling trap read.\n");
ret = avic_unaccel_trap_write(svm); ret = avic_unaccel_trap_write(&svm->vcpu);
} else { } else {
/* Handling Fault */ /* Handling Fault */
ret = kvm_emulate_instruction(&svm->vcpu, 0); ret = kvm_emulate_instruction(&svm->vcpu, 0);