|
@@ -51,6 +51,12 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
|
|
|
"krava_1",
|
|
|
"test__dwarf_unwind"
|
|
|
};
|
|
|
+ /*
|
|
|
+ * The funcs[MAX_STACK] array index, based on the
|
|
|
+ * callchain order setup.
|
|
|
+ */
|
|
|
+ int idx = callchain_param.order == ORDER_CALLER ?
|
|
|
+ MAX_STACK - *cnt - 1 : *cnt;
|
|
|
|
|
|
if (*cnt >= MAX_STACK) {
|
|
|
pr_debug("failed: crossed the max stack value %d\n", MAX_STACK);
|
|
@@ -63,8 +69,10 @@ static int unwind_entry(struct unwind_entry *entry, void *arg)
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- pr_debug("got: %s 0x%" PRIx64 "\n", symbol, entry->ip);
|
|
|
- return strcmp((const char *) symbol, funcs[(*cnt)++]);
|
|
|
+ (*cnt)++;
|
|
|
+ pr_debug("got: %s 0x%" PRIx64 ", expecting %s\n",
|
|
|
+ symbol, entry->ip, funcs[idx]);
|
|
|
+ return strcmp((const char *) symbol, funcs[idx]);
|
|
|
}
|
|
|
|
|
|
__attribute__ ((noinline))
|
|
@@ -105,8 +113,16 @@ static int compare(void *p1, void *p2)
|
|
|
/* Any possible value should be 'thread' */
|
|
|
struct thread *thread = *(struct thread **)p1;
|
|
|
|
|
|
- if (global_unwind_retval == -INT_MAX)
|
|
|
+ if (global_unwind_retval == -INT_MAX) {
|
|
|
+ /* Call unwinder twice for both callchain orders. */
|
|
|
+ callchain_param.order = ORDER_CALLER;
|
|
|
+
|
|
|
global_unwind_retval = unwind_thread(thread);
|
|
|
+ if (!global_unwind_retval) {
|
|
|
+ callchain_param.order = ORDER_CALLEE;
|
|
|
+ global_unwind_retval = unwind_thread(thread);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
return p1 - p2;
|
|
|
}
|