]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
parisc: Delay write-protection until mark_rodata_ro() call
authorHelge Deller <deller@gmx.de>
Sat, 31 Aug 2024 12:02:06 +0000 (14:02 +0200)
committerHelge Deller <deller@gmx.de>
Tue, 3 Sep 2024 10:59:21 +0000 (12:59 +0200)
Do not write-protect the kernel read-only and __ro_after_init sections
earlier than before mark_rodata_ro() is called.  This fixes a boot issue on
parisc which is triggered by commit 91a1d97ef482 ("jump_label,module: Don't
alloc static_key_mod for __ro_after_init keys"). That commit may modify
static key contents in the __ro_after_init section at bootup, so this
section needs to be writable at least until mark_rodata_ro() is called.

Signed-off-by: Helge Deller <deller@gmx.de>
Reported-by: matoro <matoro_mailinglist_kernel@matoro.tk>
Reported-by: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>
Tested-by: Christoph Biedl <linux-kernel.bfrz@manchmal.in-ulm.de>
Link: https://lore.kernel.org/linux-parisc/096cad5aada514255cd7b0b9dbafc768@matoro.tk/#r
Fixes: 91a1d97ef482 ("jump_label,module: Don't alloc static_key_mod for __ro_after_init keys")
Cc: stable@vger.kernel.org # v6.10+
arch/parisc/mm/init.c

index 34d91cb8b25905ae72515aee4caf42fc13973b29..96970fa75e4ac9db2e814b9f7432a42e0c7608f7 100644 (file)
@@ -459,7 +459,6 @@ void free_initmem(void)
        unsigned long kernel_end  = (unsigned long)&_end;
 
        /* Remap kernel text and data, but do not touch init section yet. */
-       kernel_set_to_readonly = true;
        map_pages(init_end, __pa(init_end), kernel_end - init_end,
                  PAGE_KERNEL, 0);
 
@@ -493,11 +492,18 @@ void free_initmem(void)
 #ifdef CONFIG_STRICT_KERNEL_RWX
 void mark_rodata_ro(void)
 {
-       /* rodata memory was already mapped with KERNEL_RO access rights by
-           pagetable_init() and map_pages(). No need to do additional stuff here */
-       unsigned long roai_size = __end_ro_after_init - __start_ro_after_init;
+       unsigned long start = (unsigned long) &__start_rodata;
+       unsigned long end = (unsigned long) &__end_rodata;
+
+       pr_info("Write protecting the kernel read-only data: %luk\n",
+              (end - start) >> 10);
+
+       kernel_set_to_readonly = true;
+       map_pages(start, __pa(start), end - start, PAGE_KERNEL, 0);
 
-       pr_info("Write protected read-only-after-init data: %luk\n", roai_size >> 10);
+       /* force the kernel to see the new page table entries */
+       flush_cache_all();
+       flush_tlb_all();
 }
 #endif