]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
x86/kprobes: enable EXECMEM_ROX_CACHE for kprobes allocations
authorMike Rapoport (Microsoft) <rppt@kernel.org>
Sun, 13 Jul 2025 07:17:29 +0000 (10:17 +0300)
committerAndrew Morton <akpm@linux-foundation.org>
Sat, 2 Aug 2025 19:06:12 +0000 (12:06 -0700)
x86::alloc_insn_page() always allocates ROX memory.

Instead of overriding this method, add EXECMEM_KPROBES entry in
execmem_info with pgprot set to PAGE_KERNEL_ROX and use ROX cache when
configuration and CPU features allow it.

Link: https://lkml.kernel.org/r/20250713071730.4117334-8-rppt@kernel.org
Signed-off-by: Mike Rapoport (Microsoft) <rppt@kernel.org>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Acked-by: Masami Hiramatsu (Google) <mhiramat@kernel.org>
Cc: Daniel Gomez <da.gomez@samsung.com>
Cc: Petr Pavlu <petr.pavlu@suse.com>
Cc: Steven Rostedt (Google) <rostedt@goodmis.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
arch/x86/kernel/kprobes/core.c
arch/x86/mm/init.c

index 47cb8eb138ba6ed1f1870d512ae153c0b60229c1..6079d15dab8ca74eccf8f37aaf6febede5f06cee 100644 (file)
@@ -481,24 +481,6 @@ static int prepare_singlestep(kprobe_opcode_t *buf, struct kprobe *p,
        return len;
 }
 
-/* Make page to RO mode when allocate it */
-void *alloc_insn_page(void)
-{
-       void *page;
-
-       page = execmem_alloc(EXECMEM_KPROBES, PAGE_SIZE);
-       if (!page)
-               return NULL;
-
-       /*
-        * TODO: Once additional kernel code protection mechanisms are set, ensure
-        * that the page was not maliciously altered and it is still zeroed.
-        */
-       set_memory_rox((unsigned long)page, 1);
-
-       return page;
-}
-
 /* Kprobe x86 instruction emulation - only regs->ip or IF flag modifiers */
 
 static void kprobe_emulate_ifmodifiers(struct kprobe *p, struct pt_regs *regs)
index dbc63f0d538f046628d8a320bad27961d20599ff..442fafd8ff52e160a8713e339ca597f3a28e3eff 100644 (file)
@@ -1098,7 +1098,14 @@ struct execmem_info __init *execmem_arch_setup(void)
                                .pgprot = pgprot,
                                .alignment = MODULE_ALIGN,
                        },
-                       [EXECMEM_KPROBES ... EXECMEM_BPF] = {
+                       [EXECMEM_KPROBES] = {
+                               .flags  = flags,
+                               .start  = start,
+                               .end    = MODULES_END,
+                               .pgprot = PAGE_KERNEL_ROX,
+                               .alignment = MODULE_ALIGN,
+                       },
+                       [EXECMEM_FTRACE ... EXECMEM_BPF] = {
                                .flags  = EXECMEM_KASAN_SHADOW,
                                .start  = start,
                                .end    = MODULES_END,