summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIgor Nabirushkin <inabirushkin@nvidia.com>2013-10-13 21:45:06 +0400
committerHarry Hong <hhong@nvidia.com>2013-12-10 16:22:48 -0800
commit64bafeb857ee6da6a27aed623535b0a630da53eb (patch)
treed6041b6e07151413312204361b2a93ca73326a5f
parent918aa0d7567755ea3aa86e18ca01bb747329f341 (diff)
misc: tegra-profiler: backtracing for Thumb code
Tegra Profiler: add backtracing for Thumb code Bug 1387645 Change-Id: I43b6be4e14aa88d23a974a0cf7fa8d6bfbbb109f Signed-off-by: Igor Nabirushkin <inabirushkin@nvidia.com> Reviewed-on: http://git-master/r/324090 (cherry picked from commit f7e4f8cffda2497848326d3221af497c6fefa6ca) Reviewed-on: http://git-master/r/340014 Reviewed-by: Harry Hong <hhong@nvidia.com> Tested-by: Harry Hong <hhong@nvidia.com>
-rw-r--r--drivers/misc/tegra-profiler/backtrace.c17
-rw-r--r--drivers/misc/tegra-profiler/version.h2
2 files changed, 12 insertions, 7 deletions
diff --git a/drivers/misc/tegra-profiler/backtrace.c b/drivers/misc/tegra-profiler/backtrace.c
index ea68e98ae5a6..340f4faa1405 100644
--- a/drivers/misc/tegra-profiler/backtrace.c
+++ b/drivers/misc/tegra-profiler/backtrace.c
@@ -66,7 +66,7 @@ user_backtrace(unsigned long __user *tail,
return NULL;
if (!check_vma_address(value, stack_vma)) {
- /* clang's frame */
+ /* gcc thumb/clang frame */
value_fp = value;
if (check_vma_address((unsigned long)(tail + 1), stack_vma))
@@ -76,7 +76,7 @@ user_backtrace(unsigned long __user *tail,
sizeof(unsigned long)))
return NULL;
} else {
- /* gcc's frame */
+ /* gcc arm frame */
if (__copy_from_user_inatomic(&value_fp, tail - 1,
sizeof(unsigned long)))
return NULL;
@@ -115,9 +115,10 @@ quadd_get_user_callchain(struct pt_regs *regs,
return 0;
if (thumb_mode(regs))
- return 0;
+ fp = regs->ARM_r7;
+ else
+ fp = regs->ARM_fp;
- fp = regs->ARM_fp;
sp = regs->ARM_sp;
pc = regs->ARM_pc;
@@ -132,8 +133,12 @@ quadd_get_user_callchain(struct pt_regs *regs,
sizeof(unsigned long)))
return 0;
- if (reg > fp &&
- !check_vma_address(reg, vma)) {
+ if (thumb_mode(regs)) {
+ if (reg <= fp || check_vma_address(reg, vma))
+ return 0;
+ } else if (reg > fp &&
+ !check_vma_address(reg, vma)) {
+ /* fp --> fp prev */
unsigned long value;
int read_lr = 0;
diff --git a/drivers/misc/tegra-profiler/version.h b/drivers/misc/tegra-profiler/version.h
index b49405420b92..1b2ecc045aca 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.35"
+#define QUADD_MODULE_VERSION "1.36"
#define QUADD_MODULE_BRANCH "Dev"
#endif /* __QUADD_VERSION_H */