forked from Minki/linux
s390/test_unwind: print verbose unwinding results
Add stack name, sp and reliable information into test unwinding results. Also consider ip outside of kernel text as failure if the state is reported reliable. Acked-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
This commit is contained in:
parent
7868249fbb
commit
0610154650
@ -38,6 +38,7 @@ const char *stack_type_name(enum stack_type type)
|
||||
return "unknown";
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(stack_type_name);
|
||||
|
||||
static inline bool in_stack(unsigned long sp, struct stack_info *info,
|
||||
enum stack_type type, unsigned long low,
|
||||
|
@ -56,11 +56,19 @@ static noinline int test_unwind(struct task_struct *task, struct pt_regs *regs,
|
||||
unsigned long addr = unwind_get_return_address(&state);
|
||||
char sym[KSYM_SYMBOL_LEN];
|
||||
|
||||
if (!addr || frame_count == max_frames)
|
||||
if (frame_count++ == max_frames)
|
||||
break;
|
||||
if (state.reliable && !addr) {
|
||||
pr_err("unwind state reliable but addr is 0\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
sprint_symbol(sym, addr);
|
||||
if (bt_pos < BT_BUF_SIZE) {
|
||||
bt_pos += snprintf(bt + bt_pos, BT_BUF_SIZE - bt_pos, "%s\n", sym);
|
||||
bt_pos += snprintf(bt + bt_pos, BT_BUF_SIZE - bt_pos,
|
||||
state.reliable ? " [%-7s%px] %pSR\n" :
|
||||
"([%-7s%px] %pSR)\n",
|
||||
stack_type_name(state.stack_info.type),
|
||||
(void *)state.sp, (void *)state.ip);
|
||||
if (bt_pos >= BT_BUF_SIZE)
|
||||
pr_err("backtrace buffer is too small\n");
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user