Skip to content
Snippets Groups Projects
Select Git revision
  • a4b51ef6552c704764684cef7e753162dc87c5fa
  • openEuler-1.0-LTS default protected
  • openEuler-22.09
  • OLK-5.10
  • openEuler-22.03-LTS
  • openEuler-22.03-LTS-Ascend
  • master
  • openEuler-22.03-LTS-LoongArch-NW
  • openEuler-22.09-HCK
  • openEuler-20.03-LTS-SP3
  • openEuler-21.09
  • openEuler-21.03
  • openEuler-20.09
  • 4.19.90-2210.5.0
  • 5.10.0-123.0.0
  • 5.10.0-60.63.0
  • 5.10.0-60.62.0
  • 4.19.90-2210.4.0
  • 5.10.0-121.0.0
  • 5.10.0-60.61.0
  • 4.19.90-2210.3.0
  • 5.10.0-60.60.0
  • 5.10.0-120.0.0
  • 5.10.0-60.59.0
  • 5.10.0-119.0.0
  • 4.19.90-2210.2.0
  • 4.19.90-2210.1.0
  • 5.10.0-118.0.0
  • 5.10.0-106.19.0
  • 5.10.0-60.58.0
  • 4.19.90-2209.6.0
  • 5.10.0-106.18.0
  • 5.10.0-106.17.0
33 results

debug_pagetables.c

Blame
  • debug_pagetables.c 2.56 KiB
    #include <linux/debugfs.h>
    #include <linux/module.h>
    #include <linux/seq_file.h>
    #include <asm/pgtable.h>
    
    static int ptdump_show(struct seq_file *m, void *v)
    {
    	ptdump_walk_pgd_level_debugfs(m, NULL, false);
    	return 0;
    }
    
    static int ptdump_open(struct inode *inode, struct file *filp)
    {
    	return single_open(filp, ptdump_show, NULL);
    }
    
    static const struct file_operations ptdump_fops = {
    	.owner		= THIS_MODULE,
    	.open		= ptdump_open,
    	.read		= seq_read,
    	.llseek		= seq_lseek,
    	.release	= single_release,
    };
    
    static int ptdump_show_curknl(struct seq_file *m, void *v)
    {
    	if (current->mm->pgd) {
    		down_read(&current->mm->mmap_sem);
    		ptdump_walk_pgd_level_debugfs(m, current->mm->pgd, false);
    		up_read(&current->mm->mmap_sem);
    	}
    	return 0;
    }
    
    static int ptdump_open_curknl(struct inode *inode, struct file *filp)
    {
    	return single_open(filp, ptdump_show_curknl, NULL);
    }
    
    static const struct file_operations ptdump_curknl_fops = {
    	.owner		= THIS_MODULE,
    	.open		= ptdump_open_curknl,
    	.read		= seq_read,
    	.llseek		= seq_lseek,
    	.release	= single_release,
    };
    
    #ifdef CONFIG_PAGE_TABLE_ISOLATION
    static struct dentry *pe_curusr;
    
    static int ptdump_show_curusr(struct seq_file *m, void *v)
    {
    	if (current->mm->pgd) {
    		down_read(&current->mm->mmap_sem);
    		ptdump_walk_pgd_level_debugfs(m, current->mm->pgd, true);
    		up_read(&current->mm->mmap_sem);
    	}
    	return 0;
    }
    
    static int ptdump_open_curusr(struct inode *inode, struct file *filp)
    {
    	return single_open(filp, ptdump_show_curusr, NULL);
    }
    
    static const struct file_operations ptdump_curusr_fops = {
    	.owner		= THIS_MODULE,
    	.open		= ptdump_open_curusr,
    	.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)
    {
    	dir = debugfs_create_dir("page_tables", NULL);
    	if (!dir)
    		return -ENOMEM;
    
    	pe_knl = debugfs_create_file("kernel", 0400, dir, NULL,
    				     &ptdump_fops);
    	if (!pe_knl)
    		goto err;
    
    	pe_curknl = debugfs_create_file("current_kernel", 0400,
    					dir, NULL, &ptdump_curknl_fops);
    	if (!pe_curknl)
    		goto err;
    
    #ifdef CONFIG_PAGE_TABLE_ISOLATION
    	pe_curusr = debugfs_create_file("current_user", 0400,
    					dir, NULL, &ptdump_curusr_fops);
    	if (!pe_curusr)
    		goto err;
    #endif
    	return 0;
    err:
    	debugfs_remove_recursive(dir);
    	return -ENOMEM;
    }
    
    static void __exit pt_dump_debug_exit(void)
    {
    	debugfs_remove_recursive(dir);
    }
    
    module_init(pt_dump_debug_init);
    module_exit(pt_dump_debug_exit);
    MODULE_LICENSE("GPL");
    MODULE_AUTHOR("Arjan van de Ven <arjan@linux.intel.com>");
    MODULE_DESCRIPTION("Kernel debugging helper that dumps pagetables");