KVM: MMU: add kvm_mmu_get_spte_hierarchy helper
authorMarcelo Tosatti <mtosatti@redhat.com>
Thu, 11 Jun 2009 15:07:42 +0000 (12:07 -0300)
committerAvi Kivity <avi@redhat.com>
Thu, 10 Sep 2009 05:32:56 +0000 (08:32 +0300)
Required by EPT misconfiguration handler.

Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
Signed-off-by: Avi Kivity <avi@redhat.com>
arch/x86/kvm/mmu.c
arch/x86/kvm/mmu.h

index e18f65b..12974de 100644 (file)
@@ -3038,6 +3038,24 @@ out:
        return r;
 }
 
+int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4])
+{
+       struct kvm_shadow_walk_iterator iterator;
+       int nr_sptes = 0;
+
+       spin_lock(&vcpu->kvm->mmu_lock);
+       for_each_shadow_entry(vcpu, addr, iterator) {
+               sptes[iterator.level-1] = *iterator.sptep;
+               nr_sptes++;
+               if (!is_shadow_present_pte(*iterator.sptep))
+                       break;
+       }
+       spin_unlock(&vcpu->kvm->mmu_lock);
+
+       return nr_sptes;
+}
+EXPORT_SYMBOL_GPL(kvm_mmu_get_spte_hierarchy);
+
 #ifdef AUDIT
 
 static const char *audit_msg;
index 016bf71..61a1b38 100644 (file)
@@ -37,6 +37,8 @@
 #define PT32_ROOT_LEVEL 2
 #define PT32E_ROOT_LEVEL 3
 
+int kvm_mmu_get_spte_hierarchy(struct kvm_vcpu *vcpu, u64 addr, u64 sptes[4]);
+
 static inline void kvm_mmu_free_some_pages(struct kvm_vcpu *vcpu)
 {
        if (unlikely(vcpu->kvm->arch.n_free_mmu_pages < KVM_MIN_FREE_MMU_PAGES))