|
@@ -1692,7 +1692,6 @@ static void apic_sync_pv_eoi_from_guest(struct kvm_vcpu *vcpu,
|
|
|
void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu)
|
|
|
{
|
|
|
u32 data;
|
|
|
- void *vapic;
|
|
|
|
|
|
if (test_bit(KVM_APIC_PV_EOI_PENDING, &vcpu->arch.apic_attention))
|
|
|
apic_sync_pv_eoi_from_guest(vcpu, vcpu->arch.apic);
|
|
@@ -1700,9 +1699,8 @@ void kvm_lapic_sync_from_vapic(struct kvm_vcpu *vcpu)
|
|
|
if (!test_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention))
|
|
|
return;
|
|
|
|
|
|
- vapic = kmap_atomic(vcpu->arch.apic->vapic_page);
|
|
|
- data = *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr));
|
|
|
- kunmap_atomic(vapic);
|
|
|
+ kvm_read_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data,
|
|
|
+ sizeof(u32));
|
|
|
|
|
|
apic_set_tpr(vcpu->arch.apic, data & 0xff);
|
|
|
}
|
|
@@ -1738,7 +1736,6 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu)
|
|
|
u32 data, tpr;
|
|
|
int max_irr, max_isr;
|
|
|
struct kvm_lapic *apic = vcpu->arch.apic;
|
|
|
- void *vapic;
|
|
|
|
|
|
apic_sync_pv_eoi_to_guest(vcpu, apic);
|
|
|
|
|
@@ -1754,18 +1751,24 @@ void kvm_lapic_sync_to_vapic(struct kvm_vcpu *vcpu)
|
|
|
max_isr = 0;
|
|
|
data = (tpr & 0xff) | ((max_isr & 0xf0) << 8) | (max_irr << 24);
|
|
|
|
|
|
- vapic = kmap_atomic(vcpu->arch.apic->vapic_page);
|
|
|
- *(u32 *)(vapic + offset_in_page(vcpu->arch.apic->vapic_addr)) = data;
|
|
|
- kunmap_atomic(vapic);
|
|
|
+ kvm_write_guest_cached(vcpu->kvm, &vcpu->arch.apic->vapic_cache, &data,
|
|
|
+ sizeof(u32));
|
|
|
}
|
|
|
|
|
|
-void kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
|
|
|
+int kvm_lapic_set_vapic_addr(struct kvm_vcpu *vcpu, gpa_t vapic_addr)
|
|
|
{
|
|
|
- vcpu->arch.apic->vapic_addr = vapic_addr;
|
|
|
- if (vapic_addr)
|
|
|
+ if (vapic_addr) {
|
|
|
+ if (kvm_gfn_to_hva_cache_init(vcpu->kvm,
|
|
|
+ &vcpu->arch.apic->vapic_cache,
|
|
|
+ vapic_addr, sizeof(u32)))
|
|
|
+ return -EINVAL;
|
|
|
__set_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention);
|
|
|
- else
|
|
|
+ } else {
|
|
|
__clear_bit(KVM_APIC_CHECK_VAPIC, &vcpu->arch.apic_attention);
|
|
|
+ }
|
|
|
+
|
|
|
+ vcpu->arch.apic->vapic_addr = vapic_addr;
|
|
|
+ return 0;
|
|
|
}
|
|
|
|
|
|
int kvm_x2apic_msr_write(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|