linux/arch/x86/mm/debug_pagetables.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2#include <linux/debugfs.h>
   3#include <linux/efi.h>
   4#include <linux/module.h>
   5#include <linux/seq_file.h>
   6#include <linux/pgtable.h>
   7
   8static int ptdump_show(struct seq_file *m, void *v)
   9{
  10        ptdump_walk_pgd_level_debugfs(m, &init_mm, false);
  11        return 0;
  12}
  13
  14DEFINE_SHOW_ATTRIBUTE(ptdump);
  15
  16static int ptdump_curknl_show(struct seq_file *m, void *v)
  17{
  18        if (current->mm->pgd)
  19                ptdump_walk_pgd_level_debugfs(m, current->mm, false);
  20        return 0;
  21}
  22
  23DEFINE_SHOW_ATTRIBUTE(ptdump_curknl);
  24
  25#ifdef CONFIG_PAGE_TABLE_ISOLATION
  26static int ptdump_curusr_show(struct seq_file *m, void *v)
  27{
  28        if (current->mm->pgd)
  29                ptdump_walk_pgd_level_debugfs(m, current->mm, true);
  30        return 0;
  31}
  32
  33DEFINE_SHOW_ATTRIBUTE(ptdump_curusr);
  34#endif
  35
  36#if defined(CONFIG_EFI) && defined(CONFIG_X86_64)
  37static int ptdump_efi_show(struct seq_file *m, void *v)
  38{
  39        if (efi_mm.pgd)
  40                ptdump_walk_pgd_level_debugfs(m, &efi_mm, false);
  41        return 0;
  42}
  43
  44DEFINE_SHOW_ATTRIBUTE(ptdump_efi);
  45#endif
  46
  47static struct dentry *dir;
  48
  49static int __init pt_dump_debug_init(void)
  50{
  51        dir = debugfs_create_dir("page_tables", NULL);
  52
  53        debugfs_create_file("kernel", 0400, dir, NULL, &ptdump_fops);
  54        debugfs_create_file("current_kernel", 0400, dir, NULL,
  55                            &ptdump_curknl_fops);
  56
  57#ifdef CONFIG_PAGE_TABLE_ISOLATION
  58        debugfs_create_file("current_user", 0400, dir, NULL,
  59                            &ptdump_curusr_fops);
  60#endif
  61#if defined(CONFIG_EFI) && defined(CONFIG_X86_64)
  62        debugfs_create_file("efi", 0400, dir, NULL, &ptdump_efi_fops);
  63#endif
  64        return 0;
  65}
  66
  67static void __exit pt_dump_debug_exit(void)
  68{
  69        debugfs_remove_recursive(dir);
  70}
  71
  72module_init(pt_dump_debug_init);
  73module_exit(pt_dump_debug_exit);
  74MODULE_LICENSE("GPL");
  75MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>");
  76MODULE_DESCRIPTION("Kernel debugging helper that dumps pagetables");
  77