diff options
author | Igor Nabirushkin <inabirushkin@nvidia.com> | 2013-10-13 21:45:06 +0400 |
---|---|---|
committer | Riham Haidar <rhaidar@nvidia.com> | 2013-11-07 12:12:04 -0800 |
commit | a47bc6fd9fd38e7139f36f2686d9d8ad9e32eab3 (patch) | |
tree | 7fb37fa7f0c662977c45f160dddb44f01d67da8b /drivers | |
parent | 73e7718f5d96f38bf3af28a930dd8300c90d987b (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/309641
(cherry picked from commit 304e8f9f52bb2defd33640741bc639dd4375f1b0)
Reviewed-on: http://git-master/r/326026
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')
-rw-r--r-- | drivers/misc/tegra-profiler/backtrace.c | 17 | ||||
-rw-r--r-- | drivers/misc/tegra-profiler/version.h | 2 |
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 */ |