Merge tag 'arm64-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64...
[pandora-kernel.git] / arch / arm64 / include / asm / kvm_mmu.h
index 3625070..6150567 100644 (file)
@@ -68,6 +68,8 @@
 #include <asm/pgalloc.h>
 #include <asm/cachetype.h>
 #include <asm/cacheflush.h>
+#include <asm/mmu_context.h>
+#include <asm/pgtable.h>
 
 #define KERN_TO_HYP(kva)       ((unsigned long)kva - PAGE_OFFSET + HYP_PAGE_OFFSET)
 
@@ -269,5 +271,36 @@ static inline void __kvm_flush_dcache_pud(pud_t pud)
 void kvm_set_way_flush(struct kvm_vcpu *vcpu);
 void kvm_toggle_cache(struct kvm_vcpu *vcpu, bool was_enabled);
 
+static inline bool __kvm_cpu_uses_extended_idmap(void)
+{
+       return __cpu_uses_extended_idmap();
+}
+
+static inline void __kvm_extend_hypmap(pgd_t *boot_hyp_pgd,
+                                      pgd_t *hyp_pgd,
+                                      pgd_t *merged_hyp_pgd,
+                                      unsigned long hyp_idmap_start)
+{
+       int idmap_idx;
+
+       /*
+        * Use the first entry to access the HYP mappings. It is
+        * guaranteed to be free, otherwise we wouldn't use an
+        * extended idmap.
+        */
+       VM_BUG_ON(pgd_val(merged_hyp_pgd[0]));
+       merged_hyp_pgd[0] = __pgd(__pa(hyp_pgd) | PMD_TYPE_TABLE);
+
+       /*
+        * Create another extended level entry that points to the boot HYP map,
+        * which contains an ID mapping of the HYP init code. We essentially
+        * merge the boot and runtime HYP maps by doing so, but they don't
+        * overlap anyway, so this is fine.
+        */
+       idmap_idx = hyp_idmap_start >> VA_BITS;
+       VM_BUG_ON(pgd_val(merged_hyp_pgd[idmap_idx]));
+       merged_hyp_pgd[idmap_idx] = __pgd(__pa(boot_hyp_pgd) | PMD_TYPE_TABLE);
+}
+
 #endif /* __ASSEMBLY__ */
 #endif /* __ARM64_KVM_MMU_H__ */