diff options
author | Yang Zhang <yang.z.zhang@intel.com> | 2013-01-25 10:18:49 +0800 |
---|---|---|
committer | Gleb Natapov <gleb@redhat.com> | 2013-01-29 10:47:54 +0200 |
commit | 83d4c286931c9d28c5be21bac3c73a2332cab681 (patch) | |
tree | 524885d4cad7e7f1d98357711eff11b8224dc01e /arch/x86/kvm/lapic.c | |
parent | d47510e295c0f82699192a61d715351cf00f65de (diff) | |
download | lwn-83d4c286931c9d28c5be21bac3c73a2332cab681.tar.gz lwn-83d4c286931c9d28c5be21bac3c73a2332cab681.zip |
x86, apicv: add APICv register virtualization support
- APIC read doesn't cause VM-Exit
- APIC write becomes trap-like
Reviewed-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Kevin Tian <kevin.tian@intel.com>
Signed-off-by: Yang Zhang <yang.z.zhang@intel.com>
Signed-off-by: Gleb Natapov <gleb@redhat.com>
Diffstat (limited to 'arch/x86/kvm/lapic.c')
-rw-r--r-- | arch/x86/kvm/lapic.c | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c index 9392f527f107..0664c138e860 100644 --- a/arch/x86/kvm/lapic.c +++ b/arch/x86/kvm/lapic.c @@ -1212,6 +1212,21 @@ void kvm_lapic_set_eoi(struct kvm_vcpu *vcpu) } EXPORT_SYMBOL_GPL(kvm_lapic_set_eoi); +/* emulate APIC access in a trap manner */ +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; + + apic_reg_read(vcpu->arch.apic, offset, 4, &val); + + /* TODO: optimize to just emulate side effect w/o one more write */ + apic_reg_write(vcpu->arch.apic, offset, val); +} +EXPORT_SYMBOL_GPL(kvm_apic_write_nodecode); + void kvm_free_lapic(struct kvm_vcpu *vcpu) { struct kvm_lapic *apic = vcpu->arch.apic; |