blob: 749928c161fb24a6fbdcc95fc703c18d900f9494 [file] [log] [blame]
Jan Beulich4552d5d2006-06-26 13:57:28 +02001#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
Jan Beulich4552d5d2006-06-26 13:57:28 +020015struct module;
16
17#ifdef CONFIG_STACK_UNWIND
18
19#include <asm/unwind.h>
20
21#ifndef ARCH_UNWIND_SECTION_NAME
22#define ARCH_UNWIND_SECTION_NAME ".eh_frame"
23#endif
24
25/*
26 * Initialize unwind support.
27 */
28extern void unwind_init(void);
Jan Beulich690a9732006-10-21 18:37:01 +020029extern void unwind_setup(void);
Jan Beulich4552d5d2006-06-26 13:57:28 +020030
Jan Beulich83f4fcc2006-06-26 13:57:50 +020031#ifdef CONFIG_MODULES
32
Jan Beulich4552d5d2006-06-26 13:57:28 +020033extern void *unwind_add_table(struct module *,
34 const void *table_start,
35 unsigned long table_size);
36
37extern void unwind_remove_table(void *handle, int init_only);
38
Jan Beulich83f4fcc2006-06-26 13:57:50 +020039#endif
40
Jan Beulich4552d5d2006-06-26 13:57:28 +020041extern int unwind_init_frame_info(struct unwind_frame_info *,
42 struct task_struct *,
43 /*const*/ struct pt_regs *);
44
45/*
46 * Prepare to unwind a blocked task.
47 */
48extern int unwind_init_blocked(struct unwind_frame_info *,
49 struct task_struct *);
50
51/*
52 * Prepare to unwind the currently running thread.
53 */
54extern int unwind_init_running(struct unwind_frame_info *,
Jan Beulichc33bd9a2006-06-26 13:57:47 +020055 asmlinkage int (*callback)(struct unwind_frame_info *,
56 void *arg),
Jan Beulich4552d5d2006-06-26 13:57:28 +020057 void *arg);
58
59/*
60 * Unwind to previous to frame. Returns 0 if successful, negative
61 * number in case of an error.
62 */
63extern int unwind(struct unwind_frame_info *);
64
65/*
66 * Unwind until the return pointer is in user-land (or until an error
67 * occurs). Returns 0 if successful, negative number in case of
68 * error.
69 */
70extern int unwind_to_user(struct unwind_frame_info *);
71
72#else
73
74struct unwind_frame_info {};
75
76static inline void unwind_init(void) {}
Jan Beulich690a9732006-10-21 18:37:01 +020077static inline void unwind_setup(void) {}
Jan Beulich4552d5d2006-06-26 13:57:28 +020078
Jan Beulich83f4fcc2006-06-26 13:57:50 +020079#ifdef CONFIG_MODULES
80
Jan Beulich4552d5d2006-06-26 13:57:28 +020081static inline void *unwind_add_table(struct module *mod,
82 const void *table_start,
83 unsigned long table_size)
84{
85 return NULL;
86}
87
Jan Beulich83f4fcc2006-06-26 13:57:50 +020088#endif
89
Jan Beulich4552d5d2006-06-26 13:57:28 +020090static inline void unwind_remove_table(void *handle, int init_only)
91{
92}
93
94static 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
101static inline int unwind_init_blocked(struct unwind_frame_info *info,
102 struct task_struct *tsk)
103{
104 return -ENOSYS;
105}
106
107static inline int unwind_init_running(struct unwind_frame_info *info,
Jan Beulichc33bd9a2006-06-26 13:57:47 +0200108 asmlinkage int (*cb)(struct unwind_frame_info *,
109 void *arg),
Jan Beulich4552d5d2006-06-26 13:57:28 +0200110 void *arg)
111{
112 return -ENOSYS;
113}
114
115static inline int unwind(struct unwind_frame_info *info)
116{
117 return -ENOSYS;
118}
119
120static inline int unwind_to_user(struct unwind_frame_info *info)
121{
122 return -ENOSYS;
123}
124
125#endif
126
127#endif /* _LINUX_UNWIND_H */