]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blob - include/linux/unwind.h
Merge branch 'intelfb-patches' of master.kernel.org:/pub/scm/linux/kernel/git/airlied...
[mirror_ubuntu-bionic-kernel.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 #ifdef CONFIG_MODULES
33
34 extern void *unwind_add_table(struct module *,
35 const void *table_start,
36 unsigned long table_size);
37
38 extern void unwind_remove_table(void *handle, int init_only);
39
40 #endif
41
42 extern int unwind_init_frame_info(struct unwind_frame_info *,
43 struct task_struct *,
44 /*const*/ struct pt_regs *);
45
46 /*
47 * Prepare to unwind a blocked task.
48 */
49 extern int unwind_init_blocked(struct unwind_frame_info *,
50 struct task_struct *);
51
52 /*
53 * Prepare to unwind the currently running thread.
54 */
55 extern int unwind_init_running(struct unwind_frame_info *,
56 asmlinkage int (*callback)(struct unwind_frame_info *,
57 void *arg),
58 void *arg);
59
60 /*
61 * Unwind to previous to frame. Returns 0 if successful, negative
62 * number in case of an error.
63 */
64 extern int unwind(struct unwind_frame_info *);
65
66 /*
67 * Unwind until the return pointer is in user-land (or until an error
68 * occurs). Returns 0 if successful, negative number in case of
69 * error.
70 */
71 extern int unwind_to_user(struct unwind_frame_info *);
72
73 #else
74
75 struct unwind_frame_info {};
76
77 static inline void unwind_init(void) {}
78
79 #ifdef CONFIG_MODULES
80
81 static inline void *unwind_add_table(struct module *mod,
82 const void *table_start,
83 unsigned long table_size)
84 {
85 return NULL;
86 }
87
88 #endif
89
90 static inline void unwind_remove_table(void *handle, int init_only)
91 {
92 }
93
94 static inline int unwind_init_frame_info(struct unwind_frame_info *info,
95 struct task_struct *tsk,
96 const struct pt_regs *regs)
97 {
98 return -ENOSYS;
99 }
100
101 static inline int unwind_init_blocked(struct unwind_frame_info *info,
102 struct task_struct *tsk)
103 {
104 return -ENOSYS;
105 }
106
107 static inline int unwind_init_running(struct unwind_frame_info *info,
108 asmlinkage int (*cb)(struct unwind_frame_info *,
109 void *arg),
110 void *arg)
111 {
112 return -ENOSYS;
113 }
114
115 static inline int unwind(struct unwind_frame_info *info)
116 {
117 return -ENOSYS;
118 }
119
120 static inline int unwind_to_user(struct unwind_frame_info *info)
121 {
122 return -ENOSYS;
123 }
124
125 #endif
126
127 #endif /* _LINUX_UNWIND_H */