Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 116fef64 authored by Andy Lutomirski's avatar Andy Lutomirski Committed by Ingo Molnar
Browse files

x86/mm/dump_pagetables: Add the EFI pagetable to the debugfs 'page_tables' directory



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: default avatarAndy Lutomirski <luto@kernel.org>
Acked-by: default avatarArd 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: default avatarIngo Molnar <mingo@kernel.org>
parent 1070730c
Loading
Loading
Loading
Loading
+32 −0
Original line number Original line Diff line number Diff line
@@ -72,6 +72,31 @@ static const struct file_operations ptdump_curusr_fops = {
};
};
#endif
#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 struct dentry *dir, *pe_knl, *pe_curknl;


static int __init pt_dump_debug_init(void)
static int __init pt_dump_debug_init(void)
@@ -96,6 +121,13 @@ static int __init pt_dump_debug_init(void)
	if (!pe_curusr)
	if (!pe_curusr)
		goto err;
		goto err;
#endif
#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;
	return 0;
err:
err:
	debugfs_remove_recursive(dir);
	debugfs_remove_recursive(dir);
+3 −1
Original line number Original line Diff line number Diff line
@@ -27,6 +27,7 @@
#include <linux/ioport.h>
#include <linux/ioport.h>
#include <linux/mc146818rtc.h>
#include <linux/mc146818rtc.h>
#include <linux/efi.h>
#include <linux/efi.h>
#include <linux/export.h>
#include <linux/uaccess.h>
#include <linux/uaccess.h>
#include <linux/io.h>
#include <linux/io.h>
#include <linux/reboot.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);
	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
 * We need our own copy of the higher levels of the page tables