KVM: VMX: Handle APIC-write offset wrangling in VMX code
Move the vAPIC offset adjustments done in the APIC-write trap path from common x86 to VMX in anticipation of using the nodecode path for SVM's AVIC. The adjustment reflects hardware behavior, i.e. it's technically a property of VMX, no common x86. SVM's AVIC behavior is identical, so it's a bit of a moot point, the goal is purely to make it easier to understand why the adjustment is ok. No functional change intended. Signed-off-by: Sean Christopherson <seanjc@google.com> Message-Id: <20220204214205.3306634-3-seanjc@google.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
d22a81b304
commit
b5ede3df79
@ -2180,9 +2180,6 @@ void kvm_apic_write_nodecode(struct kvm_vcpu *vcpu, u32 offset)
|
||||
{
|
||||
u32 val = 0;
|
||||
|
||||
/* hw has done the conditional check and inst decode */
|
||||
offset &= 0xff0;
|
||||
|
||||
kvm_lapic_reg_read(vcpu->arch.apic, offset, 4, &val);
|
||||
|
||||
/* TODO: optimize to just emulate side effect w/o one more write */
|
||||
|
@ -5314,9 +5314,16 @@ static int handle_apic_eoi_induced(struct kvm_vcpu *vcpu)
|
||||
static int handle_apic_write(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
unsigned long exit_qualification = vmx_get_exit_qual(vcpu);
|
||||
u32 offset = exit_qualification & 0xfff;
|
||||
|
||||
/* APIC-write VM exit is trap-like and thus no need to adjust IP */
|
||||
/*
|
||||
* APIC-write VM-Exit is trap-like, KVM doesn't need to advance RIP and
|
||||
* hardware has done any necessary aliasing, offset adjustments, etc...
|
||||
* for the access. I.e. the correct value has already been written to
|
||||
* the vAPIC page for the correct 16-byte chunk. KVM needs only to
|
||||
* retrieve the register value and emulate the access.
|
||||
*/
|
||||
u32 offset = exit_qualification & 0xff0;
|
||||
|
||||
kvm_apic_write_nodecode(vcpu, offset);
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user