Merge tag 'modules-6.10-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/mcgrof...
[linux-block.git] / arch / powerpc / mm / mem.c
index 3a440004b97d2b2b94aaa1fc0b05a76397a79953..5de62a3c1d4b375fcd72e96edc8d4248ad381e0c 100644 (file)
@@ -16,6 +16,7 @@
 #include <linux/highmem.h>
 #include <linux/suspend.h>
 #include <linux/dma-direct.h>
+#include <linux/execmem.h>
 
 #include <asm/swiotlb.h>
 #include <asm/machdep.h>
@@ -406,3 +407,66 @@ int devmem_is_allowed(unsigned long pfn)
  * the EHEA driver. Drop this when drivers/net/ethernet/ibm/ehea is removed.
  */
 EXPORT_SYMBOL_GPL(walk_system_ram_range);
+
+#ifdef CONFIG_EXECMEM
+static struct execmem_info execmem_info __ro_after_init;
+
+struct execmem_info __init *execmem_arch_setup(void)
+{
+       pgprot_t kprobes_prot = strict_module_rwx_enabled() ? PAGE_KERNEL_ROX : PAGE_KERNEL_EXEC;
+       pgprot_t prot = strict_module_rwx_enabled() ? PAGE_KERNEL : PAGE_KERNEL_EXEC;
+       unsigned long fallback_start = 0, fallback_end = 0;
+       unsigned long start, end;
+
+       /*
+        * BOOK3S_32 and 8xx define MODULES_VADDR for text allocations and
+        * allow allocating data in the entire vmalloc space
+        */
+#ifdef MODULES_VADDR
+       unsigned long limit = (unsigned long)_etext - SZ_32M;
+
+       BUILD_BUG_ON(TASK_SIZE > MODULES_VADDR);
+
+       /* First try within 32M limit from _etext to avoid branch trampolines */
+       if (MODULES_VADDR < PAGE_OFFSET && MODULES_END > limit) {
+               start = limit;
+               fallback_start = MODULES_VADDR;
+               fallback_end = MODULES_END;
+       } else {
+               start = MODULES_VADDR;
+       }
+
+       end = MODULES_END;
+#else
+       start = VMALLOC_START;
+       end = VMALLOC_END;
+#endif
+
+       execmem_info = (struct execmem_info){
+               .ranges = {
+                       [EXECMEM_DEFAULT] = {
+                               .start  = start,
+                               .end    = end,
+                               .pgprot = prot,
+                               .alignment = 1,
+                               .fallback_start = fallback_start,
+                               .fallback_end   = fallback_end,
+                       },
+                       [EXECMEM_KPROBES] = {
+                               .start  = VMALLOC_START,
+                               .end    = VMALLOC_END,
+                               .pgprot = kprobes_prot,
+                               .alignment = 1,
+                       },
+                       [EXECMEM_MODULE_DATA] = {
+                               .start  = VMALLOC_START,
+                               .end    = VMALLOC_END,
+                               .pgprot = PAGE_KERNEL,
+                               .alignment = 1,
+                       },
+               },
+       };
+
+       return &execmem_info;
+}
+#endif /* CONFIG_EXECMEM */