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