libunwind_i.h revision 16b95a68caaa7e021209e2cd6a877ae1e558f740
13842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* libunwind - a platform-independent unwind library
23842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz   Copyright (C) 2008 CodeSourcery
33842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
43842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzThis file is part of libunwind.
53842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
63842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzPermission is hereby granted, free of charge, to any person obtaining
73842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitza copy of this software and associated documentation files (the
83842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz"Software"), to deal in the Software without restriction, including
93842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzwithout limitation the rights to use, copy, modify, merge, publish,
103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdistribute, sublicense, and/or sell copies of the Software, and to
113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzpermit persons to whom the Software is furnished to do so, subject to
123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzthe following conditions:
133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
143842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzThe above copyright notice and this permission notice shall be
153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzincluded in all copies or substantial portions of the Software.
163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
173842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
183842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
193842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
203842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
213842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
223842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
233842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifndef MIPS_LIBUNWIND_I_H
263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define MIPS_LIBUNWIND_I_H
273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* Target-dependent definitions that are internal to libunwind but need
293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz   to be shared with target-independent code.  */
303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include <stdlib.h>
323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include <libunwind.h>
333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#if !defined(UNW_REMOTE_ONLY) && _MIPS_SIM == _ABI64
353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# include "elf64.h"
363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else
373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# include "elf32.h"
383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif
397d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris/* ANDROID support update. */
407d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris#include "map_info.h"
417d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris/* End of ANDROID update. */
423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "mempool.h"
433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "dwarf.h"
443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
455f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuuratypedef struct
465f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura  {
475f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura    /* no mips-specific fast trace */
485f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura  }
495f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuuraunw_tdep_frame_t;
505f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura
513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstruct unw_addr_space
523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  {
533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    struct unw_accessors acc;
543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    int big_endian;
563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    mips_abi_t abi;
573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    unsigned int addr_size;
583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    unw_caching_policy_t caching_policy;
603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef HAVE_ATOMIC_OPS_H
613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    AO_t cache_generation;
623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else
633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    uint32_t cache_generation;
643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif
653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    unw_word_t dyn_generation;		/* see dyn-common.h */
663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    struct dwarf_rs_cache global_cache;
683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    struct unw_debug_frame_list *debug_frames;
697d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris    /* ANDROID support update. */
707d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris    struct map_info *map_list;
717d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris    /* End of ANDROID update. */
723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz};
733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_big_endian(as)		((as)->big_endian)
753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstruct cursor
773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  {
783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    struct dwarf_cursor dwarf;		/* must be first */
793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    unw_word_t sigcontext_addr;
803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  };
813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define DWARF_GET_LOC(l)	((l).val)
833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifndef UNW_REMOTE_ONLY
853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# if _MIPS_SIM == _ABIN32
863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitztypedef long long mips_reg_t;
873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# else
883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitztypedef long mips_reg_t;
893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# endif
903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif
913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef UNW_LOCAL_ONLY
933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_REG_LOC(l)	0
973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t) (intptr_t)	     \
983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				 tdep_uc_addr((c)->as_arg, (r)), 0))
993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
1003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t) (intptr_t)	     \
1013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				 tdep_uc_addr((c)->as_arg, (r)), 0))
1023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* FIXME: Implement these for the MIPS FPU.  */
1043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
1063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!DWARF_GET_LOC (loc))
1083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -1;
1093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  *val = *(unw_fpreg_t *) (intptr_t) DWARF_GET_LOC (loc);
1103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
1153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!DWARF_GET_LOC (loc))
1173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -1;
1183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  *(unw_fpreg_t *) (intptr_t) DWARF_GET_LOC (loc) = val;
1193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
1243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!DWARF_GET_LOC (loc))
1263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -1;
1273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  *val = *(mips_reg_t *) (intptr_t) DWARF_GET_LOC (loc);
1283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
1333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!DWARF_GET_LOC (loc))
1353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -1;
1363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  *(mips_reg_t *) (intptr_t) DWARF_GET_LOC (loc) = val;
1373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else /* !UNW_LOCAL_ONLY */
1413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC_TYPE_FP	(1 << 0)
1423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC_TYPE_REG	(1 << 1)
1433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
1443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_NULL_LOC(l)						\
1453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
1463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
1473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
1483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
1493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
1503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
1513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
1523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz						| DWARF_LOC_TYPE_FP))
1533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzread_s32 (struct dwarf_cursor *c, unw_word_t addr, unw_word_t *val)
1563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  int offset = addr & 4;
1583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  int ret;
1593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_word_t memval;
1603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  ret = (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 0, c->as_arg);
1623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (ret < 0)
1633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return ret;
1643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if ((offset != 0) == tdep_big_endian (c->as))
1663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    *val = (int32_t) memval;
1673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    *val = (int32_t) (memval >> 32);
1693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzwrite_s32 (struct dwarf_cursor *c, unw_word_t addr, const unw_word_t *val)
1753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  int offset = addr & 4;
1773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  int ret;
1783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_word_t memval;
1793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  ret = (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 0, c->as_arg);
1813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (ret < 0)
1823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return ret;
1833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if ((offset != 0) == tdep_big_endian (c->as))
1853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    memval = (memval & ~0xffffffffLL) | (uint32_t) *val;
1863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    memval = (memval & 0xffffffffLL) | (uint32_t) (*val << 32);
1883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 1, c->as_arg);
1903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* FIXME: Implement these for the MIPS FPU.  */
1933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
1943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
1953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  char *valp = (char *) &val;
1973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_word_t addr;
1983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  int ret;
1993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_NULL_LOC (loc))
2013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -UNW_EBADREG;
2023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_REG_LOC (loc))
2043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
2053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				       val, 0, c->as_arg);
2063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  addr = DWARF_GET_LOC (loc);
2083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
2093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				       0, c->as_arg)) < 0)
2103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return ret;
2113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
2133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				   c->as_arg);
2143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
2173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
2183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
2193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  char *valp = (char *) &val;
2203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_word_t addr;
2213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  int ret;
2223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_NULL_LOC (loc))
2243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -UNW_EBADREG;
2253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_REG_LOC (loc))
2273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
2283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				       &val, 1, c->as_arg);
2293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  addr = DWARF_GET_LOC (loc);
2313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
2323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				       1, c->as_arg)) < 0)
2333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return ret;
2343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
2363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				   1, c->as_arg);
2373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
2403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
2413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
2423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_NULL_LOC (loc))
2433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -UNW_EBADREG;
2443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  /* If a code-generator were to save a value of type unw_word_t in a
2463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     floating-point register, we would have to support this case.  I
2473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     suppose it could happen with MMX registers, but does it really
2483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     happen?  */
2493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  assert (!DWARF_IS_FP_LOC (loc));
2503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_REG_LOC (loc))
2523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
2533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				     0, c->as_arg);
2543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else if (c->as->abi == UNW_MIPS_ABI_O32)
2553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return read_s32 (c, DWARF_GET_LOC (loc), val);
2563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
2573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
2583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				     0, c->as_arg);
2593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int
2623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
2633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
2643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_NULL_LOC (loc))
2653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return -UNW_EBADREG;
2663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  /* If a code-generator were to save a value of type unw_word_t in a
2683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     floating-point register, we would have to support this case.  I
2693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     suppose it could happen with MMX registers, but does it really
2703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz     happen?  */
2713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  assert (!DWARF_IS_FP_LOC (loc));
2723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (DWARF_IS_REG_LOC (loc))
2743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
2753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				     1, c->as_arg);
2763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else if (c->as->abi == UNW_MIPS_ABI_O32)
2773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return write_s32 (c, DWARF_GET_LOC (loc), &val);
2783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
2793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
2803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				     1, c->as_arg);
2813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif /* !UNW_LOCAL_ONLY */
2843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
285e2962af9d31266761700b431da894421c0d757ecArun Sharma#define tdep_getcontext_trace           unw_getcontext
2865d0f376b08126b51a001d7cdfba1ec4e0d644f54Tommi Rantala#define tdep_init_done			UNW_OBJ(init_done)
2873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_init			UNW_OBJ(init)
2883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* Platforms that support UNW_INFO_FORMAT_TABLE need to define
2893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz   tdep_search_unwind_table.  */
2903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_search_unwind_table	dwarf_search_unwind_table
291d93d96ad833390519ea68a2df22dd55dd26a3214Martin Milata#define tdep_find_unwind_table		dwarf_find_unwind_table
2923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
2933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
2943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_access_reg			UNW_OBJ(access_reg)
2953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
296dac2d001afb1fa7040ca7d8ae57032f684d7023eLassi Tuura#define tdep_fetch_frame(c,ip,n)	do {} while(0)
297dac2d001afb1fa7040ca7d8ae57032f684d7023eLassi Tuura#define tdep_cache_frame(c,rs)		do {} while(0)
298dac2d001afb1fa7040ca7d8ae57032f684d7023eLassi Tuura#define tdep_reuse_frame(c,rs)		do {} while(0)
2999e98f15e9aee12e67cd5956d06ccb559f6a06213Lassi Tuura#define tdep_stash_frame(c,rs)		do {} while(0)
3005f38f35d5d6c78aafa6da20845d9ceff74af00f8Lassi Tuura#define tdep_trace(cur,addr,n)		(-UNW_ENOINFO)
3013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
3023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef UNW_LOCAL_ONLY
3033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_find_proc_info(c,ip,n)				\
3043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
3053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				       (c)->as_arg)
3063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_put_unwind_info(as,pi,arg)		\
3073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	dwarf_put_unwind_info((as), (pi), (arg))
3083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else
3093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_find_proc_info(c,ip,n)					\
3103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
3113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				       (c)->as_arg)
3123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_put_unwind_info(as,pi,arg)		\
3133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
3143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif
3153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
3163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_as(c)			((c)->dwarf.as)
3173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
3183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_ip(c)			((c)->dwarf.ip)
3193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
3205d0f376b08126b51a001d7cdfba1ec4e0d644f54Tommi Rantalaextern int tdep_init_done;
3213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
3223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern void tdep_init (void);
3233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
3243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				     unw_dyn_info_t *di, unw_proc_info_t *pi,
3253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz				     int need_unwind_info, void *arg);
3263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern void *tdep_uc_addr (ucontext_t *uc, int reg);
32716b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris/* ANDROID support update. */
32816b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferrisextern struct map_info *tdep_get_elf_image (unw_addr_space_t as, pid_t pid,
32916b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris					    unw_word_t ip);
33016b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris/* End of ANDROID update. */
3313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
3323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz			    unw_word_t *valp, int write);
3333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
3343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz			      unw_fpreg_t *valp, int write);
3353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
3363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif /* MIPS_LIBUNWIND_I_H */
337