Skip to content

Commit b4bf4f9

Browse files
KAGA-KOKOIngo Molnar
authored andcommitted
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>
1 parent 75298aa commit b4bf4f9

File tree

3 files changed

+27
-6
lines changed

3 files changed

+27
-6
lines changed

arch/x86/include/asm/pgtable.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ extern pgd_t early_top_pgt[PTRS_PER_PGD];
2828
int __init __early_make_pgtable(unsigned long address, pmdval_t pmd);
2929

3030
void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd);
31+
void ptdump_walk_pgd_level_debugfs(struct seq_file *m, pgd_t *pgd);
3132
void ptdump_walk_pgd_level_checkwx(void);
3233

3334
#ifdef CONFIG_DEBUG_WX

arch/x86/mm/debug_pagetables.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
static int ptdump_show(struct seq_file *m, void *v)
77
{
8-
ptdump_walk_pgd_level(m, NULL);
8+
ptdump_walk_pgd_level_debugfs(m, NULL);
99
return 0;
1010
}
1111

arch/x86/mm/dump_pagetables.c

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -476,7 +476,7 @@ static inline bool is_hypervisor_range(int idx)
476476
}
477477

478478
static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
479-
bool checkwx)
479+
bool checkwx, bool dmesg)
480480
{
481481
#ifdef CONFIG_X86_64
482482
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,
489489

490490
if (pgd) {
491491
start = pgd;
492-
st.to_dmesg = true;
492+
st.to_dmesg = dmesg;
493493
}
494494

495495
st.check_wx = checkwx;
@@ -527,13 +527,33 @@ static void ptdump_walk_pgd_level_core(struct seq_file *m, pgd_t *pgd,
527527

528528
void ptdump_walk_pgd_level(struct seq_file *m, pgd_t *pgd)
529529
{
530-
ptdump_walk_pgd_level_core(m, pgd, false);
530+
ptdump_walk_pgd_level_core(m, pgd, false, true);
531+
}
532+
533+
void ptdump_walk_pgd_level_debugfs(struct seq_file *m, pgd_t *pgd)
534+
{
535+
ptdump_walk_pgd_level_core(m, pgd, false, false);
536+
}
537+
EXPORT_SYMBOL_GPL(ptdump_walk_pgd_level_debugfs);
538+
539+
static 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
531551
}
532-
EXPORT_SYMBOL_GPL(ptdump_walk_pgd_level);
533552

534553
void ptdump_walk_pgd_level_checkwx(void)
535554
{
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();
537557
}
538558

539559
static int __init pt_dump_init(void)

0 commit comments

Comments
 (0)