| #ifndef _LINUX_UNWIND_H | 
 | #define _LINUX_UNWIND_H | 
 |  | 
 | /* | 
 |  * Copyright (C) 2002-2006 Novell, Inc. | 
 |  *	Jan Beulich <jbeulich@novell.com> | 
 |  * This code is released under version 2 of the GNU GPL. | 
 |  * | 
 |  * A simple API for unwinding kernel stacks.  This is used for | 
 |  * debugging and error reporting purposes.  The kernel doesn't need | 
 |  * full-blown stack unwinding with all the bells and whistles, so there | 
 |  * is not much point in implementing the full Dwarf2 unwind API. | 
 |  */ | 
 |  | 
 | struct module; | 
 |  | 
 | #ifdef CONFIG_STACK_UNWIND | 
 |  | 
 | #include <asm/unwind.h> | 
 |  | 
 | #ifndef ARCH_UNWIND_SECTION_NAME | 
 | #define ARCH_UNWIND_SECTION_NAME ".eh_frame" | 
 | #endif | 
 |  | 
 | /* | 
 |  * Initialize unwind support. | 
 |  */ | 
 | extern void unwind_init(void); | 
 | extern void unwind_setup(void); | 
 |  | 
 | #ifdef CONFIG_MODULES | 
 |  | 
 | extern void *unwind_add_table(struct module *, | 
 |                               const void *table_start, | 
 |                               unsigned long table_size); | 
 |  | 
 | extern void unwind_remove_table(void *handle, int init_only); | 
 |  | 
 | #endif | 
 |  | 
 | extern int unwind_init_frame_info(struct unwind_frame_info *, | 
 |                                   struct task_struct *, | 
 |                                   /*const*/ struct pt_regs *); | 
 |  | 
 | /* | 
 |  * Prepare to unwind a blocked task. | 
 |  */ | 
 | extern int unwind_init_blocked(struct unwind_frame_info *, | 
 |                                struct task_struct *); | 
 |  | 
 | /* | 
 |  * Prepare to unwind the currently running thread. | 
 |  */ | 
 | extern int unwind_init_running(struct unwind_frame_info *, | 
 |                                asmlinkage int (*callback)(struct unwind_frame_info *, | 
 |                                                           void *arg), | 
 |                                void *arg); | 
 |  | 
 | /* | 
 |  * Unwind to previous to frame.  Returns 0 if successful, negative | 
 |  * number in case of an error. | 
 |  */ | 
 | extern int unwind(struct unwind_frame_info *); | 
 |  | 
 | /* | 
 |  * Unwind until the return pointer is in user-land (or until an error | 
 |  * occurs).  Returns 0 if successful, negative number in case of | 
 |  * error. | 
 |  */ | 
 | extern int unwind_to_user(struct unwind_frame_info *); | 
 |  | 
 | #else | 
 |  | 
 | struct unwind_frame_info {}; | 
 |  | 
 | static inline void unwind_init(void) {} | 
 | static inline void unwind_setup(void) {} | 
 |  | 
 | #ifdef CONFIG_MODULES | 
 |  | 
 | static inline void *unwind_add_table(struct module *mod, | 
 |                                      const void *table_start, | 
 |                                      unsigned long table_size) | 
 | { | 
 | 	return NULL; | 
 | } | 
 |  | 
 | #endif | 
 |  | 
 | static inline void unwind_remove_table(void *handle, int init_only) | 
 | { | 
 | } | 
 |  | 
 | static inline int unwind_init_frame_info(struct unwind_frame_info *info, | 
 |                                          struct task_struct *tsk, | 
 |                                          const struct pt_regs *regs) | 
 | { | 
 | 	return -ENOSYS; | 
 | } | 
 |  | 
 | static inline int unwind_init_blocked(struct unwind_frame_info *info, | 
 |                                       struct task_struct *tsk) | 
 | { | 
 | 	return -ENOSYS; | 
 | } | 
 |  | 
 | static inline int unwind_init_running(struct unwind_frame_info *info, | 
 |                                       asmlinkage int (*cb)(struct unwind_frame_info *, | 
 |                                                            void *arg), | 
 |                                       void *arg) | 
 | { | 
 | 	return -ENOSYS; | 
 | } | 
 |  | 
 | static inline int unwind(struct unwind_frame_info *info) | 
 | { | 
 | 	return -ENOSYS; | 
 | } | 
 |  | 
 | static inline int unwind_to_user(struct unwind_frame_info *info) | 
 | { | 
 | 	return -ENOSYS; | 
 | } | 
 |  | 
 | #endif | 
 |  | 
 | #endif /* _LINUX_UNWIND_H */ |