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 <asm/pgtable.h>
   7
   8static int ptdump_show(struct seq_file *m, void *v)
   9{
  10        ptdump_walk_pgd_level_debugfs(m, NULL, 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                down_read(&current->mm->mmap_sem);
  20                ptdump_walk_pgd_level_debugfs(m, current->mm->pgd, false);
  21                up_read(&current->mm->mmap_sem);
  22        }
  23        return 0;
  24}
  25
  26DEFINE_SHOW_ATTRIBUTE(ptdump_curknl);
  27
  28#ifdef CONFIG_PAGE_TABLE_ISOLATION
  29static int ptdump_curusr_show(struct seq_file *m, void *v)
  30{
  31        if (current->mm->pgd) {
  32                down_read(&current->mm->mmap_sem);
  33                ptdump_walk_pgd_level_debugfs(m, current->mm->pgd, true);
  34                up_read(&current->mm->mmap_sem);
  35        }
  36        return 0;
  37}
  38
  39DEFINE_SHOW_ATTRIBUTE(ptdump_curusr);
  40#endif
  41
  42#if defined(CONFIG_EFI) && defined(CONFIG_X86_64)
  43static int ptdump_efi_show(struct seq_file *m, void *v)
  44{
  45        if (efi_mm.pgd)
  46                ptdump_walk_pgd_level_debugfs(m, efi_mm.pgd, false);
  47        return 0;
  48}
  49
  50DEFINE_SHOW_ATTRIBUTE(ptdump_efi);
  51#endif
  52
  53static struct dentry *dir;
  54
  55static int __init pt_dump_debug_init(void)
  56{
  57        dir = debugfs_create_dir("page_tables", NULL);
  58
  59        debugfs_create_file("kernel", 0400, dir, NULL, &ptdump_fops);
  60        debugfs_create_file("current_kernel", 0400, dir, NULL,
  61                            &ptdump_curknl_fops);
  62
  63#ifdef CONFIG_PAGE_TABLE_ISOLATION
  64        debugfs_create_file("current_user", 0400, dir, NULL,
  65                            &ptdump_curusr_fops);
  66#endif
  67#if defined(CONFIG_EFI) && defined(CONFIG_X86_64)
  68        debugfs_create_file("efi", 0400, dir, NULL, &ptdump_efi_fops);
  69#endif
  70        return 0;
  71}
  72
  73static void __exit pt_dump_debug_exit(void)
  74{
  75        debugfs_remove_recursive(dir);
  76}
  77
  78module_init(pt_dump_debug_init);
  79module_exit(pt_dump_debug_exit);
  80MODULE_LICENSE("GPL");
  81MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>");
  82MODULE_DESCRIPTION("Kernel debugging helper that dumps pagetables");
  83