1/* libunwind - a platform-independent unwind library 2 Copyright (C) 2001-2004 Hewlett-Packard Co 3 Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4 5This file is part of libunwind. 6 7Permission is hereby granted, free of charge, to any person obtaining 8a copy of this software and associated documentation files (the 9"Software"), to deal in the Software without restriction, including 10without limitation the rights to use, copy, modify, merge, publish, 11distribute, sublicense, and/or sell copies of the Software, and to 12permit persons to whom the Software is furnished to do so, subject to 13the following conditions: 14 15The above copyright notice and this permission notice shall be 16included in all copies or substantial portions of the Software. 17 18THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 25 26#define UNW_VERSION_MAJOR @PKG_MAJOR@ 27#define UNW_VERSION_MINOR @PKG_MINOR@ 28#define UNW_VERSION_EXTRA @PKG_EXTRA@ 29 30#define UNW_VERSION_CODE(maj,min) (((maj) << 16) | (min)) 31#define UNW_VERSION UNW_VERSION_CODE(UNW_VERSION_MAJOR, UNW_VERSION_MINOR) 32 33#define UNW_PASTE2(x,y) x##y 34#define UNW_PASTE(x,y) UNW_PASTE2(x,y) 35#define UNW_OBJ(fn) UNW_PASTE(UNW_PREFIX, fn) 36#define UNW_ARCH_OBJ(fn) UNW_PASTE(UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_), fn) 37 38#ifdef UNW_LOCAL_ONLY 39# define UNW_PREFIX UNW_PASTE(UNW_PASTE(_UL,UNW_TARGET),_) 40#else /* !UNW_LOCAL_ONLY */ 41# define UNW_PREFIX UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_) 42#endif /* !UNW_LOCAL_ONLY */ 43 44/* Error codes. The unwind routines return the *negated* values of 45 these error codes on error and a non-negative value on success. */ 46typedef enum 47 { 48 UNW_ESUCCESS = 0, /* no error */ 49 UNW_EUNSPEC, /* unspecified (general) error */ 50 UNW_ENOMEM, /* out of memory */ 51 UNW_EBADREG, /* bad register number */ 52 UNW_EREADONLYREG, /* attempt to write read-only register */ 53 UNW_ESTOPUNWIND, /* stop unwinding */ 54 UNW_EINVALIDIP, /* invalid IP */ 55 UNW_EBADFRAME, /* bad frame */ 56 UNW_EINVAL, /* unsupported operation or bad value */ 57 UNW_EBADVERSION, /* unwind info has unsupported version */ 58 UNW_ENOINFO /* no unwind info found */ 59 } 60unw_error_t; 61 62/* The following enum defines the indices for a couple of 63 (pseudo-)registers which have the same meaning across all 64 platforms. (RO) means read-only. (RW) means read-write. General 65 registers (aka "integer registers") are expected to start with 66 index 0. The number of such registers is architecture-dependent. 67 The remaining indices can be used as an architecture sees fit. The 68 last valid register index is given by UNW_REG_LAST. */ 69typedef enum 70 { 71 UNW_REG_IP = UNW_TDEP_IP, /* (rw) instruction pointer (pc) */ 72 UNW_REG_SP = UNW_TDEP_SP, /* (ro) stack pointer */ 73 UNW_REG_EH = UNW_TDEP_EH, /* (rw) exception-handling reg base */ 74 UNW_REG_LAST = UNW_TDEP_LAST_REG 75 } 76unw_frame_regnum_t; 77 78/* Number of exception-handler argument registers: */ 79#define UNW_NUM_EH_REGS UNW_TDEP_NUM_EH_REGS 80 81typedef enum 82 { 83 UNW_CACHE_NONE, /* no caching */ 84 UNW_CACHE_GLOBAL, /* shared global cache */ 85 UNW_CACHE_PER_THREAD /* per-thread caching */ 86 } 87unw_caching_policy_t; 88 89typedef int unw_regnum_t; 90 91/* The unwind cursor starts at the youngest (most deeply nested) frame 92 and is used to track the frame state as the unwinder steps from 93 frame to frame. It is safe to make (shallow) copies of variables 94 of this type. */ 95typedef struct unw_cursor 96 { 97 unw_word_t opaque[UNW_TDEP_CURSOR_LEN]; 98 } 99unw_cursor_t; 100 101/* This type encapsulates the entire (preserved) machine-state. */ 102typedef unw_tdep_context_t unw_context_t; 103 104/* unw_getcontext() fills the unw_context_t pointed to by UC with the 105 machine state as it exists at the call-site. For implementation 106 reasons, this needs to be a target-dependent macro. It's easiest 107 to think of unw_getcontext() as being identical to getcontext(). */ 108#define unw_getcontext(uc) unw_tdep_getcontext(uc) 109 110/* Return 1 if register number R is a floating-point register, zero 111 otherwise. 112 This routine is signal-safe. */ 113#define unw_is_fpreg(r) unw_tdep_is_fpreg(r) 114 115typedef unw_tdep_fpreg_t unw_fpreg_t; 116 117typedef struct unw_addr_space *unw_addr_space_t; 118 119/* Each target may define it's own set of flags, but bits 0-15 are 120 reserved for general libunwind-use. */ 121#define UNW_PI_FLAG_FIRST_TDEP_BIT 16 122/* The information comes from a .debug_frame section. */ 123#define UNW_PI_FLAG_DEBUG_FRAME 32 124 125typedef struct unw_proc_info 126 { 127 unw_word_t start_ip; /* first IP covered by this procedure */ 128 unw_word_t end_ip; /* first IP NOT covered by this procedure */ 129 unw_word_t lsda; /* address of lang.-spec. data area (if any) */ 130 unw_word_t handler; /* optional personality routine */ 131 unw_word_t gp; /* global-pointer value for this procedure */ 132 unw_word_t flags; /* misc. flags */ 133 134 int format; /* unwind-info format (arch-specific) */ 135 int unwind_info_size; /* size of the information (if applicable) */ 136 void *unwind_info; /* unwind-info (arch-specific) */ 137 unw_tdep_proc_info_t extra; /* target-dependent auxiliary proc-info */ 138 } 139unw_proc_info_t; 140 141/* These are backend callback routines that provide access to the 142 state of a "remote" process. This can be used, for example, to 143 unwind another process through the ptrace() interface. */ 144typedef struct unw_accessors 145 { 146 /* Look up the unwind info associated with instruction-pointer IP. 147 On success, the routine fills in the PROC_INFO structure. */ 148 int (*find_proc_info) (unw_addr_space_t, unw_word_t, unw_proc_info_t *, 149 int, void *); 150 151 /* Release any resources (e.g., memory) that were allocated for 152 the unwind info returned in by a previous call to 153 find_proc_info() with NEED_UNWIND_INFO set to 1. */ 154 void (*put_unwind_info) (unw_addr_space_t, unw_proc_info_t *, void *); 155 156 /* Return the list-head of the dynamically registered unwind 157 info. */ 158 int (*get_dyn_info_list_addr) (unw_addr_space_t, unw_word_t *, void *); 159 160 /* Access aligned word at address ADDR. The value is returned 161 according to the endianness of the host (e.g., if the host is 162 little-endian and the target is big-endian, access_mem() needs 163 to byte-swap the value before returning it). */ 164 int (*access_mem) (unw_addr_space_t, unw_word_t, unw_word_t *, int, 165 void *); 166 167 /* Access register number REG at address ADDR. */ 168 int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *, int, 169 void *); 170 171 /* Access register number REG at address ADDR. */ 172 int (*access_fpreg) (unw_addr_space_t, unw_regnum_t, 173 unw_fpreg_t *, int, void *); 174 175 int (*resume) (unw_addr_space_t, unw_cursor_t *, void *); 176 177 /* Optional call back to obtain the name of a (static) procedure. 178 Dynamically generated procedures are handled automatically by 179 libunwind. This callback is optional and may be set to 180 NULL. */ 181 int (*get_proc_name) (unw_addr_space_t, unw_word_t, char *, size_t, 182 unw_word_t *, void *); 183 } 184unw_accessors_t; 185 186typedef enum unw_save_loc_type 187 { 188 UNW_SLT_NONE, /* register is not saved ("not an l-value") */ 189 UNW_SLT_MEMORY, /* register has been saved in memory */ 190 UNW_SLT_REG /* register has been saved in (another) register */ 191 } 192unw_save_loc_type_t; 193 194typedef struct unw_save_loc 195 { 196 unw_save_loc_type_t type; 197 union 198 { 199 unw_word_t addr; /* valid if type==UNW_SLT_MEMORY */ 200 unw_regnum_t regnum; /* valid if type==UNW_SLT_REG */ 201 } 202 u; 203 unw_tdep_save_loc_t extra; /* target-dependent additional information */ 204 } 205unw_save_loc_t; 206 207/* These routines work both for local and remote unwinding. */ 208 209#define unw_local_addr_space UNW_OBJ(local_addr_space) 210#define unw_create_addr_space UNW_OBJ(create_addr_space) 211#define unw_destroy_addr_space UNW_OBJ(destroy_addr_space) 212#define unw_get_accessors UNW_ARCH_OBJ(get_accessors) 213#define unw_init_local UNW_OBJ(init_local) 214#define unw_init_remote UNW_OBJ(init_remote) 215#define unw_step UNW_OBJ(step) 216#define unw_resume UNW_OBJ(resume) 217#define unw_get_proc_info UNW_OBJ(get_proc_info) 218#define unw_get_proc_info_by_ip UNW_OBJ(get_proc_info_by_ip) 219#define unw_get_reg UNW_OBJ(get_reg) 220#define unw_set_reg UNW_OBJ(set_reg) 221#define unw_get_fpreg UNW_OBJ(get_fpreg) 222#define unw_set_fpreg UNW_OBJ(set_fpreg) 223#define unw_get_save_loc UNW_OBJ(get_save_loc) 224#define unw_is_signal_frame UNW_OBJ(is_signal_frame) 225#define unw_handle_signal_frame UNW_OBJ(handle_signal_frame) 226#define unw_get_proc_name UNW_OBJ(get_proc_name) 227#define unw_set_caching_policy UNW_OBJ(set_caching_policy) 228#define unw_regname UNW_ARCH_OBJ(regname) 229#define unw_flush_cache UNW_ARCH_OBJ(flush_cache) 230#define unw_strerror UNW_ARCH_OBJ(strerror) 231 232extern unw_addr_space_t unw_create_addr_space (unw_accessors_t *, int); 233extern void unw_destroy_addr_space (unw_addr_space_t); 234extern unw_accessors_t *unw_get_accessors (unw_addr_space_t); 235extern void unw_flush_cache (unw_addr_space_t, unw_word_t, unw_word_t); 236extern int unw_set_caching_policy (unw_addr_space_t, unw_caching_policy_t); 237extern const char *unw_regname (unw_regnum_t); 238 239extern int unw_init_local (unw_cursor_t *, unw_context_t *); 240extern int unw_init_remote (unw_cursor_t *, unw_addr_space_t, void *); 241extern int unw_step (unw_cursor_t *); 242extern int unw_resume (unw_cursor_t *); 243extern int unw_get_proc_info (unw_cursor_t *, unw_proc_info_t *); 244extern int unw_get_proc_info_by_ip (unw_addr_space_t, unw_word_t, 245 unw_proc_info_t *, void *); 246extern int unw_get_reg (unw_cursor_t *, int, unw_word_t *); 247extern int unw_set_reg (unw_cursor_t *, int, unw_word_t); 248extern int unw_get_fpreg (unw_cursor_t *, int, unw_fpreg_t *); 249extern int unw_set_fpreg (unw_cursor_t *, int, unw_fpreg_t); 250extern int unw_get_save_loc (unw_cursor_t *, int, unw_save_loc_t *); 251extern int unw_is_signal_frame (unw_cursor_t *); 252extern int unw_handle_signal_frame (unw_cursor_t *); 253extern int unw_get_proc_name (unw_cursor_t *, char *, size_t, unw_word_t *); 254extern const char *unw_strerror (int); 255extern int unw_backtrace (void **, int); 256 257extern unw_addr_space_t unw_local_addr_space; 258