Messages in this thread | | | Date | Tue, 03 Jul 2012 14:27:06 +0900 | From | Masami Hiramatsu <> | Subject | Re: [PATCH 6/6] ftrace/x86: Add save_regs for i386 function calls |
| |
(2012/07/03 5:03), Steven Rostedt wrote: > From: Steven Rostedt <srostedt@redhat.com> > > Add saving full regs for function tracing on i386. > The saving of regs was influenced by patches sent out by > Masami Hiramatsu. > > Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> > Signed-off-by: Steven Rostedt <rostedt@goodmis.org> > --- > arch/x86/include/asm/ftrace.h | 2 -- > arch/x86/kernel/entry_32.S | 53 +++++++++++++++++++++++++++++++++++++++++ > arch/x86/kernel/ftrace.c | 4 ---- > 3 files changed, 53 insertions(+), 6 deletions(-) > > diff --git a/arch/x86/include/asm/ftrace.h b/arch/x86/include/asm/ftrace.h > index fd10faf..2b396cf 100644 > --- a/arch/x86/include/asm/ftrace.h > +++ b/arch/x86/include/asm/ftrace.h > @@ -40,10 +40,8 @@ > > #ifdef CONFIG_DYNAMIC_FTRACE > #define ARCH_SUPPORTS_FTRACE_OPS 1 > -#ifdef CONFIG_X86_64 > #define ARCH_SUPPORTS_FTRACE_SAVE_REGS > #endif > -#endif > > #ifndef __ASSEMBLY__ > extern void mcount(void); > diff --git a/arch/x86/kernel/entry_32.S b/arch/x86/kernel/entry_32.S > index acd4963..e18ea33 100644 > --- a/arch/x86/kernel/entry_32.S > +++ b/arch/x86/kernel/entry_32.S > @@ -1123,6 +1123,7 @@ ftrace_call: > popl %edx > popl %ecx > popl %eax > +ftrace_ret: > #ifdef CONFIG_FUNCTION_GRAPH_TRACER > .globl ftrace_graph_call > ftrace_graph_call: > @@ -1134,6 +1135,58 @@ ftrace_stub: > ret > END(ftrace_caller) > > +ENTRY(ftrace_regs_caller) > + pushf /* push flags before compare */ > + cmpl $0, function_trace_stop > + jne ftrace_exit > + > + subl $8, %esp /* skip ip and orig_ax */ > + pushl %gs > + pushl %fs > + pushl %es > + pushl %ds > + pushl %eax > + pushl %ebp > + pushl %edi > + pushl %esi > + pushl %edx > + pushl %ecx > + pushl %ebx > + movl 14*4(%esp), %eax /* Load return address */ > + pushl %eax /* Save return address (+4) */ > + subl $MCOUNT_INSN_SIZE, %eax > + movl %eax, 12*4+4(%esp) /* Store IP */ > + movl 13*4+4(%esp), %edx /* Load flags */ > + movl %edx, 14*4+4(%esp) /* Store flags */ > + movl $__KERNEL_CS, %edx > + movl %edx, 13*4+4(%esp) /* Store CS */ > + > + movl 0x4(%ebp), %edx > + lea 4(%esp), %ecx > + pushl %ecx /* Save pt_regs as 4th parameter */ > + leal function_trace_op, %ecx > + > +GLOBAL(ftrace_regs_call) > + call ftrace_stub > + > + addl $4,%esp /* Skip pt_regs */
Hmm, you need to restoring flags here, because original flags is clobbered by KERNEL_CS.
movl 14*4+4(%esp), %edx movl %edx, 13*4+4(%esp)
Thank you,
-- Masami HIRAMATSU Software Platform Research Dept. Linux Technology Center Hitachi, Ltd., Yokohama Research Laboratory E-mail: masami.hiramatsu.pt@hitachi.com
| |