powerpc: Use MODULES_VADDR if defined
authorChristophe Leroy <christophe.leroy@csgroup.eu>
Mon, 29 Jun 2020 11:15:21 +0000 (11:15 +0000)
committerMichael Ellerman <mpe@ellerman.id.au>
Sun, 26 Jul 2020 14:01:30 +0000 (00:01 +1000)
In order to allow allocation of modules outside of vmalloc space,
use MODULES_VADDR and MODULES_END when MODULES_VADDR is defined.

Redefine module_alloc() when MODULES_VADDR defined.
Unmap corresponding KASAN shadow memory.

Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/7ecf5fff1eef67d450e73fc412b6ec3818483d75.1593428200.git.christophe.leroy@csgroup.eu
arch/powerpc/kernel/module.c
arch/powerpc/mm/kasan/kasan_init_32.c

index df649acb563190c36816f26e60a5f3c93b0a89f3..a211b0253cdb49332b4913d1d79e6945d6a24754 100644 (file)
@@ -86,3 +86,14 @@ int module_finalize(const Elf_Ehdr *hdr,
 
        return 0;
 }
+
+#ifdef MODULES_VADDR
+void *module_alloc(unsigned long size)
+{
+       BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR);
+
+       return __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END, GFP_KERNEL,
+                                   PAGE_KERNEL_EXEC, VM_FLUSH_RESET_PERMS, NUMA_NO_NODE,
+                                   __builtin_return_address(0));
+}
+#endif
index 019b0c0bbbf31833d5f4792f8e011ae5e4169db6..fb294046e00e46c3aace4f2a0853cf71269dd5d9 100644 (file)
@@ -115,6 +115,12 @@ static void __init kasan_unmap_early_shadow_vmalloc(void)
        unsigned long k_end = (unsigned long)kasan_mem_to_shadow((void *)VMALLOC_END);
 
        kasan_update_early_region(k_start, k_end, __pte(0));
+
+#ifdef MODULES_VADDR
+       k_start = (unsigned long)kasan_mem_to_shadow((void *)MODULES_VADDR);
+       k_end = (unsigned long)kasan_mem_to_shadow((void *)MODULES_END);
+       kasan_update_early_region(k_start, k_end, __pte(0));
+#endif
 }
 
 void __init kasan_mmu_init(void)