diff options
author | Igor Nabirushkin <inabirushkin@nvidia.com> | 2014-03-25 15:09:01 +0400 |
---|---|---|
committer | Bharat Nihalani <bnihalani@nvidia.com> | 2014-04-10 22:17:03 -0700 |
commit | 8fddf958db67d87f5a3568d9c433d995306dc060 (patch) | |
tree | 7fda4b9d1734d3d416d6e047fd25dfa71c31a014 /drivers/misc | |
parent | a968655422452c1ff78f463897e6413147d0aaad (diff) |
misc: tegra-profiler: fix backtraces
Tegra Profiler: fix backtraces from the kernel context.
There should be at least one user space address for such chains.
Bug 1487562
Change-Id: Ibf1f6d78b5f744f397fbcbab54e45f70b6548fbd
Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com>
Reviewed-on: http://git-master/r/394493
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Tested-by: Maxim Morin <mmorin@nvidia.com>
Reviewed-by: Bharat Nihalani <bnihalani@nvidia.com>
Diffstat (limited to 'drivers/misc')
-rw-r--r-- | drivers/misc/tegra-profiler/backtrace.c | 5 | ||||
-rw-r--r-- | drivers/misc/tegra-profiler/backtrace.h | 5 | ||||
-rw-r--r-- | drivers/misc/tegra-profiler/hrt.c | 13 | ||||
-rw-r--r-- | drivers/misc/tegra-profiler/version.h | 2 |
4 files changed, 21 insertions, 4 deletions
diff --git a/drivers/misc/tegra-profiler/backtrace.c b/drivers/misc/tegra-profiler/backtrace.c index 5d29b9d67aa3..b8e0b2ddfcdc 100644 --- a/drivers/misc/tegra-profiler/backtrace.c +++ b/drivers/misc/tegra-profiler/backtrace.c @@ -77,7 +77,7 @@ quadd_user_link_register(struct pt_regs *regs) #endif } -void +int quadd_callchain_store(struct quadd_callchain *cc, unsigned long ip) { @@ -86,7 +86,10 @@ quadd_callchain_store(struct quadd_callchain *cc, cc->ip_64[cc->nr++] = ip; else cc->ip_32[cc->nr++] = ip; + + return 1; } + return 0; } static unsigned long __user * diff --git a/drivers/misc/tegra-profiler/backtrace.h b/drivers/misc/tegra-profiler/backtrace.h index 97ad59f8a3d1..9f58acfc70b0 100644 --- a/drivers/misc/tegra-profiler/backtrace.h +++ b/drivers/misc/tegra-profiler/backtrace.h @@ -46,8 +46,9 @@ quadd_get_user_callchain(struct pt_regs *regs, struct quadd_callchain *cc_data, struct quadd_ctx *ctx); -void quadd_callchain_store(struct quadd_callchain *cc, - unsigned long ip); +int +quadd_callchain_store(struct quadd_callchain *cc, + unsigned long ip); unsigned long quadd_user_stack_pointer(struct pt_regs *regs); diff --git a/drivers/misc/tegra-profiler/hrt.c b/drivers/misc/tegra-profiler/hrt.c index 3b7929546d1d..923410280d13 100644 --- a/drivers/misc/tegra-profiler/hrt.c +++ b/drivers/misc/tegra-profiler/hrt.c @@ -300,6 +300,19 @@ read_all_sources(struct pt_regs *regs, struct task_struct *task) if (ctx->param.backtrace) { bt_size = quadd_get_user_callchain(user_regs, cc, ctx); + + if (!bt_size && !user_mode(regs)) { + unsigned long pc = instruction_pointer(user_regs); + + cc->nr = 0; +#ifdef CONFIG_ARM64 + cc->cs_64 = compat_user_mode(user_regs) ? 0 : 1; +#else + cc->cs_64 = 0; +#endif + bt_size += quadd_callchain_store(cc, pc); + } + if (bt_size > 0) { int ip_size = cc->cs_64 ? sizeof(u64) : sizeof(u32); diff --git a/drivers/misc/tegra-profiler/version.h b/drivers/misc/tegra-profiler/version.h index aaf239405cf5..421ead514725 100644 --- a/drivers/misc/tegra-profiler/version.h +++ b/drivers/misc/tegra-profiler/version.h @@ -18,7 +18,7 @@ #ifndef __QUADD_VERSION_H #define __QUADD_VERSION_H -#define QUADD_MODULE_VERSION "1.61" +#define QUADD_MODULE_VERSION "1.62" #define QUADD_MODULE_BRANCH "Dev" #endif /* __QUADD_VERSION_H */ |