18d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* libunwind - a platform-independent unwind library
28d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   Copyright (C) 2008 CodeSourcery
38d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
48d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
58d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThis file is part of libunwind.
68d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
78d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPermission is hereby granted, free of charge, to any person obtaining
88d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaa copy of this software and associated documentation files (the
98d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala"Software"), to deal in the Software without restriction, including
108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalawithout limitation the rights to use, copy, modify, merge, publish,
118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladistribute, sublicense, and/or sell copies of the Software, and to
128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalapermit persons to whom the Software is furnished to do so, subject to
138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalathe following conditions:
148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThe above copyright notice and this permission notice shall be
168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaincluded in all copies or substantial portions of the Software.
178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifndef SH_LIBUNWIND_I_H
278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define SH_LIBUNWIND_I_H
288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* Target-dependent definitions that are internal to libunwind but need
308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   to be shared with target-independent code.  */
318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include <stdlib.h>
338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include <libunwind.h>
348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "elf32.h"
367d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris/* ANDROID support update. */
377d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris#include "map_info.h"
387d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris/* End of ANDROID update. */
398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "mempool.h"
408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "dwarf.h"
418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalatypedef struct
438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  {
448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    /* no sh-specific fast trace */
458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  }
468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaunw_tdep_frame_t;
478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastruct unw_addr_space
498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  {
508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    struct unw_accessors acc;
518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    int big_endian;
528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    unw_caching_policy_t caching_policy;
538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef HAVE_ATOMIC_OPS_H
548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    AO_t cache_generation;
558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else
568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    uint32_t cache_generation;
578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif
588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    unw_word_t dyn_generation;		/* see dyn-common.h */
598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    unw_word_t dyn_info_list_addr;	/* (cached) dyn_info_list_addr */
608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    struct dwarf_rs_cache global_cache;
618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    struct unw_debug_frame_list *debug_frames;
627d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris    /* ANDROID support update. */
637d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris    struct map_info *map_list;
647d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris    /* End of ANDROID update. */
658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  };
668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastruct cursor
688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  {
698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    struct dwarf_cursor dwarf;		/* must be first */
708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    enum
718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      {
728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala        SH_SCF_NONE,                   /* no signal frame */
738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala        SH_SCF_LINUX_SIGFRAME,         /* non-RT signal frame */
748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala        SH_SCF_LINUX_RT_SIGFRAME,      /* RT signal frame */
758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala      }
768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    sigcontext_format;
778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    unw_word_t sigcontext_addr;
788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    unw_word_t sigcontext_sp;
798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    unw_word_t sigcontext_pc;
808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  };
818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define DWARF_GET_LOC(l)	((l).val)
838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef UNW_LOCAL_ONLY
858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_NULL_LOC(l)	(DWARF_GET_LOC (l) == 0)
878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r) })
888d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_REG_LOC(l)	0
898d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_REG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
908d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				 tdep_uc_addr((c)->as_arg, (r)), 0))
918d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
928d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_FPREG_LOC(c,r)	(DWARF_LOC((unw_word_t)			     \
938d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				 tdep_uc_addr((c)->as_arg, (r)), 0))
948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
98f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */
99f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  unw_fpreg_t *addr = (unw_fpreg_t *) DWARF_GET_LOC (loc);
100f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  if (!addr || !map_local_is_readable ((unw_word_t) addr))
1018d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -1;
102f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris
103f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  *val = *addr;
1048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
105f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */
1068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1078d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1088d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
1098d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
1108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
111f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */
112f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  unw_fpreg_t *addr = (unw_fpreg_t *) DWARF_GET_LOC (loc);
113f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  if (!addr || !map_local_is_writable ((unw_word_t) addr))
1148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -1;
115f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris
116f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  *addr = val;
1178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return 0;
118f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */
1198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
1228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
1238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
124f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */
1258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (!DWARF_GET_LOC (loc))
1268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -1;
127f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
128f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris				   0, c->as_arg);
129f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */
1308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
1338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
1348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
135f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */
1368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (!DWARF_GET_LOC (loc))
1378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -1;
138f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris  return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
139f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris				   1, c->as_arg);
140f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */
1418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else /* !UNW_LOCAL_ONLY */
1448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC_TYPE_FP	(1 << 0)
1458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC_TYPE_REG	(1 << 1)
1468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_NULL_LOC		DWARF_LOC (0, 0)
1478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_NULL_LOC(l)						\
1488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala		({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; })
1498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC(r, t)	((dwarf_loc_t) { .val = (r), .type = (t) })
1508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_REG_LOC(l)	(((l).type & DWARF_LOC_TYPE_REG) != 0)
1518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_FP_LOC(l)	(((l).type & DWARF_LOC_TYPE_FP) != 0)
1528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_REG_LOC(c,r)	DWARF_LOC((r), DWARF_LOC_TYPE_REG)
1538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_MEM_LOC(c,m)	DWARF_LOC ((m), 0)
1548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_FPREG_LOC(c,r)	DWARF_LOC((r), (DWARF_LOC_TYPE_REG	\
1558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala						| DWARF_LOC_TYPE_FP))
1568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
1588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val)
1598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
1608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  char *valp = (char *) &val;
1618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_word_t addr;
1628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  int ret;
1638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_NULL_LOC (loc))
1658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -UNW_EBADREG;
1668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_REG_LOC (loc))
1688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
1698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				       val, 0, c->as_arg);
1708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  addr = DWARF_GET_LOC (loc);
1728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
1738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				       0, c->as_arg)) < 0)
1748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return ret;
1758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0,
1778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				   c->as_arg);
1788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
1798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
1818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val)
1828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
1838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  char *valp = (char *) &val;
1848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  unw_word_t addr;
1858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  int ret;
1868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_NULL_LOC (loc))
1888d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -UNW_EBADREG;
1898d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1908d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_REG_LOC (loc))
1918d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc),
1928d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				       &val, 1, c->as_arg);
1938d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  addr = DWARF_GET_LOC (loc);
1958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp,
1968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				       1, c->as_arg)) < 0)
1978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return ret;
1988d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
1998d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1,
2008d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				   1, c->as_arg);
2018d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
2028d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2038d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
2048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val)
2058d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
2068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_NULL_LOC (loc))
2078d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -UNW_EBADREG;
2088d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2098d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  /* If a code-generator were to save a value of type unw_word_t in a
2108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala     floating-point register, we would have to support this case.  I
2118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala     suppose it could happen with MMX registers, but does it really
2128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala     happen?  */
2138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  assert (!DWARF_IS_FP_LOC (loc));
2148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_REG_LOC (loc))
2168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val,
2178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				     0, c->as_arg);
2188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
2198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val,
2208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				     0, c->as_arg);
2218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
2228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int
2248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val)
2258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{
2268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_NULL_LOC (loc))
2278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return -UNW_EBADREG;
2288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  /* If a code-generator were to save a value of type unw_word_t in a
2308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala     floating-point register, we would have to support this case.  I
2318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala     suppose it could happen with MMX registers, but does it really
2328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala     happen?  */
2338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  assert (!DWARF_IS_FP_LOC (loc));
2348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (DWARF_IS_REG_LOC (loc))
2368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val,
2378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				     1, c->as_arg);
2388d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  else
2398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val,
2408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				     1, c->as_arg);
2418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala}
2428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif /* !UNW_LOCAL_ONLY */
2448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_getcontext_trace           unw_getcontext
2468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_init_done			UNW_OBJ(init_done)
2478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_init			UNW_OBJ(init)
2488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* Platforms that support UNW_INFO_FORMAT_TABLE need to define
2498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala   tdep_search_unwind_table.  */
2508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_search_unwind_table	dwarf_search_unwind_table
2518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_find_unwind_table		dwarf_find_unwind_table
2528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_uc_addr			UNW_ARCH_OBJ(uc_addr)
2538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_elf_image		UNW_ARCH_OBJ(get_elf_image)
2548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_access_reg			UNW_OBJ(access_reg)
2558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_access_fpreg		UNW_OBJ(access_fpreg)
2568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_fetch_frame(c,ip,n)	do {} while(0)
2578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_cache_frame(c,rs)		do {} while(0)
2588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_reuse_frame(c,rs)		do {} while(0)
2598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_stash_frame(c,rs)		do {} while(0)
2608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_trace(cur,addr,n)		(-UNW_ENOINFO)
2618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef UNW_LOCAL_ONLY
2638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_find_proc_info(c,ip,n)				\
2648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n),	\
2658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				       (c)->as_arg)
2668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_put_unwind_info(as,pi,arg)		\
2678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	dwarf_put_unwind_info((as), (pi), (arg))
2688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else
2698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_find_proc_info(c,ip,n)					\
2708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
2718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				       (c)->as_arg)
2728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_put_unwind_info(as,pi,arg)		\
2738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala	(*(as)->acc.put_unwind_info)((as), (pi), (arg))
2748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif
2758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_as(c)			((c)->dwarf.as)
2778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_as_arg(c)		((c)->dwarf.as_arg)
2788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_ip(c)			((c)->dwarf.ip)
2798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_big_endian(as)		((as)->big_endian)
2808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_init_done;
2828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern void tdep_init (void);
2848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip,
2858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				     unw_dyn_info_t *di, unw_proc_info_t *pi,
2868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala				     int need_unwind_info, void *arg);
2878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern void *tdep_uc_addr (unw_tdep_context_t *uc, int reg);
28816b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris/* ANDROID support update. */
289f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferrisextern int tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei,
290f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris			       pid_t pid, unw_word_t ip,
291f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris			       unsigned long *segbase, unsigned long *mapoff,
292f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris			       char **path);
29316b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris/* End of ANDROID update. */
2948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_access_reg (struct cursor *c, unw_regnum_t reg,
2958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala			    unw_word_t *valp, int write);
2968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg,
2978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala			      unw_fpreg_t *valp, int write);
2988d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala
2998d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif /* SH_LIBUNWIND_I_H */
300