From: Akhilesh Kumar <akhilesh.lxr@gmail.com>
To: wuzhangjin@gmail.com, ralf@linux-mips.org
Cc: linux-mips@linux-mips.org
Subject: Re: [Bug-fix] backtrace when HAVE_FUNCTION_TRACER is enable
Date: Thu, 9 Aug 2012 22:46:57 +0530 [thread overview]
Message-ID: <CADArhcAN4renH1hFnhc14d+VMn2N+k0GsDpXevRFKd6UD=X=8Q@mail.gmail.com> (raw)
In-Reply-To: <CAD+V5YKZJHKONehvT+-GrKLP2+e0PiLiFTJWEojiDoNyLT3yGQ@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 7764 bytes --]
yes Zhangin
please find the complete patch
====================================================================
diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
index 7955409..df72738 100644
--- a/arch/mips/kernel/process.c
+++ b/arch/mips/kernel/process.c
@@ -290,12 +290,45 @@ static inline int is_sp_move_ins(union
mips_instruction *ip)
return 0;
}
+#ifdef CONFIG_DYNAMIC_FTRACE
+/*
+ * To create the jal <> instruction from mcount.
+ * taken from:
+ * - arch/mips/kernel/ftrace.c
+ */
+#define ADDR_MASK 0x03ffffff /* op_code|addr : 31...26|25 ....0 */
+#define JAL 0x0c000000 /* jump & link: ip --> ra, jump to target */
+#define INSN_JAL(addr) \
+ ((unsigned int)(JAL | (((addr) >> 2) & ADDR_MASK)))
+
+/*
+ * We assume jal <mcount>/<ftrace_caller> to be present in
+ * first JAL_MAX_OFFSET instructions.
+ * Increment this, if its otherwise
+ */
+#define JAL_MAX_OFFSET 16U
+#define MCOUNT_STACK_INST 0x27bdfff8 /* addiu sp,sp,-8 */
+
+/*
+ * If Dynamic Ftrace is enabled, ftrace_caller is the trace function.
+ * Otherwise its - mcount
+ */
+extern void ftrace_caller(void);
+#endif /* CONFIG_DYNAMIC_FTRACE */
+
static int get_frame_info(struct mips_frame_info *info)
{
union mips_instruction *ip = info->func;
unsigned max_insns = info->func_size / sizeof(union mips_instruction);
unsigned i;
+#ifdef CONFIG_DYNAMIC_FTRACE
+ unsigned max_prolog_inst = max_insns;
+ int jal_found = 0;
+ /* instruction corresponding to jal <_mcount>/<ftrace_caller> */
+ int jal_mcount = 0;
+#endif
+
info->pc_offset = -1;
info->frame_size = 0;
@@ -306,6 +339,28 @@ static int get_frame_info(struct mips_frame_info *info)
max_insns = 128U; /* unknown function size */
max_insns = min(128U, max_insns);
+#ifdef CONFIG_DYNAMIC_FTRACE
+ max_prolog_inst = min(JAL_MAX_OFFSET, max_prolog_inst);
+ jal_mcount = INSN_JAL((unsigned)&ftrace_caller);
+
+ for (i = 0; i < max_prolog_inst; i++, ip++) {
+ if ((*(int *)ip == jal_mcount) ||
+ /*
+ * for dyn ftrace, the code initially has 0.
+ * so we check whether the next instruction is
+ * addiu sp,sp,-8
+ */
+ (!(*(int *)ip) &&
+ (*(int *)(ip + 1) == MCOUNT_STACK_INST))
+ ) {
+ jal_found = 1;
+ break;
+ }
+ }
+ /* restore the ip to start of function */
+ ip = info->func;
+#endif
+
for (i = 0; i < max_insns; i++, ip++) {
if (is_jal_jalr_jr_ins(ip))
@@ -321,6 +376,18 @@ static int get_frame_info(struct mips_frame_info *info)
break;
}
}
+#ifdef CONFIG_DYNAMIC_FTRACE
+ /*
+ * to offset the effect of:
+ * addiu sp,sp,-8
+ */
+ if (jal_found) {
+ if (info->frame_size)
+ info->frame_size += 8;
+ if (info->pc_offset >= 0)
+ info->pc_offset += 8 / sizeof(long);
+ }
+#endif
if (info->frame_size && info->pc_offset >= 0) /* nested */
return 0;
if (info->pc_offset < 0) /* leaf */
--
1.7.8.4
====================================================================
On Thu, Aug 9, 2012 at 9:41 PM, Wu Zhangjin <wuzhangjin@gmail.com> wrote:
> Hi, Akhilesh
>
> Thanks very much for your work.
>
> Seems this patch has lost something, can you send a full one?
>
> Best Regards,
> Wu Zhangjin
>
> On Thu, Aug 9, 2012 at 9:53 PM, Akhilesh Kumar <akhilesh.lxr@gmail.com>
> wrote:
> > Hi Ralf,
> >
> >
> > Sub:- Bug unable to retrive backtrace when HAVE_FUNCTION_TRACER is
> enable.
> > I send this bug and bug fix long back, I am resending this patch again
> for
> > review.
> >
> > Please review below patch if you agree I will regenerate this patch and
> with
> > you.
> >
> > ====[ backtrace testing ]===========
> > Testing a backtrace from process context.
> > The following trace is a kernel self test and not a bug!
> > Testing a backtrace.
> > The following trace is a kernel self test and not a bug!
> > Call Trace:
> > [<80295134>] dump_stack+0x8/0x34
> > [<c0946060>] backtrace_regression_test+0x60/0x94 [sisc_backtrcae]
> > [<800004f0>] do_one_initcall+0xf0/0x1d0
> > [<80060954>] sys_init_module+0x19c8/0x1c60
> > [<8000a418>] stack_done+0x20/0x40
> > output befor patch when HAVE_FUNCTION_TRACER is enable
> > ---------------------------------------------------------------------
> > #> insmod backtrace.ko
> > ====[ backtrace testing ]===========
> > Testing a backtrace from process context.
> > The following trace is a kernel self test and not a bug!
> > Testing a backtrace.
> > The following trace is a kernel self test and not a bug!
> > Call Trace:
> > [<802e5164>] dump_stack+0x1c/0x50
> > [<802e5164>] dump_stack+0x1c/0x50
> > ====[ end of backtrace testing ]====
> > ------------------------------------------------------
> > above shows the wrong back trcae
> > output after patch when HAVE_FUNCTION_TRACER is enable
> > ----------------------------------------------------------------------
> > ====[ backtrace testing ]===========
> > Testing a backtrace from process context.
> > The following trace is a kernel self test and not a bug!
> > Testing a backtrace.
> > The following trace is a kernel self test and not a bug!
> > Call Trace:
> > [<802eb1a4>] dump_stack+0x20/0x54
> > [<c003405c>] backtrace_test_timer+0x5c/0x74 [sisc_backtrcae]
> > [<c00340dc>] init_module+0x68/0xa0 [sisc_backtrcae]
> > [<80000508>] do_one_initcall+0x108/0x1f0
> > [<8006d4c4>] sys_init_module+0x1a10/0x1c74
> > [<8000b038>] stack_done+0x20/0x40
> > ------------------------------------------------------------------
> > get_frame_info() is used to fetch the frame information from the
> > function.
> > However,
> > 1. this function just considers the first stack adjustment for frame
> > size.
> > 2. On finding the save_lr instruction, it returns.
> > It doesn't handle the ftrace condition.
> > If Dynamic Frace "CONFIG_DYNAMIC_FTRACE" is enabled, the instrumentation
> > code is:
> > - jal <ftrace_caller>
> > - addiu sp,sp,-8
> > Thus, the current Frame Size of function is increased by 8 for Ftrace.
> > Signed-off-by: Akhilesh Kumar <akhilesh.lxr@gmail.com>
> > ---
> > arch/mips/kernel/process.c | 67
> > ++++++++++++++++++++++++++++++++++++++++++++
> > 1 files changed, 67 insertions(+), 0 deletions(-)
> > diff --git a/arch/mips/kernel/process.c b/arch/mips/kernel/process.c
> > index 7955409..df72738 100644
> > --- a/arch/mips/kernel/process.c
> > +++ b/arch/mips/kernel/process.c
> > @@ -290,12 +290,45 @@ static inline int is_sp_move_ins(union
> > mips_instruction *ip)
> > return 0;
> > }
> > +#ifdef CONFIG_DYNAMIC_FTRACE
> > +/*
> > + * To create the jal <> instruction from mcount.
> > + * taken from:
> > + * - arch/mips/kernel/ftrace.c
> > + */
> > +#define ADDR_MASK 0x03ffffff /* op_code|addr : 31...26|25 ....0 */
> > +#define JAL 0x0c000000 /* jump & link: ip --> ra, jump to target */
> > +#define INSN_JAL(addr) \
> > + ((unsigned int)(JAL | (((addr) >> 2) & ADDR_MASK)))
> > +
> > +/*
> > + * We assume jal <mcount>/<ftrace_caller> to be present in
> > + * first JAL_MAX_OFFSET instructions.
> > + * Increment this, if its otherwise
> > + */
> > +#define JAL_MAX_OFFSET 16U
> > +#define MCOUNT_STACK_INST 0x27bdfff8 /* addiu sp,sp,-8 */
> > +
> > +/*
> > + * If Dynamic Ftrace is enabled, ftrace_caller is the trace function.
> > + * Otherwise its - mcount
> > + */
> > +extern void ftrace_caller(void);
> > +#endif /* CONFIG_DYNAMIC_FTRACE */
> > +
> > static int get_frame_info(struct mips_frame_info *info)
> > {
> > union mips_instruction *ip = info->func;
> > unsigned max_insns = info->func_size / sizeof(union mips_instruction);
> > unsigned i;
> > +#ifdef CONFIG_DYNAMIC_FTRACE
> > + unsigned max_prolog_inst = max_insns;
> > + int jal_found = 0;
> > + /* instruction corresponding to jal <_mcount>/<ftrace_caller> */
> > + int jal_mcount = 0;
> > +#endif
> > +
> > info->pc_offset = -1;
> > info->frame_size = 0;
>
[-- Attachment #2: Type: text/html, Size: 10288 bytes --]
next prev parent reply other threads:[~2012-08-09 17:17 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-08-09 13:53 [Bug-fix] backtrace when HAVE_FUNCTION_TRACER is enable Akhilesh Kumar
[not found] ` <CAD+V5YKZJHKONehvT+-GrKLP2+e0PiLiFTJWEojiDoNyLT3yGQ@mail.gmail.com>
2012-08-09 17:16 ` Akhilesh Kumar [this message]
2012-08-12 6:28 ` John Crispin
2012-08-13 15:44 ` Akhilesh Kumar
2012-08-13 15:44 ` Akhilesh Kumar
2012-08-13 16:47 ` Ralf Baechle
2012-08-14 11:15 ` Ralf Baechle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CADArhcAN4renH1hFnhc14d+VMn2N+k0GsDpXevRFKd6UD=X=8Q@mail.gmail.com' \
--to=akhilesh.lxr@gmail.com \
--cc=linux-mips@linux-mips.org \
--cc=ralf@linux-mips.org \
--cc=wuzhangjin@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.