]>
git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blob - arch/x86/include/asm/stacktrace.h
7646fb2772f801a0950ec7c9ecbbcf4122e9ebcd
2 * Copyright (C) 1991, 1992 Linus Torvalds
3 * Copyright (C) 2000, 2001, 2002 Andi Kleen, SuSE Labs
6 #ifndef _ASM_X86_STACKTRACE_H
7 #define _ASM_X86_STACKTRACE_H
9 #include <linux/uaccess.h>
10 #include <linux/ptrace.h>
11 #include <asm/switch_to.h>
13 extern int kstack_depth_to_print
;
16 struct stacktrace_ops
;
18 typedef unsigned long (*walk_stack_t
)(struct task_struct
*task
,
21 const struct stacktrace_ops
*ops
,
27 print_context_stack(struct task_struct
*task
,
28 unsigned long *stack
, unsigned long bp
,
29 const struct stacktrace_ops
*ops
, void *data
,
30 unsigned long *end
, int *graph
);
33 print_context_stack_bp(struct task_struct
*task
,
34 unsigned long *stack
, unsigned long bp
,
35 const struct stacktrace_ops
*ops
, void *data
,
36 unsigned long *end
, int *graph
);
38 /* Generic stack tracer with callbacks */
40 struct stacktrace_ops
{
41 int (*address
)(void *data
, unsigned long address
, int reliable
);
42 /* On negative return stop dumping */
43 int (*stack
)(void *data
, char *name
);
44 walk_stack_t walk_stack
;
47 void dump_trace(struct task_struct
*tsk
, struct pt_regs
*regs
,
48 unsigned long *stack
, unsigned long bp
,
49 const struct stacktrace_ops
*ops
, void *data
);
52 #define STACKSLOTS_PER_LINE 8
53 #define get_bp(bp) asm("movl %%ebp, %0" : "=r" (bp) :)
55 #define STACKSLOTS_PER_LINE 4
56 #define get_bp(bp) asm("movq %%rbp, %0" : "=r" (bp) :)
59 #ifdef CONFIG_FRAME_POINTER
60 static inline unsigned long
61 stack_frame(struct task_struct
*task
, struct pt_regs
*regs
)
68 if (task
== current
) {
69 /* Grab bp right from our regs */
74 return ((struct inactive_task_frame
*)task
->thread
.sp
)->bp
;
77 static inline unsigned long
78 stack_frame(struct task_struct
*task
, struct pt_regs
*regs
)
85 show_trace_log_lvl(struct task_struct
*task
, struct pt_regs
*regs
,
86 unsigned long *stack
, unsigned long bp
, char *log_lvl
);
89 show_stack_log_lvl(struct task_struct
*task
, struct pt_regs
*regs
,
90 unsigned long *sp
, unsigned long bp
, char *log_lvl
);
92 extern unsigned int code_bytes
;
94 /* The form of the top of the frame on the stack */
96 struct stack_frame
*next_frame
;
97 unsigned long return_address
;
100 struct stack_frame_ia32
{
105 static inline unsigned long caller_frame_pointer(void)
107 struct stack_frame
*frame
;
111 #ifdef CONFIG_FRAME_POINTER
112 frame
= frame
->next_frame
;
115 return (unsigned long)frame
;
118 #endif /* _ASM_X86_STACKTRACE_H */