FAILED: patch "[PATCH] x86/mm: Prevent kernel Oops in PTDUMP code with HIGHPTE=y" failed to apply to 4.16-stable tree
Subsystems (3)
[email protected]
maintainerThe patch below does not apply to the 4.16-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
Quoted 1 line
From
d6ef1f194b7569af8b8397876dc9ab07649d63cbMon Sep 17 00:00:00 2001
From: Joerg Roedel <[email protected]>
Date: Tue, 17 Apr 2018 15:27:16 +0200
Subject: [PATCH] x86/mm: Prevent kernel Oops in PTDUMP code with HIGHPTE=y
The walk_pte_level() function just uses __va to get the virtual address of the PTE page, but that breaks when the PTE page is not in the direct mapping with HIGHPTE=y.
The result is an unhandled kernel paging request at some random address when accessing the current_kernel or current_user file.
Use the correct API to access PTE pages.
arch/x86/mm/dump_pagetables.c +6 -5
@@ -18,6 +18,7 @@#include <linux/init.h> #include <linux/sched.h> #include <linux/seq_file.h> +#include <linux/highmem.h> #include <asm/pgtable.h>
@@ -334,16 +335,16 @@ static void walk_pte_level(struct seq_file *m, struct pg_state *st, pmd_t addr, pgprotval_t eff_in, unsigned long P) { int i; -pte_t *start; +pte_t *pte;pgprotval_t prot, eff; - start = (pte_t *)pmd_page_vaddr (addr);for (i =0 ; i <PTRS_PER_PTE ; i++) { - prot =pte_flags (*start); - eff =effective_prot (eff_in, prot); st->current_address =normalize_addr (P + i *PTE_LEVEL_MULT ); + pte =pte_offset_map (&addr, st->current_address); + prot =pte_flags (*pte); + eff =effective_prot (eff_in, prot);note_page (m, st,__pgprot (prot), eff,5 ); - start++; +pte_unmap (pte); } }#ifdef CONFIG_KASAN