| To: | ralf@linux-mips.org |
|---|---|
| Subject: | [Bug-fix] backtrace when HAVE_FUNCTION_TRACER is enable |
| From: | Akhilesh Kumar <akhilesh.lxr@gmail.com> |
| Date: | Thu, 9 Aug 2012 19:23:30 +0530 |
| Cc: | linux-mips@linux-mips.org |
| Dkim-signature: | v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:date:message-id:subject:from:to:cc:content-type; bh=dcfOr4C1gfXUi4RUIPn+yQYoPISiK/diqu2xympr5Vg=; b=EP1ulofbQPHQ8Yh00tyKdi4wv+LdGP+odUh/j4NHRdw0hoe0vA5yjJgsdSUrpAHLqr lPmN221ArIAs0natnt82a5BeiSPmAnxCYl/CT+qh5tH4lMk1V9d56sazn0MP1jrAQCRm AzRwYts+tuMOJrQdFuLwNjH3y7S2nDGKG5LC2fDf0Dy33U/OwPieJ4xW3nJNvgTMlXbX wZLuLh4Vb9jT+CwPwarnoeQlP/xnqSx1iCFqFskRF7aAWz3ey2s+nJDe8RyeW9zKteup tXqx4E7mBqILxx5c77Ck76WtKx9M6g2IDjKlXawfS86gPQuaCmRY9wlcmymH4WeglClD l/Yg== |
| List-archive: | <http://www.linux-mips.org/archives/linux-mips/> |
| List-help: | <mailto:ecartis@linux-mips.org?Subject=help> |
| List-id: | linux-mips <linux-mips.eddie.linux-mips.org> |
| List-owner: | <mailto:ralf@linux-mips.org> |
| List-post: | <mailto:linux-mips@linux-mips.org> |
| List-software: | Ecartis version 1.0.0 |
| List-subscribe: | <mailto:ecartis@linux-mips.org?subject=subscribe%20linux-mips> |
| List-unsubscribe: | <mailto:ecartis@linux-mips.org?subject=unsubscribe%20linux-mips> |
| Sender: | linux-mips-bounce@linux-mips.org |
|
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; |
| <Prev in Thread] | Current Thread | [Next in Thread> |
|---|---|---|
| ||
| Previous by Date: | Re: [alsa-devel] [PATCH V4 12/16] ALSA: HDA: Make hda sound card usable for Loongson., Takashi Iwai |
|---|---|
| Next by Date: | [PATCH v2 0/6] Avoid cache trashing on clearing huge/gigantic page, Kirill A. Shutemov |
| Previous by Thread: | [PATCH] MIPS: fix module.c build for 32 bit, Jonas Gorski |
| Next by Thread: | Re: [Bug-fix] backtrace when HAVE_FUNCTION_TRACER is enable, Akhilesh Kumar |
| Indexes: | [Date] [Thread] [Top] [All Lists] |