Instead of leaving NX unset on all segments above the start
of vmalloc space, only leave NX unset on segments used for
modules.

Signed-off-by: Christophe Leroy <christophe.le...@csgroup.eu>
---
 arch/powerpc/mm/book3s32/mmu.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/arch/powerpc/mm/book3s32/mmu.c b/arch/powerpc/mm/book3s32/mmu.c
index 03b6ba54460e..c0162911f6cb 100644
--- a/arch/powerpc/mm/book3s32/mmu.c
+++ b/arch/powerpc/mm/book3s32/mmu.c
@@ -187,6 +187,17 @@ unsigned long __init mmu_mapin_ram(unsigned long base, 
unsigned long top)
        return __mmu_mapin_ram(border, top);
 }
 
+static bool is_module_segment(unsigned long addr)
+{
+       if (!IS_ENABLED(CONFIG_MODULES))
+               return false;
+       if (addr < ALIGN_DOWN(VMALLOC_START, SZ_256M))
+               return false;
+       if (addr >= ALIGN(VMALLOC_END, SZ_256M))
+               return false;
+       return true;
+}
+
 void mmu_mark_initmem_nx(void)
 {
        int nb = mmu_has_feature(MMU_FTR_USE_HIGH_BATS) ? 8 : 4;
@@ -223,9 +234,9 @@ void mmu_mark_initmem_nx(void)
 
        for (i = TASK_SIZE >> 28; i < 16; i++) {
                /* Do not set NX on VM space for modules */
-               if (IS_ENABLED(CONFIG_MODULES) &&
-                   (VMALLOC_START & 0xf0000000) == i << 28)
-                       break;
+               if (is_module_segment(i << 28))
+                       continue;
+
                mtsrin(mfsrin(i << 28) | 0x10000000, i << 28);
        }
 }
-- 
2.25.0

Reply via email to