aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2017-12-04 09:08:05 -0500
committerIngo Molnar <mingo@kernel.org>2017-12-23 15:13:01 -0500
commitb4bf4f924b1d7bade38fd51b2e401d20d0956e4d (patch)
treeddcf03d63b84a401de66adfe65cd44d2e7aebe2b
parent75298aa179d56cd64f54e58a19fffc8ab922b4c0 (diff)
x86/mm/dump_pagetables: Check user space page table for WX pages
ptdump_walk_pgd_level_checkwx() checks the kernel page table for WX pages, but does not check the PAGE_TABLE_ISOLATION user space page table. Restructure the code so that dmesg output is selected by an explicit argument and not implicit via checking the pgd argument for !NULL. Add the check for the user space page table. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Cc: Andy Lutomirski <luto@kernel.org> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Borislav Petkov <bp@alien8.de> Cc: Brian Gerst <brgerst@gmail.com> Cc: Dave Hansen <dave.hansen@linux.intel.com> Cc: David Laight <David.Laight@aculab.com> Cc: Denys Vlasenko <dvlasenk@redhat.com> Cc: Eduardo Valentin <eduval@amazon.com> Cc: Greg KH <gregkh@linuxfoundation.org> Cc: H. Peter Anvin <hpa@zytor.com> Cc: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Juergen Gross <jgross@suse.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Will Deacon <will.deacon@arm.com> Cc: aliguori@amazon.com Cc: daniel.gruss@iaik.tugraz.at Cc: hughd@google.com Cc: keescook@google.com Cc: linux-mm@kvack.org Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r--arch/x86/include/asm/pgtable.h1
-rw-r--r--arch/x86/mm/debug_pagetables.c2
-rw-r--r--arch/x86/mm/dump_pagetables.c30
3 files changed, 27 insertions, 6 deletions
diff --git a/arch/x86/include/asm/pgtable.h b/arch/x86/include/asm/pgtable.h
index cc6fa75884e9..03780d5c41c5 100644
--- a/arch/x86/include/asm/pgtable.h
+++ b/arch/x86/include/asm/pgtable.h
@@ -28,6 +28,7 @@ extern pgd_t early_top_pgt[PTRS_PER_PGD];
28int __init __early_make_pgtable(unsigned long address, pmdval_t pmd); 28int __init __early_make_pgtable(unsigned long address, pmdval_t pmd);
29 29
30void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd); 30void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd);
31void ptdump_walk_pgd_level_debugfs(struct seq_file *m, pgd_t *pgd);
31void ptdump_walk_pgd_level_checkwx(void); 32void ptdump_walk_pgd_level_checkwx(void);
32 33
33#ifdef CONFIG_DEBUG_WX 34#ifdef CONFIG_DEBUG_WX
diff --git a/arch/x86/mm/debug_pagetables.c b/arch/x86/mm/debug_pagetables.c
index d1449fb6dc7a..8e70c1599e51 100644
--- a/arch/x86/mm/debug_pagetables.c
+++ b/arch/x86/mm/debug_pagetables.c
@@ -5,7 +5,7 @@
5 5
6static int ptdump_show(struct seq_file *m, void *v) 6static int ptdump_show(struct seq_file *m, void *v)
7{ 7{
8 ptdump_walk_pgd_level(m, NULL); 8 ptdump_walk_pgd_level_debugfs(m, NULL);
9 return 0; 9 return 0;
10} 10}
11 11
diff --git a/arch/x86/mm/dump_pagetables.c b/arch/x86/mm/dump_pagetables.c
index 690eaf31ca34..17f5b417f95e 100644
--- a/arch/x86/mm/dump_pagetables.c
+++ b/arch/x86/mm/dump_pagetables.c
@@ -476,7 +476,7 @@ static inline bool is_hypervisor_range(int idx)
476} 476}
477 477
478static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd, 478static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
479 bool checkwx) 479 bool checkwx, bool dmesg)
480{ 480{
481#ifdef CONFIG_X86_64 481#ifdef CONFIG_X86_64
482 pgd_t *start = (pgd_t *) &init_top_pgt; 482 pgd_t *start = (pgd_t *) &init_top_pgt;
@@ -489,7 +489,7 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
489 489
490 if (pgd) { 490 if (pgd) {
491 start = pgd; 491 start = pgd;
492 st.to_dmesg = true; 492 st.to_dmesg = dmesg;
493 } 493 }
494 494
495 st.check_wx = checkwx; 495 st.check_wx = checkwx;
@@ -527,13 +527,33 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
527 527
528void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd) 528void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd)
529{ 529{
530 ptdump_walk_pgd_level_core(m, pgd, false); 530 ptdump_walk_pgd_level_core(m, pgd, false, true);
531}
532
533void ptdump_walk_pgd_level_debugfs(struct seq_file *m, pgd_t *pgd)
534{
535 ptdump_walk_pgd_level_core(m, pgd, false, false);
536}
537EXPORT_SYMBOL_GPL(ptdump_walk_pgd_level_debugfs);
538
539static void ptdump_walk_user_pgd_level_checkwx(void)
540{
541#ifdef CONFIG_PAGE_TABLE_ISOLATION
542 pgd_t *pgd = (pgd_t *) &init_top_pgt;
543
544 if (!static_cpu_has(X86_FEATURE_PTI))
545 return;
546
547 pr_info("x86/mm: Checking user space page tables\n");
548 pgd = kernel_to_user_pgdp(pgd);
549 ptdump_walk_pgd_level_core(NULL, pgd, true, false);
550#endif
531} 551}
532EXPORT_SYMBOL_GPL(ptdump_walk_pgd_level);
533 552
534void ptdump_walk_pgd_level_checkwx(void) 553void ptdump_walk_pgd_level_checkwx(void)
535{ 554{
536 ptdump_walk_pgd_level_core(NULL, NULL, true); 555 ptdump_walk_pgd_level_core(NULL, NULL, true, false);
556 ptdump_walk_user_pgd_level_checkwx();
537} 557}
538 558
539static int __init pt_dump_init(void) 559static int __init pt_dump_init(void)