kprobes/x86: Cleanup save/restore registers
Introduce SAVE/RESOTRE_REGS_STRING for cleanup kretprobe-trampoline asm code. These macros will be used for emulating interruption. Signed-off-by: Masami Hiramatsu <mhiramat@redhat.com> Cc: systemtap <systemtap@sources.redhat.com> Cc: DLE <dle-develop@lists.sourceforge.net> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: Jim Keniston <jkenisto@us.ibm.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Christoph Hellwig <hch@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Anders Kaseorg <andersk@ksplice.com> Cc: Tim Abbott <tabbott@ksplice.com> Cc: Andi Kleen <andi@firstfloor.org> Cc: Jason Baron <jbaron@redhat.com> Cc: Mathieu Desnoyers <compudj@krystal.dyndns.org> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> LKML-Reference: <20100225133430.6725.83342.stgit@localhost6.localdomain6> Signed-off-by: Ingo Molnar <mingo@elte.hu>
This commit is contained in:
parent
0f94eb634e
commit
f007ea2685
1 changed files with 67 additions and 61 deletions
|
@ -554,6 +554,69 @@ static int __kprobes kprobe_handler(struct pt_regs *regs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_64
|
||||||
|
#define SAVE_REGS_STRING \
|
||||||
|
/* Skip cs, ip, orig_ax. */ \
|
||||||
|
" subq $24, %rsp\n" \
|
||||||
|
" pushq %rdi\n" \
|
||||||
|
" pushq %rsi\n" \
|
||||||
|
" pushq %rdx\n" \
|
||||||
|
" pushq %rcx\n" \
|
||||||
|
" pushq %rax\n" \
|
||||||
|
" pushq %r8\n" \
|
||||||
|
" pushq %r9\n" \
|
||||||
|
" pushq %r10\n" \
|
||||||
|
" pushq %r11\n" \
|
||||||
|
" pushq %rbx\n" \
|
||||||
|
" pushq %rbp\n" \
|
||||||
|
" pushq %r12\n" \
|
||||||
|
" pushq %r13\n" \
|
||||||
|
" pushq %r14\n" \
|
||||||
|
" pushq %r15\n"
|
||||||
|
#define RESTORE_REGS_STRING \
|
||||||
|
" popq %r15\n" \
|
||||||
|
" popq %r14\n" \
|
||||||
|
" popq %r13\n" \
|
||||||
|
" popq %r12\n" \
|
||||||
|
" popq %rbp\n" \
|
||||||
|
" popq %rbx\n" \
|
||||||
|
" popq %r11\n" \
|
||||||
|
" popq %r10\n" \
|
||||||
|
" popq %r9\n" \
|
||||||
|
" popq %r8\n" \
|
||||||
|
" popq %rax\n" \
|
||||||
|
" popq %rcx\n" \
|
||||||
|
" popq %rdx\n" \
|
||||||
|
" popq %rsi\n" \
|
||||||
|
" popq %rdi\n" \
|
||||||
|
/* Skip orig_ax, ip, cs */ \
|
||||||
|
" addq $24, %rsp\n"
|
||||||
|
#else
|
||||||
|
#define SAVE_REGS_STRING \
|
||||||
|
/* Skip cs, ip, orig_ax and gs. */ \
|
||||||
|
" subl $16, %esp\n" \
|
||||||
|
" pushl %fs\n" \
|
||||||
|
" pushl %ds\n" \
|
||||||
|
" pushl %es\n" \
|
||||||
|
" pushl %eax\n" \
|
||||||
|
" pushl %ebp\n" \
|
||||||
|
" pushl %edi\n" \
|
||||||
|
" pushl %esi\n" \
|
||||||
|
" pushl %edx\n" \
|
||||||
|
" pushl %ecx\n" \
|
||||||
|
" pushl %ebx\n"
|
||||||
|
#define RESTORE_REGS_STRING \
|
||||||
|
" popl %ebx\n" \
|
||||||
|
" popl %ecx\n" \
|
||||||
|
" popl %edx\n" \
|
||||||
|
" popl %esi\n" \
|
||||||
|
" popl %edi\n" \
|
||||||
|
" popl %ebp\n" \
|
||||||
|
" popl %eax\n" \
|
||||||
|
/* Skip ds, es, fs, gs, orig_ax, and ip. Note: don't pop cs here*/\
|
||||||
|
" addl $24, %esp\n"
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* When a retprobed function returns, this code saves registers and
|
* When a retprobed function returns, this code saves registers and
|
||||||
* calls trampoline_handler() runs, which calls the kretprobe's handler.
|
* calls trampoline_handler() runs, which calls the kretprobe's handler.
|
||||||
|
@ -567,65 +630,16 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
|
||||||
/* We don't bother saving the ss register */
|
/* We don't bother saving the ss register */
|
||||||
" pushq %rsp\n"
|
" pushq %rsp\n"
|
||||||
" pushfq\n"
|
" pushfq\n"
|
||||||
/*
|
SAVE_REGS_STRING
|
||||||
* Skip cs, ip, orig_ax.
|
|
||||||
* trampoline_handler() will plug in these values
|
|
||||||
*/
|
|
||||||
" subq $24, %rsp\n"
|
|
||||||
" pushq %rdi\n"
|
|
||||||
" pushq %rsi\n"
|
|
||||||
" pushq %rdx\n"
|
|
||||||
" pushq %rcx\n"
|
|
||||||
" pushq %rax\n"
|
|
||||||
" pushq %r8\n"
|
|
||||||
" pushq %r9\n"
|
|
||||||
" pushq %r10\n"
|
|
||||||
" pushq %r11\n"
|
|
||||||
" pushq %rbx\n"
|
|
||||||
" pushq %rbp\n"
|
|
||||||
" pushq %r12\n"
|
|
||||||
" pushq %r13\n"
|
|
||||||
" pushq %r14\n"
|
|
||||||
" pushq %r15\n"
|
|
||||||
" movq %rsp, %rdi\n"
|
" movq %rsp, %rdi\n"
|
||||||
" call trampoline_handler\n"
|
" call trampoline_handler\n"
|
||||||
/* Replace saved sp with true return address. */
|
/* Replace saved sp with true return address. */
|
||||||
" movq %rax, 152(%rsp)\n"
|
" movq %rax, 152(%rsp)\n"
|
||||||
" popq %r15\n"
|
RESTORE_REGS_STRING
|
||||||
" popq %r14\n"
|
|
||||||
" popq %r13\n"
|
|
||||||
" popq %r12\n"
|
|
||||||
" popq %rbp\n"
|
|
||||||
" popq %rbx\n"
|
|
||||||
" popq %r11\n"
|
|
||||||
" popq %r10\n"
|
|
||||||
" popq %r9\n"
|
|
||||||
" popq %r8\n"
|
|
||||||
" popq %rax\n"
|
|
||||||
" popq %rcx\n"
|
|
||||||
" popq %rdx\n"
|
|
||||||
" popq %rsi\n"
|
|
||||||
" popq %rdi\n"
|
|
||||||
/* Skip orig_ax, ip, cs */
|
|
||||||
" addq $24, %rsp\n"
|
|
||||||
" popfq\n"
|
" popfq\n"
|
||||||
#else
|
#else
|
||||||
" pushf\n"
|
" pushf\n"
|
||||||
/*
|
SAVE_REGS_STRING
|
||||||
* Skip cs, ip, orig_ax and gs.
|
|
||||||
* trampoline_handler() will plug in these values
|
|
||||||
*/
|
|
||||||
" subl $16, %esp\n"
|
|
||||||
" pushl %fs\n"
|
|
||||||
" pushl %es\n"
|
|
||||||
" pushl %ds\n"
|
|
||||||
" pushl %eax\n"
|
|
||||||
" pushl %ebp\n"
|
|
||||||
" pushl %edi\n"
|
|
||||||
" pushl %esi\n"
|
|
||||||
" pushl %edx\n"
|
|
||||||
" pushl %ecx\n"
|
|
||||||
" pushl %ebx\n"
|
|
||||||
" movl %esp, %eax\n"
|
" movl %esp, %eax\n"
|
||||||
" call trampoline_handler\n"
|
" call trampoline_handler\n"
|
||||||
/* Move flags to cs */
|
/* Move flags to cs */
|
||||||
|
@ -633,15 +647,7 @@ static void __used __kprobes kretprobe_trampoline_holder(void)
|
||||||
" movl %edx, 52(%esp)\n"
|
" movl %edx, 52(%esp)\n"
|
||||||
/* Replace saved flags with true return address. */
|
/* Replace saved flags with true return address. */
|
||||||
" movl %eax, 56(%esp)\n"
|
" movl %eax, 56(%esp)\n"
|
||||||
" popl %ebx\n"
|
RESTORE_REGS_STRING
|
||||||
" popl %ecx\n"
|
|
||||||
" popl %edx\n"
|
|
||||||
" popl %esi\n"
|
|
||||||
" popl %edi\n"
|
|
||||||
" popl %ebp\n"
|
|
||||||
" popl %eax\n"
|
|
||||||
/* Skip ds, es, fs, gs, orig_ax and ip */
|
|
||||||
" addl $24, %esp\n"
|
|
||||||
" popf\n"
|
" popf\n"
|
||||||
#endif
|
#endif
|
||||||
" ret\n");
|
" ret\n");
|
||||||
|
|
Loading…
Add table
Reference in a new issue