|
@@ -109,6 +109,30 @@ print_context_stack(struct thread_info *tinfo,
|
|
|
}
|
|
|
return bp;
|
|
|
}
|
|
|
+EXPORT_SYMBOL_GPL(print_context_stack);
|
|
|
+
|
|
|
+unsigned long
|
|
|
+print_context_stack_bp(struct thread_info *tinfo,
|
|
|
+ unsigned long *stack, unsigned long bp,
|
|
|
+ const struct stacktrace_ops *ops, void *data,
|
|
|
+ unsigned long *end, int *graph)
|
|
|
+{
|
|
|
+ struct stack_frame *frame = (struct stack_frame *)bp;
|
|
|
+ unsigned long *ret_addr = &frame->return_address;
|
|
|
+
|
|
|
+ while (valid_stack_ptr(tinfo, ret_addr, sizeof(*ret_addr), end)) {
|
|
|
+ unsigned long addr = *ret_addr;
|
|
|
+
|
|
|
+ if (__kernel_text_address(addr)) {
|
|
|
+ ops->address(data, addr, 1);
|
|
|
+ frame = frame->next_frame;
|
|
|
+ ret_addr = &frame->return_address;
|
|
|
+ print_ftrace_graph_addr(addr, data, ops, tinfo, graph);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return (unsigned long)frame;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(print_context_stack_bp);
|
|
|
|
|
|
|
|
|
static void
|
|
@@ -143,8 +167,8 @@ static void print_trace_address(void *data, unsigned long addr, int reliable)
|
|
|
static const struct stacktrace_ops print_trace_ops = {
|
|
|
.warning = print_trace_warning,
|
|
|
.warning_symbol = print_trace_warning_symbol,
|
|
|
- .stack = print_trace_stack,
|
|
|
- .address = print_trace_address,
|
|
|
+ .stack = print_trace_stack,
|
|
|
+ .address = print_trace_address,
|
|
|
.walk_stack = print_context_stack,
|
|
|
};
|
|
|
|