x86/kprobes: enable EXECMEM_ROX_CACHE for kprobes allocations

JIRA: https://redhat.atlassian.net/browse/RHEL-145695

commit 36de1e4238c1243866eaec515ef59972c490367f
Author: Mike Rapoport (Microsoft) <rppt@kernel.org>
Date:   Sun Jul 13 10:17:29 2025 +0300

    x86/kprobes: enable EXECMEM_ROX_CACHE for kprobes allocations

    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>

Signed-off-by: Rafael Aquini <raquini@redhat.com>
This commit is contained in:
Rafael Aquini
2026-07-31 14:50:56 -04:00
parent 5e4aec77f8
commit 3712080d20
2 changed files with 8 additions and 19 deletions
-18
View File
@@ -490,24 +490,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)
+8 -1
View 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,