x86/mm/dump_pagetables: Add the EFI pagetable to the debugfs 'page_tables' directory
authorAndy Lutomirski <luto@kernel.org>
Wed, 31 Jan 2018 15:56:22 +0000 (07:56 -0800)
committerIngo Molnar <mingo@kernel.org>
Tue, 13 Feb 2018 15:00:45 +0000 (16:00 +0100)
EFI is complicated enough that being able to view its pagetables is
quite helpful.  Rather than requiring users to fish it out of dmesg
on an appropriately configured kernel, let users view it in debugfs
as well.

Signed-off-by: Andy Lutomirski <luto@kernel.org>
Acked-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: linux-efi@vger.kernel.org
Cc: linux-mm@kvack.org
Link: http://lkml.kernel.org/r/ba158a93f3250e6fca752cff2cfb1fcdd9f2b50c.1517414050.git.luto@kernel.org
[ Fixed trivial whitespace damage and fixed missing export. ]
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/mm/debug_pagetables.c
arch/x86/platform/efi/efi_64.c

index 421f2664ffa06e6cd4b31e5d6521648add3e2c4e..51a6f92da2bf1670d1855f64bd5fb74789c98e19 100644 (file)
@@ -72,6 +72,31 @@ static const struct file_operations ptdump_curusr_fops = {
 };
 #endif
 
+#if defined(CONFIG_EFI) && defined(CONFIG_X86_64)
+extern pgd_t *efi_pgd;
+static struct dentry *pe_efi;
+
+static int ptdump_show_efi(struct seq_file *m, void *v)
+{
+       if (efi_pgd)
+               ptdump_walk_pgd_level_debugfs(m, efi_pgd, false);
+       return 0;
+}
+
+static int ptdump_open_efi(struct inode *inode, struct file *filp)
+{
+       return single_open(filp, ptdump_show_efi, NULL);
+}
+
+static const struct file_operations ptdump_efi_fops = {
+       .owner          = THIS_MODULE,
+       .open           = ptdump_open_efi,
+       .read           = seq_read,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+#endif
+
 static struct dentry *dir, *pe_knl, *pe_curknl;
 
 static int __init pt_dump_debug_init(void)
@@ -96,6 +121,13 @@ static int __init pt_dump_debug_init(void)
        if (!pe_curusr)
                goto err;
 #endif
+
+#if defined(CONFIG_EFI) && defined(CONFIG_X86_64)
+       pe_efi = debugfs_create_file("efi", 0400, dir, NULL, &ptdump_efi_fops);
+       if (!pe_efi)
+               goto err;
+#endif
+
        return 0;
 err:
        debugfs_remove_recursive(dir);
index c310a82843589c6df238e72061b037de42b22867..780460aa5ea5e5a18283c559d14457977c51c13d 100644 (file)
@@ -27,6 +27,7 @@
 #include <linux/ioport.h>
 #include <linux/mc146818rtc.h>
 #include <linux/efi.h>
+#include <linux/export.h>
 #include <linux/uaccess.h>
 #include <linux/io.h>
 #include <linux/reboot.h>
@@ -190,7 +191,8 @@ void __init efi_call_phys_epilog(pgd_t *save_pgd)
        early_code_mapping_set_exec(0);
 }
 
-static pgd_t *efi_pgd;
+pgd_t *efi_pgd;
+EXPORT_SYMBOL_GPL(efi_pgd);
 
 /*
  * We need our own copy of the higher levels of the page tables