lkml.org 
[lkml]   [2021]   [Nov]   [15]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.15 068/917] ia64: kprobes: Fix to pass correct trampoline address to the handler
    Date
    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 */
    @@ -902,14 +903,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;

    \
     
     \ /
      Last update: 2021-11-16 02:15    [W:3.878 / U:0.620 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site