Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
stacktrace.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1991, 1992 Linus Torvalds
3  * Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
4  */
5 
6 #ifndef _ASM_X86_STACKTRACE_H
7 #define _ASM_X86_STACKTRACE_H
8 
9 #include <linux/uaccess.h>
10 #include <linux/ptrace.h>
11 
12 extern int kstack_depth_to_print;
13 
14 struct thread_info;
15 struct stacktrace_ops;
16 
17 typedef unsigned long (*walk_stack_t)(struct thread_info *tinfo,
18  unsigned long *stack,
19  unsigned long bp,
20  const struct stacktrace_ops *ops,
21  void *data,
22  unsigned long *end,
23  int *graph);
24 
25 extern unsigned long
26 print_context_stack(struct thread_info *tinfo,
27  unsigned long *stack, unsigned long bp,
28  const struct stacktrace_ops *ops, void *data,
29  unsigned long *end, int *graph);
30 
31 extern unsigned long
33  unsigned long *stack, unsigned long bp,
34  const struct stacktrace_ops *ops, void *data,
35  unsigned long *end, int *graph);
36 
37 /* Generic stack tracer with callbacks */
38 
39 struct stacktrace_ops {
40  void (*address)(void *data, unsigned long address, int reliable);
41  /* On negative return stop dumping */
42  int (*stack)(void *data, char *name);
44 };
45 
46 void dump_trace(struct task_struct *tsk, struct pt_regs *regs,
47  unsigned long *stack, unsigned long bp,
48  const struct stacktrace_ops *ops, void *data);
49 
50 #ifdef CONFIG_X86_32
51 #define STACKSLOTS_PER_LINE 8
52 #define get_bp(bp) asm("movl %%ebp, %0" : "=r" (bp) :)
53 #else
54 #define STACKSLOTS_PER_LINE 4
55 #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
56 #endif
57 
58 #ifdef CONFIG_FRAME_POINTER
59 static inline unsigned long
60 stack_frame(struct task_struct *task, struct pt_regs *regs)
61 {
62  unsigned long bp;
63 
64  if (regs)
65  return regs->bp;
66 
67  if (task == current) {
68  /* Grab bp right from our regs */
69  get_bp(bp);
70  return bp;
71  }
72 
73  /* bp is the last reg pushed by switch_to */
74  return *(unsigned long *)task->thread.sp;
75 }
76 #else
77 static inline unsigned long
78 stack_frame(struct task_struct *task, struct pt_regs *regs)
79 {
80  return 0;
81 }
82 #endif
83 
84 extern void
86  unsigned long *stack, unsigned long bp, char *log_lvl);
87 
88 extern void
90  unsigned long *sp, unsigned long bp, char *log_lvl);
91 
92 extern unsigned int code_bytes;
93 
94 /* The form of the top of the frame on the stack */
95 struct stack_frame {
97  unsigned long return_address;
98 };
99 
103 };
104 
105 static inline unsigned long caller_frame_pointer(void)
106 {
107  struct stack_frame *frame;
108 
109  get_bp(frame);
110 
111 #ifdef CONFIG_FRAME_POINTER
112  frame = frame->next_frame;
113 #endif
114 
115  return (unsigned long)frame;
116 }
117 
118 #endif /* _ASM_X86_STACKTRACE_H */