kprobes: treewide: Remove trampoline_address from kretprobe_trampoline_handler()
authorMasami Hiramatsu <mhiramat@kernel.org>
Tue, 14 Sep 2021 14:40:45 +0000 (23:40 +0900)
committerSteven Rostedt (VMware) <rostedt@goodmis.org>
Fri, 1 Oct 2021 01:24:06 +0000 (21:24 -0400)
The __kretprobe_trampoline_handler() callback, called from low level
arch kprobes methods, has the 'trampoline_address' parameter, which is
entirely superfluous as it basically just replicates:

  dereference_kernel_function_descriptor(kretprobe_trampoline)

In fact we had bugs in arch code where it wasn't replicated correctly.

So remove this superfluous parameter and use kretprobe_trampoline_addr()
instead.

Link: https://lkml.kernel.org/r/163163044546.489837.13505751885476015002.stgit@devnote2
Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org>
Tested-by: Andrii Nakryiko <andrii@kernel.org>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
16 files changed:
arch/arc/kernel/kprobes.c
arch/arm/probes/kprobes/core.c
arch/arm64/kernel/probes/kprobes.c
arch/csky/kernel/probes/kprobes.c
arch/ia64/kernel/kprobes.c
arch/mips/kernel/kprobes.c
arch/parisc/kernel/kprobes.c
arch/powerpc/kernel/kprobes.c
arch/riscv/kernel/probes/kprobes.c
arch/s390/kernel/kprobes.c
arch/sh/kernel/kprobes.c
arch/sparc/kernel/kprobes.c
arch/x86/include/asm/kprobes.h
arch/x86/kernel/kprobes/core.c
include/linux/kprobes.h
kernel/kprobes.c

index 5f0415fc73287b9ac849123c029a50281fe7bc60..3cee75c87f973afa3b4e393fc1837d7ea4a3417d 100644 (file)
@@ -381,7 +381,7 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
 static int __kprobes trampoline_probe_handler(struct kprobe *p,
                                              struct pt_regs *regs)
 {
-       regs->ret = __kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       regs->ret = __kretprobe_trampoline_handler(regs, NULL);
 
        /* By returning a non zero value, we are telling the kprobe handler
         * that we don't want the post_handler to run
index a59e38de4a037a41ff074a06ab84cbb3d279ca1e..08098ed6f035d69b8519a50d39fd29a266720d3d 100644 (file)
@@ -392,8 +392,7 @@ void __naked __kprobes kretprobe_trampoline(void)
 /* Called from kretprobe_trampoline */
 static __used __kprobes void *trampoline_handler(struct pt_regs *regs)
 {
-       return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline,
-                                                   (void *)regs->ARM_fp);
+       return (void *)kretprobe_trampoline_handler(regs, (void *)regs->ARM_fp);
 }
 
 void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
index ce429cbacd359e5949b4f0820974bf05d4c0998e..f627a12984a8821221d03d99b11dc899ac686c10 100644 (file)
@@ -401,8 +401,7 @@ int __init arch_populate_kprobe_blacklist(void)
 
 void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)
 {
-       return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline,
-                                       (void *)kernel_stack_pointer(regs));
+       return (void *)kretprobe_trampoline_handler(regs, (void *)kernel_stack_pointer(regs));
 }
 
 void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
index 632407bf45d58d28f0c91592d5a1c9882da3b21d..784c5aba7f66cbf089c030651ded2972ab18c215 100644 (file)
@@ -386,7 +386,7 @@ int __init arch_populate_kprobe_blacklist(void)
 
 void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)
 {
-       return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       return (void *)kretprobe_trampoline_handler(regs, NULL);
 }
 
 void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
index 0f8573bbf520e94fbe50cd4a0f38249d93e8aa4f..44c84c20b626e050845fd99ac0e886e61ab9dab2 100644 (file)
@@ -392,14 +392,13 @@ static void __kprobes set_current_kprobe(struct kprobe *p,
        __this_cpu_write(current_kprobe, p);
 }
 
