| From a7fe2378454cf46cd5e2776d05e72bbe8f0a468c Mon Sep 17 00:00:00 2001 |
| From: Masami Hiramatsu <mhiramat@kernel.org> |
| Date: Tue, 14 Sep 2021 23:40:27 +0900 |
| Subject: ia64: kprobes: Fix to pass correct trampoline address to the handler |
| |
| From: Masami Hiramatsu <mhiramat@kernel.org> |
| |
| commit a7fe2378454cf46cd5e2776d05e72bbe8f0a468c upstream. |
| |
| The following commit: |
| |
| Commit e792ff804f49 ("ia64: kprobes: Use generic kretprobe trampoline handler") |
| |
| Passed the wrong trampoline address to __kretprobe_trampoline_handler(): it |
| passes the descriptor address instead of function entry address. |
| |
| Pass the right parameter. |
| |
| Also use correct symbol dereference function to get the function address |
| from 'kretprobe_trampoline' - an IA64 special. |
| |
| Link: https://lkml.kernel.org/r/163163042696.489837.12551102356265354730.stgit@devnote2 |
| |
| Fixes: e792ff804f49 ("ia64: kprobes: Use generic kretprobe trampoline handler") |
| Cc: Josh Poimboeuf <jpoimboe@redhat.com> |
| Cc: Ingo Molnar <mingo@kernel.org> |
| Cc: X86 ML <x86@kernel.org> |
| Cc: Daniel Xu <dxu@dxuuu.xyz> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: Borislav Petkov <bp@alien8.de> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Abhishek Sagar <sagar.abhishek@gmail.com> |
| Cc: Andrii Nakryiko <andrii.nakryiko@gmail.com> |
| Cc: Paul McKenney <paulmck@kernel.org> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Masami Hiramatsu <mhiramat@kernel.org> |
| Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| arch/ia64/kernel/kprobes.c | 9 +++++---- |
| 1 file changed, 5 insertions(+), 4 deletions(-) |
| |
| --- a/arch/ia64/kernel/kprobes.c |
| +++ b/arch/ia64/kernel/kprobes.c |
| @@ -398,7 +398,8 @@ static void kretprobe_trampoline(void) |
| |
| int __kprobes trampoline_probe_handler(struct kprobe *p, struct pt_regs *regs) |
| { |
| - regs->cr_iip = __kretprobe_trampoline_handler(regs, kretprobe_trampoline, NULL); |
| + regs->cr_iip = __kretprobe_trampoline_handler(regs, |
| + dereference_function_descriptor(kretprobe_trampoline), NULL); |
| /* |
| * By returning a non-zero value, we are telling |
| * kprobe_handler() that we don't want the post_handler |
| @@ -414,7 +415,7 @@ void __kprobes arch_prepare_kretprobe(st |
| ri->fp = NULL; |
| |
| /* Replace the return addr with trampoline addr */ |
| - regs->b0 = ((struct fnptr *)kretprobe_trampoline)->ip; |
| + regs->b0 = (unsigned long)dereference_function_descriptor(kretprobe_trampoline); |
| } |
| |
| /* Check the instruction in the slot is break */ |
| @@ -918,14 +919,14 @@ static struct kprobe trampoline_p = { |
| int __init arch_init_kprobes(void) |
| { |
| trampoline_p.addr = |
| - (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip; |
| + dereference_function_descriptor(kretprobe_trampoline); |
| return register_kprobe(&trampoline_p); |
| } |
| |
| int __kprobes arch_trampoline_kprobe(struct kprobe *p) |
| { |
| if (p->addr == |
| - (kprobe_opcode_t *)((struct fnptr *)kretprobe_trampoline)->ip) |
| + dereference_function_descriptor(kretprobe_trampoline)) |
| return 1; |
| |
| return 0; |