]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - arch/x86/mm/dump_pagetables.c
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/rzhang/linux
[linux.git] / arch / x86 / mm / dump_pagetables.c
index 1bf417e9cc1309e3353f08fee9dad6915fb34c0c..a035c2aa780190c8c198e1bd8c2bec20a18d8ecb 100644 (file)
@@ -358,6 +358,21 @@ static void walk_pud_level(struct seq_file *m, struct pg_state *st, pgd_t addr,
 #define pgd_none(a)  pud_none(__pud(pgd_val(a)))
 #endif
 
+#ifdef CONFIG_X86_64
+static inline bool is_hypervisor_range(int idx)
+{
+       /*
+        * ffff800000000000 - ffff87ffffffffff is reserved for
+        * the hypervisor.
+        */
+       return paravirt_enabled() &&
+               (idx >= pgd_index(__PAGE_OFFSET) - 16) &&
+               (idx < pgd_index(__PAGE_OFFSET));
+}
+#else
+static inline bool is_hypervisor_range(int idx) { return false; }
+#endif
+
 static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
                                       bool checkwx)
 {
@@ -381,7 +396,7 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
 
        for (i = 0; i < PTRS_PER_PGD; i++) {
                st.current_address = normalize_addr(i * PGD_LEVEL_MULT);
-               if (!pgd_none(*start)) {
+               if (!pgd_none(*start) && !is_hypervisor_range(i)) {
                        if (pgd_large(*start) || !pgd_present(*start)) {
                                prot = pgd_flags(*start);
                                note_page(m, &st, __pgprot(prot), 1);