powerpc/32s: Always map kernel text and rodata with BATs
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Wed, 25 Nov 2020 07:10:46 +0000 (07:10 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Thu, 3 Dec 2020 14:01:31 +0000 (01:01 +1100)
Since commit 2b279c0348af ("powerpc/32s: Allow mapping with BATs with
DEBUG_PAGEALLOC"), there is no real situation where mapping without
BATs is required.

In order to simplify memory handling, always map kernel text
and rodata with BATs even when "nobats" kernel parameter is set.

Also fix the 603 TLB miss exceptions that don't require anymore
kernel page table if DEBUG_PAGEALLOC.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/da51f7ec632825a4ce43290a904aad61648408c0.1606285013.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/head_book3s_32.S
arch/powerpc/mm/book3s32/mmu.c

index bbcc84c5cf5fb8f16ace09a2128e5abecc46e855..757aed0c5764c00f00f54e71538c33a39910737c 100644 (file)
@@ -457,13 +457,13 @@ InstructionTLBMiss:
  */
        /* Get PTE (linux-style) and check access */
        mfspr   r3,SPRN_IMISS
-#if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC)
+#ifdef CONFIG_MODULES
        lis     r1, TASK_SIZE@h         /* check if kernel address */
        cmplw   0,r1,r3
 #endif
        mfspr   r2, SPRN_SPRG_PGDIR
        li      r1,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_EXEC
-#if defined(CONFIG_MODULES) || defined(CONFIG_DEBUG_PAGEALLOC)
+#ifdef CONFIG_MODULES
        bgt-    112f
        lis     r2, (swapper_pg_dir - PAGE_OFFSET)@ha   /* if kernel address, use */
        addi    r2, r2, (swapper_pg_dir - PAGE_OFFSET)@l        /* kernel page table */
index a59e7ec9818039de71e921ea9dcee6063415ad1a..5c60dcade90aab7365dc691dd98e58401b30e36b 100644 (file)
@@ -157,11 +157,9 @@ unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top)
        unsigned long done;
        unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET;
 
-       if (__map_without_bats) {
-               pr_debug("RAM mapped without BATs\n");
-               return base;
-       }
-       if (debug_pagealloc_enabled()) {
+
+       if (debug_pagealloc_enabled() || __map_without_bats) {
+               pr_debug_once("Read-Write memory mapped without BATs\n");
                if (base >= border)
                        return base;
                if (top >= border)