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/* ANDROID support update. */
27#include <sys/types.h>
28/* End of ANDROID update. */
29
30#define UNW_VERSION_MAJOR	1
31#define UNW_VERSION_MINOR	1
32#define UNW_VERSION_EXTRA
33
34#define UNW_VERSION_CODE(maj,min)	(((maj) << 16) | (min))
35#define UNW_VERSION	UNW_VERSION_CODE(UNW_VERSION_MAJOR, UNW_VERSION_MINOR)
36
37#define UNW_PASTE2(x,y)	x##y
38#define UNW_PASTE(x,y)	UNW_PASTE2(x,y)
39#define UNW_OBJ(fn)	UNW_PASTE(UNW_PREFIX, fn)
40#define UNW_ARCH_OBJ(fn) UNW_PASTE(UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_), fn)
41
42#ifdef UNW_LOCAL_ONLY
43# ifdef UNW_ADDITIONAL_PREFIX
44#  define UNW_PREFIX	UNW_PASTE(UNW_PASTE(_UUL,UNW_TARGET),_)
45# else
46#  define UNW_PREFIX	UNW_PASTE(UNW_PASTE(_UL,UNW_TARGET),_)
47# endif
48#else /* !UNW_LOCAL_ONLY */
49# ifdef UNW_ADDITIONAL_PREFIX
50#  define UNW_PREFIX	UNW_PASTE(UNW_PASTE(_UU,UNW_TARGET),_)
51# else
52#  define UNW_PREFIX	UNW_PASTE(UNW_PASTE(_U,UNW_TARGET),_)
53# endif
54#endif /* !UNW_LOCAL_ONLY */
55
56/* Error codes.  The unwind routines return the *negated* values of
57   these error codes on error and a non-negative value on success.  */
58typedef enum
59  {
60    UNW_ESUCCESS = 0,		/* no error */
61    UNW_EUNSPEC,		/* unspecified (general) error */
62    UNW_ENOMEM,			/* out of memory */
63    UNW_EBADREG,		/* bad register number */
64    UNW_EREADONLYREG,		/* attempt to write read-only register */
65    UNW_ESTOPUNWIND,		/* stop unwinding */
66    UNW_EINVALIDIP,		/* invalid IP */
67    UNW_EBADFRAME,		/* bad frame */
68    UNW_EINVAL,			/* unsupported operation or bad value */
69    UNW_EBADVERSION,		/* unwind info has unsupported version */
70    UNW_ENOINFO			/* no unwind info found */
71  }
72unw_error_t;
73
74/* The following enum defines the indices for a couple of
75   (pseudo-)registers which have the same meaning across all
76   platforms.  (RO) means read-only.  (RW) means read-write.  General
77   registers (aka "integer registers") are expected to start with
78   index 0.  The number of such registers is architecture-dependent.
79   The remaining indices can be used as an architecture sees fit.  The
80   last valid register index is given by UNW_REG_LAST.  */
81typedef enum
82  {
83    UNW_REG_IP = UNW_TDEP_IP,		/* (rw) instruction pointer (pc) */
84    UNW_REG_SP = UNW_TDEP_SP,		/* (ro) stack pointer */
85    UNW_REG_EH = UNW_TDEP_EH,		/* (rw) exception-handling reg base */
86    UNW_REG_LAST = UNW_TDEP_LAST_REG
87  }
88unw_frame_regnum_t;
89
90/* Number of exception-handler argument registers: */
91#define UNW_NUM_EH_REGS		UNW_TDEP_NUM_EH_REGS
92
93typedef enum
94  {
95    UNW_CACHE_NONE,			/* no caching */
96    UNW_CACHE_GLOBAL,			/* shared global cache */
97    UNW_CACHE_PER_THREAD		/* per-thread caching */
98  }
99unw_caching_policy_t;
100
101typedef int unw_regnum_t;
102
103/* The unwind cursor starts at the youngest (most deeply nested) frame
104   and is used to track the frame state as the unwinder steps from
105   frame to frame.  It is safe to make (shallow) copies of variables
106   of this type.  */
107typedef struct unw_cursor
108  {
109    unw_word_t opaque[UNW_TDEP_CURSOR_LEN];
110  }
111unw_cursor_t;
112
113/* This type encapsulates the entire (preserved) machine-state.  */
114typedef unw_tdep_context_t unw_context_t;
115
116/* unw_getcontext() fills the unw_context_t pointed to by UC with the
117   machine state as it exists at the call-site.  For implementation
118   reasons, this needs to be a target-dependent macro.  It's easiest
119   to think of unw_getcontext() as being identical to getcontext(). */
120#define unw_getcontext(uc)		unw_tdep_getcontext(uc)
121
122/* Return 1 if register number R is a floating-point register, zero
123   otherwise.
124   This routine is signal-safe.  */
125#define unw_is_fpreg(r)			unw_tdep_is_fpreg(r)
126
127typedef unw_tdep_fpreg_t unw_fpreg_t;
128
129typedef struct unw_addr_space *unw_addr_space_t;
130
131/* Each target may define it's own set of flags, but bits 0-15 are
132   reserved for general libunwind-use.  */
133#define UNW_PI_FLAG_FIRST_TDEP_BIT	16
134/* The information comes from a .debug_frame section.  */
135#define UNW_PI_FLAG_DEBUG_FRAME	32
136
137typedef struct unw_proc_info
138  {
139    unw_word_t start_ip;	/* first IP covered by this procedure */
140    unw_word_t end_ip;		/* first IP NOT covered by this procedure */
141    unw_word_t lsda;		/* address of lang.-spec. data area (if any) */
142    unw_word_t handler;		/* optional personality routine */
143    unw_word_t gp;		/* global-pointer value for this procedure */
144    unw_word_t flags;		/* misc. flags */
145
146    int format;			/* unwind-info format (arch-specific) */
147    int unwind_info_size;	/* size of the information (if applicable) */
148    void *unwind_info;		/* unwind-info (arch-specific) */
149    unw_tdep_proc_info_t extra;	/* target-dependent auxiliary proc-info */
150  }
151unw_proc_info_t;
152
153/* These are backend callback routines that provide access to the
154   state of a "remote" process.  This can be used, for example, to
155   unwind another process through the ptrace() interface.  */
156typedef struct unw_accessors
157  {
158    /* Look up the unwind info associated with instruction-pointer IP.
159       On success, the routine fills in the PROC_INFO structure.  */
160    int (*find_proc_info) (unw_addr_space_t, unw_word_t, unw_proc_info_t *,
161			   int, void *);
162
163    /* Release any resources (e.g., memory) that were allocated for
164       the unwind info returned in by a previous call to
165       find_proc_info() with NEED_UNWIND_INFO set to 1.  */
166    void (*put_unwind_info) (unw_addr_space_t, unw_proc_info_t *, void *);
167
168    /* Return the list-head of the dynamically registered unwind
169       info.  */
170    int (*get_dyn_info_list_addr) (unw_addr_space_t, unw_word_t *, void *);
171
172    /* Access aligned word at address ADDR.  The value is returned
173       according to the endianness of the host (e.g., if the host is
174       little-endian and the target is big-endian, access_mem() needs
175       to byte-swap the value before returning it).  */
176    int (*access_mem) (unw_addr_space_t, unw_word_t, unw_word_t *, int,
177		       void *);
178
179    /* Access register number REG at address ADDR.  */
180    int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *, int,
181		       void *);
182
183    /* Access register number REG at address ADDR.  */
184    int (*access_fpreg) (unw_addr_space_t, unw_regnum_t,
185			 unw_fpreg_t *, int, void *);
186
187    int (*resume) (unw_addr_space_t, unw_cursor_t *, void *);
188
189    /* Optional call back to obtain the name of a (static) procedure.
190       Dynamically generated procedures are handled automatically by
191       libunwind.  This callback is optional and may be set to
192       NULL.  */
193    int (*get_proc_name) (unw_addr_space_t, unw_word_t, char *, size_t,
194			  unw_word_t *, void *);
195  }
196unw_accessors_t;
197
198typedef enum unw_save_loc_type
199  {
200    UNW_SLT_NONE,	/* register is not saved ("not an l-value") */
201    UNW_SLT_MEMORY,	/* register has been saved in memory */
202    UNW_SLT_REG		/* register has been saved in (another) register */
203  }
204unw_save_loc_type_t;
205
206typedef struct unw_save_loc
207  {
208    unw_save_loc_type_t type;
209    union
210      {
211	unw_word_t addr;	/* valid if type==UNW_SLT_MEMORY */
212	unw_regnum_t regnum;	/* valid if type==UNW_SLT_REG */
213      }
214    u;
215    unw_tdep_save_loc_t extra;	/* target-dependent additional information */
216  }
217unw_save_loc_t;
218
219/* ANDROID support update. */
220typedef struct unw_map_cursor
221  {
222    void *map_list;
223    void *cur_map;
224  }
225unw_map_cursor_t;
226
227typedef struct unw_map
228  {
229    unw_word_t start;
230    unw_word_t end;
231    unw_word_t offset;
232    unw_word_t load_base;
233    char *path;
234    int flags;
235  }
236unw_map_t;
237/* End of ANDROID update. */
238
239/* These routines work both for local and remote unwinding.  */
240
241#define unw_local_access_addr_space_init UNW_OBJ(local_access_addr_space_init)
242#define unw_local_addr_space	UNW_OBJ(local_addr_space)
243#define unw_create_addr_space	UNW_OBJ(create_addr_space)
244#define unw_destroy_addr_space	UNW_OBJ(destroy_addr_space)
245#define unw_get_accessors	UNW_ARCH_OBJ(get_accessors)
246#define unw_init_local		UNW_OBJ(init_local)
247#define unw_init_remote		UNW_OBJ(init_remote)
248#define unw_step		UNW_OBJ(step)
249#define unw_resume		UNW_OBJ(resume)
250#define unw_get_proc_info	UNW_OBJ(get_proc_info)
251#define unw_get_proc_info_by_ip	UNW_OBJ(get_proc_info_by_ip)
252#define unw_get_reg		UNW_OBJ(get_reg)
253#define unw_set_reg		UNW_OBJ(set_reg)
254#define unw_get_fpreg		UNW_OBJ(get_fpreg)
255#define unw_set_fpreg		UNW_OBJ(set_fpreg)
256#define unw_get_save_loc	UNW_OBJ(get_save_loc)
257#define unw_is_signal_frame	UNW_OBJ(is_signal_frame)
258#define unw_handle_signal_frame	UNW_OBJ(handle_signal_frame)
259#define unw_get_proc_name	UNW_OBJ(get_proc_name)
260#define unw_get_proc_name_by_ip	UNW_OBJ(get_proc_name_by_ip)
261#define unw_set_caching_policy	UNW_OBJ(set_caching_policy)
262#define unw_regname		UNW_ARCH_OBJ(regname)
263#define unw_flush_cache		UNW_ARCH_OBJ(flush_cache)
264#define unw_strerror		UNW_ARCH_OBJ(strerror)
265
266extern void unw_local_access_addr_space_init (unw_addr_space_t);
267extern unw_addr_space_t unw_create_addr_space (unw_accessors_t *, int);
268extern void unw_destroy_addr_space (unw_addr_space_t);
269extern unw_accessors_t *unw_get_accessors (unw_addr_space_t);
270extern void unw_flush_cache (unw_addr_space_t, unw_word_t, unw_word_t);
271extern int unw_set_caching_policy (unw_addr_space_t, unw_caching_policy_t);
272extern const char *unw_regname (unw_regnum_t);
273
274extern int unw_init_local (unw_cursor_t *, unw_context_t *);
275extern int unw_init_remote (unw_cursor_t *, unw_addr_space_t, void *);
276extern int unw_step (unw_cursor_t *);
277extern int unw_resume (unw_cursor_t *);
278extern int unw_get_proc_info (unw_cursor_t *, unw_proc_info_t *);
279extern int unw_get_proc_info_by_ip (unw_addr_space_t, unw_word_t,
280				    unw_proc_info_t *, void *);
281extern int unw_get_reg (unw_cursor_t *, int, unw_word_t *);
282extern int unw_set_reg (unw_cursor_t *, int, unw_word_t);
283extern int unw_get_fpreg (unw_cursor_t *, int, unw_fpreg_t *);
284extern int unw_set_fpreg (unw_cursor_t *, int, unw_fpreg_t);
285extern int unw_get_save_loc (unw_cursor_t *, int, unw_save_loc_t *);
286extern int unw_is_signal_frame (unw_cursor_t *);
287extern int unw_handle_signal_frame (unw_cursor_t *);
288extern int unw_get_proc_name (unw_cursor_t *, char *, size_t, unw_word_t *);
289extern int unw_get_proc_name_by_ip (unw_addr_space_t, unw_word_t, char *,
290				    size_t, unw_word_t *, void *);
291extern const char *unw_strerror (int);
292extern int unw_backtrace (void **, int);
293
294/* ANDROID support update. */
295extern int unw_map_local_cursor_valid (unw_map_cursor_t *);
296extern void unw_map_local_cursor_get (unw_map_cursor_t *);
297extern int unw_map_local_cursor_get_next (unw_map_cursor_t *, unw_map_t *);
298extern int unw_map_local_create (void);
299extern void unw_map_local_destroy (void);
300extern void unw_map_set (unw_addr_space_t, unw_map_cursor_t *);
301extern void unw_map_cursor_reset (unw_map_cursor_t *);
302extern void unw_map_cursor_clear (unw_map_cursor_t *);
303extern int unw_map_cursor_create (unw_map_cursor_t *, pid_t);
304extern void unw_map_cursor_destroy (unw_map_cursor_t *);
305extern int unw_map_cursor_get_next (unw_map_cursor_t *, unw_map_t *);
306/* End of ANDROID update. */
307
308extern unw_addr_space_t unw_local_addr_space;
309