at v2.6.19 127 lines 3.3 kB view raw
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 15struct 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); 29extern void unwind_setup(void); 30 31#ifdef CONFIG_MODULES 32 33extern 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 39#endif 40 41extern 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 *, 55 asmlinkage int (*callback)(struct unwind_frame_info *, 56 void *arg), 57 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) {} 77static inline void unwind_setup(void) {} 78 79#ifdef CONFIG_MODULES 80 81static 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 90static 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, 108 asmlinkage int (*cb)(struct unwind_frame_info *, 109 void *arg), 110 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 */