From: "Mike Rapoport (IBM)" <[email protected]>
powerpc overrides kprobes::alloc_insn_page() to remove writable
permissions when STRICT_MODULE_RWX is on.
Add definition of jit area to execmem_params to allow using the generic
kprobes::alloc_insn_page() with the desired permissions.
As powerpc uses breakpoint instructions to inject kprobes, it does not
need to constrain kprobe allocations to the modules area and can use the
entire vmalloc address space.
Signed-off-by: Mike Rapoport (IBM) <[email protected]>
---
arch/powerpc/kernel/kprobes.c | 14 --------------
arch/powerpc/kernel/module.c | 13 +++++++++++++
2 files changed, 13 insertions(+), 14 deletions(-)
diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
index 5db8df5e3657..14c5ddec3056 100644
--- a/arch/powerpc/kernel/kprobes.c
+++ b/arch/powerpc/kernel/kprobes.c
@@ -126,20 +126,6 @@ kprobe_opcode_t *arch_adjust_kprobe_addr(unsigned long addr, unsigned long offse
return (kprobe_opcode_t *)(addr + offset);
}
-void *alloc_insn_page(void)
-{
- void *page;
-
- page = jit_text_alloc(PAGE_SIZE);
- if (!page)
- return NULL;
-
- if (strict_module_rwx_enabled())
- set_memory_rox((unsigned long)page, 1);
-
- return page;
-}
-
int arch_prepare_kprobe(struct kprobe *p)
{
int ret = 0;
diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c
index 4c6c15bf3947..8e5b379d6da1 100644
--- a/arch/powerpc/kernel/module.c
+++ b/arch/powerpc/kernel/module.c
@@ -96,6 +96,11 @@ static struct execmem_params execmem_params = {
.alignment = 1,
},
},
+ .jit = {
+ .text = {
+ .alignment = 1,
+ },
+ },
};
@@ -131,5 +136,13 @@ struct execmem_params __init *execmem_arch_params(void)
execmem_params.modules.text.pgprot = prot;
+ execmem_params.jit.text.start = VMALLOC_START;
+ execmem_params.jit.text.end = VMALLOC_END;
+
+ if (strict_module_rwx_enabled())
+ execmem_params.jit.text.pgprot = PAGE_KERNEL_ROX;
+ else
+ execmem_params.jit.text.pgprot = PAGE_KERNEL_EXEC;
+
return &execmem_params;
}
--
2.35.1
On Fri, Jun 16, 2023 at 1:52 AM Mike Rapoport <[email protected]> wrote:
>
> From: "Mike Rapoport (IBM)" <[email protected]>
>
> powerpc overrides kprobes::alloc_insn_page() to remove writable
> permissions when STRICT_MODULE_RWX is on.
>
> Add definition of jit area to execmem_params to allow using the generic
> kprobes::alloc_insn_page() with the desired permissions.
>
> As powerpc uses breakpoint instructions to inject kprobes, it does not
> need to constrain kprobe allocations to the modules area and can use the
> entire vmalloc address space.
>
> Signed-off-by: Mike Rapoport (IBM) <[email protected]>
Acked-by: Song Liu <[email protected]>
> ---
> arch/powerpc/kernel/kprobes.c | 14 --------------
> arch/powerpc/kernel/module.c | 13 +++++++++++++
> 2 files changed, 13 insertions(+), 14 deletions(-)
>
> diff --git a/arch/powerpc/kernel/kprobes.c b/arch/powerpc/kernel/kprobes.c
> index 5db8df5e3657..14c5ddec3056 100644
> --- a/arch/powerpc/kernel/kprobes.c
> +++ b/arch/powerpc/kernel/kprobes.c
> @@ -126,20 +126,6 @@ kprobe_opcode_t *arch_adjust_kprobe_addr(unsigned long addr, unsigned long offse
> return (kprobe_opcode_t *)(addr + offset);
> }
>
> -void *alloc_insn_page(void)
> -{
> - void *page;
> -
> - page = jit_text_alloc(PAGE_SIZE);
> - if (!page)
> - return NULL;
> -
> - if (strict_module_rwx_enabled())
> - set_memory_rox((unsigned long)page, 1);
> -
> - return page;
> -}
> -
> int arch_prepare_kprobe(struct kprobe *p)
> {
> int ret = 0;
> diff --git a/arch/powerpc/kernel/module.c b/arch/powerpc/kernel/module.c
> index 4c6c15bf3947..8e5b379d6da1 100644
> --- a/arch/powerpc/kernel/module.c
> +++ b/arch/powerpc/kernel/module.c
> @@ -96,6 +96,11 @@ static struct execmem_params execmem_params = {
> .alignment = 1,
> },
> },
> + .jit = {
> + .text = {
> + .alignment = 1,
> + },
> + },
> };
>
>
> @@ -131,5 +136,13 @@ struct execmem_params __init *execmem_arch_params(void)
>
> execmem_params.modules.text.pgprot = prot;
>
> + execmem_params.jit.text.start = VMALLOC_START;
> + execmem_params.jit.text.end = VMALLOC_END;
> +
> + if (strict_module_rwx_enabled())
> + execmem_params.jit.text.pgprot = PAGE_KERNEL_ROX;
> + else
> + execmem_params.jit.text.pgprot = PAGE_KERNEL_EXEC;
> +
> return &execmem_params;
> }
> --
> 2.35.1
>