>From: Josh Poimboeuf [mailto:jpoimboe@xxxxxxxxxx] > >The kretprobe_trampoline_holder() wrapper around kretprobe_trampoline() >isn't used anywhere and adds some unnecessary frame pointer instructions >which never execute. Instead, just make kretprobe_trampoline() a proper >ELF function. > Looks good to me :) Acked-by: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx> Thanks! >Signed-off-by: Josh Poimboeuf <jpoimboe@xxxxxxxxxx> >Cc: Ananth N Mavinakayanahalli <ananth@xxxxxxxxxx> >Cc: Anil S Keshavamurthy <anil.s.keshavamurthy@xxxxxxxxx> >Cc: "David S. Miller" <davem@xxxxxxxxxxxxx> >Cc: Masami Hiramatsu <masami.hiramatsu.pt@xxxxxxxxxxx> >--- > arch/x86/kernel/kprobes/core.c | 57 +++++++++++++++++++++--------------------- > 1 file changed, 28 insertions(+), 29 deletions(-) > >diff --git a/arch/x86/kernel/kprobes/core.c b/arch/x86/kernel/kprobes/core.c >index 1deffe6..5b187df 100644 >--- a/arch/x86/kernel/kprobes/core.c >+++ b/arch/x86/kernel/kprobes/core.c >@@ -671,38 +671,37 @@ NOKPROBE_SYMBOL(kprobe_int3_handler); > * When a retprobed function returns, this code saves registers and > * calls trampoline_handler() runs, which calls the kretprobe's handler. > */ >-static void __used kretprobe_trampoline_holder(void) >-{ >- asm volatile ( >- ".global kretprobe_trampoline\n" >- "kretprobe_trampoline: \n" >+asm( >+ ".global kretprobe_trampoline\n" >+ ".type kretprobe_trampoline, @function\n" >+ "kretprobe_trampoline:\n" > #ifdef CONFIG_X86_64 >- /* We don't bother saving the ss register */ >- " pushq %rsp\n" >- " pushfq\n" >- SAVE_REGS_STRING >- " movq %rsp, %rdi\n" >- " call trampoline_handler\n" >- /* Replace saved sp with true return address. */ >- " movq %rax, 152(%rsp)\n" >- RESTORE_REGS_STRING >- " popfq\n" >+ /* We don't bother saving the ss register */ >+ " pushq %rsp\n" >+ " pushfq\n" >+ SAVE_REGS_STRING >+ " movq %rsp, %rdi\n" >+ " call trampoline_handler\n" >+ /* Replace saved sp with true return address. */ >+ " movq %rax, 152(%rsp)\n" >+ RESTORE_REGS_STRING >+ " popfq\n" > #else >- " pushf\n" >- SAVE_REGS_STRING >- " movl %esp, %eax\n" >- " call trampoline_handler\n" >- /* Move flags to cs */ >- " movl 56(%esp), %edx\n" >- " movl %edx, 52(%esp)\n" >- /* Replace saved flags with true return address. */ >- " movl %eax, 56(%esp)\n" >- RESTORE_REGS_STRING >- " popf\n" >+ " pushf\n" >+ SAVE_REGS_STRING >+ " movl %esp, %eax\n" >+ " call trampoline_handler\n" >+ /* Move flags to cs */ >+ " movl 56(%esp), %edx\n" >+ " movl %edx, 52(%esp)\n" >+ /* Replace saved flags with true return address. */ >+ " movl %eax, 56(%esp)\n" >+ RESTORE_REGS_STRING >+ " popf\n" > #endif >- " ret\n"); >-} >-NOKPROBE_SYMBOL(kretprobe_trampoline_holder); >+ " ret\n" >+ ".size kretprobe_trampoline, .-kretprobe_trampoline\n" >+); > NOKPROBE_SYMBOL(kretprobe_trampoline); > > /* >-- >2.4.3 ��.n��������+%������w��{.n������\�)���jg��������ݢj����G�������j:+v���w�m������w�������h�����٥