0295aa789ab43bc7b064936a539dbb662c13525e
[powerpc.git] / include / linux / unwind.h
1 #ifndef _LINUX_UNWIND_H
2 #define _LINUX_UNWIND_H
3
4 /*
5  * Copyright (C) 2002-2006 Novell, Inc.
6  *      Jan Beulich <jbeulich@novell.com>
7  * This code is released under version 2 of the GNU GPL.
8  *
9  * A simple API for unwinding kernel stacks.  This is used for
10  * debugging and error reporting purposes.  The kernel doesn't need
11  * full-blown stack unwinding with all the bells and whistles, so there
12  * is not much point in implementing the full Dwarf2 unwind API.
13  */
14
15 #include <linux/config.h>
16
17 struct module;
18
19 #ifdef CONFIG_STACK_UNWIND
20
21 #include <asm/unwind.h>
22
23 #ifndef ARCH_UNWIND_SECTION_NAME
24 #define ARCH_UNWIND_SECTION_NAME ".eh_frame"
25 #endif
26
27 /*
28  * Initialize unwind support.
29  */
30 extern void unwind_init(void);
31
32 extern void *unwind_add_table(struct module *,
33                               const void *table_start,
34                               unsigned long table_size);
35
36 extern void unwind_remove_table(void *handle, int init_only);
37
38 extern int unwind_init_frame_info(struct unwind_frame_info *,
39                                   struct task_struct *,
40                                   /*const*/ struct pt_regs *);
41
42 /*
43  * Prepare to unwind a blocked task.
44  */
45 extern int unwind_init_blocked(struct unwind_frame_info *,
46                                struct task_struct *);
47
48 /*
49  * Prepare to unwind the currently running thread.
50  */
51 extern int unwind_init_running(struct unwind_frame_info *,
52                                asmlinkage void (*callback)(struct unwind_frame_info *,
53                                                            void *arg),
54                                void *arg);
55
56 /*
57  * Unwind to previous to frame.  Returns 0 if successful, negative
58  * number in case of an error.
59  */
60 extern int unwind(struct unwind_frame_info *);
61
62 /*
63  * Unwind until the return pointer is in user-land (or until an error
64  * occurs).  Returns 0 if successful, negative number in case of
65  * error.
66  */
67 extern int unwind_to_user(struct unwind_frame_info *);
68
69 #else
70
71 struct unwind_frame_info {};
72
73 static inline void unwind_init(void) {}
74
75 static inline void *unwind_add_table(struct module *mod,
76                                      const void *table_start,
77                                      unsigned long table_size)
78 {
79         return NULL;
80 }
81
82 static inline void unwind_remove_table(void *handle, int init_only)
83 {
84 }
85
86 static inline int unwind_init_frame_info(struct unwind_frame_info *info,
87                                          struct task_struct *tsk,
88                                          const struct pt_regs *regs)
89 {
90         return -ENOSYS;
91 }
92
93 static inline int unwind_init_blocked(struct unwind_frame_info *info,
94                                       struct task_struct *tsk)
95 {
96         return -ENOSYS;
97 }
98
99 static inline int unwind_init_running(struct unwind_frame_info *info,
100                                       asmlinkage void (*cb)(struct unwind_frame_info *,
101                                                             void *arg),
102                                       void *arg)
103 {
104         return -ENOSYS;
105 }
106
107 static inline int unwind(struct unwind_frame_info *info)
108 {
109         return -ENOSYS;
110 }
111
112 static inline int unwind_to_user(struct unwind_frame_info *info)
113 {
114         return -ENOSYS;
115 }
116
117 #endif
118
119 #endif /* _LINUX_UNWIND_H */