diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack.c')
| -rw-r--r-- | arch/x86/kernel/dumpstack.c | 33 |
1 files changed, 29 insertions, 4 deletions
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c index 0a0aa1cec8f1..c56bc2873030 100644 --- a/arch/x86/kernel/dumpstack.c +++ b/arch/x86/kernel/dumpstack.c | |||
| @@ -109,6 +109,30 @@ print_context_stack(struct thread_info *tinfo, | |||
| 109 | } | 109 | } |
| 110 | return bp; | 110 | return bp; |
| 111 | } | 111 | } |
| 112 | EXPORT_SYMBOL_GPL(print_context_stack); | ||
| 113 | |||
| 114 | unsigned long | ||
| 115 | print_context_stack_bp(struct thread_info *tinfo, | ||
| 116 | unsigned long *stack, unsigned long bp, | ||
| 117 | const struct stacktrace_ops *ops, void *data, | ||
| 118 | unsigned long *end, int *graph) | ||
| 119 | { | ||
| 120 | struct stack_frame *frame = (struct stack_frame *)bp; | ||
| 121 | unsigned long *ret_addr = &frame->return_address; | ||
| 122 | |||
| 123 | while (valid_stack_ptr(tinfo, ret_addr, sizeof(*ret_addr), end)) { | ||
| 124 | unsigned long addr = *ret_addr; | ||
| 125 | |||
| 126 | if (__kernel_text_address(addr)) { | ||
| 127 | ops->address(data, addr, 1); | ||
| 128 | frame = frame->next_frame; | ||
| 129 | ret_addr = &frame->return_address; | ||
| 130 | print_ftrace_graph_addr(addr, data, ops, tinfo, graph); | ||
| 131 | } | ||
| 132 | } | ||
| 133 | return (unsigned long)frame; | ||
| 134 | } | ||
| 135 | EXPORT_SYMBOL_GPL(print_context_stack_bp); | ||
| 112 | 136 | ||
| 113 | 137 | ||
| 114 | static void | 138 | static void |
| @@ -141,10 +165,11 @@ static void print_trace_address(void *data, unsigned long addr, int reliable) | |||
| 141 | } | 165 | } |
| 142 | 166 | ||
| 143 | static const struct stacktrace_ops print_trace_ops = { | 167 | static const struct stacktrace_ops print_trace_ops = { |
| 144 | .warning = print_trace_warning, | 168 | .warning = print_trace_warning, |
| 145 | .warning_symbol = print_trace_warning_symbol, | 169 | .warning_symbol = print_trace_warning_symbol, |
| 146 | .stack = print_trace_stack, | 170 | .stack = print_trace_stack, |
| 147 | .address = print_trace_address, | 171 | .address = print_trace_address, |
| 172 | .walk_stack = print_context_stack, | ||
| 148 | }; | 173 | }; |
| 149 | 174 | ||
| 150 | void | 175 | void |