-static void kretprobe_trampoline(void)
+void kretprobe_trampoline(void)
 {
 }
 
 int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
 {
-       regs->cr_iip = __kretprobe_trampoline_handler(regs,
-               dereference_function_descriptor(kretprobe_trampoline), NULL);
+       regs->cr_iip = __kretprobe_trampoline_handler(regs, NULL);
        /*
         * By returning a non-zero value, we are telling
         * kprobe_handler() that we don't want the post_handler
index b0934a0d7aedd4ec60abd16604ad945db92b0676..b33bd24986514e7f23a3fd036e017145aa95914c 100644 (file)
@@ -485,8 +485,7 @@ void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
 static int __kprobes trampoline_probe_handler(struct kprobe *p,
                                                struct pt_regs *regs)
 {
-       instruction_pointer(regs) = __kretprobe_trampoline_handler(regs,
-                                               kretprobe_trampoline, NULL);
+       instruction_pointer(regs) = __kretprobe_trampoline_handler(regs, NULL);
        /*
         * By returning a non-zero value, we are telling
         * kprobe_handler() that we don't want the post_handler
index 6d21a515eea5b8e88c17f6335f41f38b1304ddb6..4a35ac6e2ca2de6bd0e594a9452a88dfe1d0eb00 100644 (file)
@@ -175,7 +175,7 @@ int __kprobes parisc_kprobe_ss_handler(struct pt_regs *regs)
        return 1;
 }
 
-static inline void kretprobe_trampoline(void)
+void kretprobe_trampoline(void)
 {
        asm volatile("nop");
        asm volatile("nop");
@@ -193,7 +193,7 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
 {
        unsigned long orig_ret_address;
 
-       orig_ret_address = __kretprobe_trampoline_handler(regs, trampoline_p.addr, NULL);
+       orig_ret_address = __kretprobe_trampoline_handler(regs, NULL);
        instruction_pointer_set(regs, orig_ret_address);
 
        return 1;
index d422e297978be89fdd2b97b450f051d4eaf81084..43c77142a2620ae75b87720034c1323ea685cd79 100644 (file)
@@ -417,7 +417,7 @@ static int trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
 {
        unsigned long orig_ret_address;
 
-       orig_ret_address = __kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       orig_ret_address = __kretprobe_trampoline_handler(regs, NULL);
        /*
         * We get here through one of two paths:
         * 1. by taking a trap -> kprobe_handler() -> here
index cab6f874358ea51c1418f842a32bc472f5337439..62d477cf11da412b235f259b50767ef5a0cbc608 100644 (file)
@@ -347,7 +347,7 @@ int __init arch_populate_kprobe_blacklist(void)
 
 void __kprobes __used *trampoline_probe_handler(struct pt_regs *regs)
 {
-       return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       return (void *)kretprobe_trampoline_handler(regs, NULL);
 }
 
 void __kprobes arch_prepare_kretprobe(struct kretprobe_instance *ri,
index 952d44b0610b0924cba494905735ae1300076018..5fa86e54f1299db0d35d7cde4e1a7e7c4336f5e1 100644 (file)
@@ -343,7 +343,7 @@ static void __used kretprobe_trampoline_holder(void)
  */
 static int trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
 {
-       regs->psw.addr = __kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       regs->psw.addr = __kretprobe_trampoline_handler(regs, NULL);
        /*
         * By returning a non-zero value, we are telling
         * kprobe_handler() that we don't want the post_handler
index 1c7f358ef0be1c5e0bb2429a6b6685c9ef0732e3..8e76a35e6e3388d774a9bcbe56cc4cdf36eb8206 100644 (file)
@@ -303,7 +303,7 @@ static void __used kretprobe_trampoline_holder(void)
  */
 int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs)
 {
-       regs->pc = __kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       regs->pc = __kretprobe_trampoline_handler(regs, NULL);
 
        return 1;
 }
index 4c05a4ee6a0e7144544db3732a6d7a8cc7bcb2a5..401534236c2e1807cdeff44917010b1c5269c8b3 100644 (file)
@@ -451,7 +451,7 @@ static int __kprobes trampoline_probe_handler(struct kprobe *p,
 {
        unsigned long orig_ret_address = 0;
 
-       orig_ret_address = __kretprobe_trampoline_handler(regs, &kretprobe_trampoline, NULL);
+       orig_ret_address = __kretprobe_trampoline_handler(regs, NULL);
        regs->tpc = orig_ret_address;
        regs->tnpc = orig_ret_address + 4;
 
index bd7f5886a7898185ffe55b03e34d634957290000..71ea2eab43d5102639d7f46d56d02a473ce1d597 100644 (file)
@@ -49,7 +49,6 @@ extern __visible kprobe_opcode_t optprobe_template_end[];
 extern const int kretprobe_blacklist_size;
 
 void arch_remove_kprobe(struct kprobe *p);
-asmlinkage void kretprobe_trampoline(void);
 
 extern void arch_kprobe_override_function(struct pt_regs *regs);
 
index b6e046e4b2895138404da91069ac232d9ffdb663..0c59ef5971deedcb9d6610bac9ed9933efabc0b1 100644 (file)
@@ -1064,7 +1064,7 @@ __used __visible void *trampoline_handler(struct pt_regs *regs)
        regs->ip = (unsigned long)&kretprobe_trampoline;
        regs->orig_ax = ~0UL;
 
-       return (void *)kretprobe_trampoline_handler(regs, &kretprobe_trampoline, &regs->sp);
+       return (void *)kretprobe_trampoline_handler(regs, &regs->sp);
 }
 NOKPROBE_SYMBOL(trampoline_handler);
 
index 2ed61fcbc89c67e21a48d49037ebddf775c21316..96f5df93e36ed3ffcb8a451a5aca82aa4a81c582 100644 (file)
@@ -188,15 +188,23 @@ extern void arch_prepare_kretprobe(struct kretprobe_instance *ri,
                                   struct pt_regs *regs);
 extern int arch_trampoline_kprobe(struct kprobe *p);
 
+void kretprobe_trampoline(void);
+/*
+ * Since some architecture uses structured function pointer,
+ * use dereference_function_descriptor() to get real function address.
+ */
+static nokprobe_inline void *kretprobe_trampoline_addr(void)
+{
+       return dereference_kernel_function_descriptor(kretprobe_trampoline);
+}
+
 /* If the trampoline handler called from a kprobe, use this version */
 unsigned long __kretprobe_trampoline_handler(struct pt_regs *regs,
-                               void *trampoline_address,
-                               void *frame_pointer);
+                                            void *frame_pointer);
 
 static nokprobe_inline
 unsigned long kretprobe_trampoline_handler(struct pt_regs *regs,
-                               void *trampoline_address,
-                               void *frame_pointer)
+                                          void *frame_pointer)
 {
        unsigned long ret;
        /*
@@ -205,7 +213,7 @@ unsigned long kretprobe_trampoline_handler(struct pt_regs *regs,
         * be running at this point.
         */
        kprobe_busy_begin();
-       ret = __kretprobe_trampoline_handler(regs, trampoline_address, frame_pointer);
+       ret = __kretprobe_trampoline_handler(regs, frame_pointer);
        kprobe_busy_end();
 
        return ret;
index 550042d9a6ef46cd47db2bc0728a7b2846f2c8fe..6ed755111eea2f16d2ed8afae905a4f108cba8ae 100644 (file)
@@ -1864,7 +1864,6 @@ static struct notifier_block kprobe_exceptions_nb = {
 #ifdef CONFIG_KRETPROBES
 
 unsigned long __kretprobe_trampoline_handler(struct pt_regs *regs,
-                                            void *trampoline_address,
                                             void *frame_pointer)
 {
        kprobe_opcode_t *correct_ret_addr = NULL;
@@ -1879,7 +1878,7 @@ unsigned long __kretprobe_trampoline_handler(struct pt_regs *regs,
 
                BUG_ON(ri->fp != frame_pointer);
 
-               if (ri->ret_addr != trampoline_address) {
+               if (ri->ret_addr != kretprobe_trampoline_addr()) {
                        correct_ret_addr = ri->ret_addr;
                        /*
                         * This is the real return address. Any other