summaryrefslogtreecommitdiff
path: root/drivers/misc
diff options
context:
space:
mode:
authorIgor Nabirushkin <inabirushkin@nvidia.com>2014-03-25 15:09:01 +0400
committerBharat Nihalani <bnihalani@nvidia.com>2014-04-10 22:17:03 -0700
commit8fddf958db67d87f5a3568d9c433d995306dc060 (patch)
tree7fda4b9d1734d3d416d6e047fd25dfa71c31a014 /drivers/misc
parenta968655422452c1ff78f463897e6413147d0aaad (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.c5
-rw-r--r--drivers/misc/tegra-profiler/backtrace.h5
-rw-r--r--drivers/misc/tegra-profiler/hrt.c13
-rw-r--r--drivers/misc/tegra-profiler/version.h2
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 */