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#include <stdlib.h>
263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include <string.h>
273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "unwind_i.h"
293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef UNW_REMOTE_ONLY
313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* unw_local_addr_space is a NULL pointer in this case.  */
333842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzPROTECTED unw_addr_space_t unw_local_addr_space;
343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else /* !UNW_REMOTE_ONLY */
363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic struct unw_addr_space local_addr_space;
383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
393842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzPROTECTED unw_addr_space_t unw_local_addr_space = &local_addr_space;
403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline void *
420eba2169fb19ef0707a2c96201e33769001b5f11Ken Werneruc_addr (unw_tdep_context_t *uc, int reg)
433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
440eba2169fb19ef0707a2c96201e33769001b5f11Ken Werner  if (reg >= UNW_ARM_R0 && reg < UNW_ARM_R0 + 16)
450eba2169fb19ef0707a2c96201e33769001b5f11Ken Werner    return &uc->regs[reg - UNW_ARM_R0];
460eba2169fb19ef0707a2c96201e33769001b5f11Ken Werner  else
470eba2169fb19ef0707a2c96201e33769001b5f11Ken Werner    return NULL;
483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# ifdef UNW_LOCAL_ONLY
513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
523842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzHIDDEN void *
530eba2169fb19ef0707a2c96201e33769001b5f11Ken Wernertdep_uc_addr (unw_tdep_context_t *uc, int reg)
543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return uc_addr (uc, reg);
563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# endif /* UNW_LOCAL_ONLY */
593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
603842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzHIDDEN unw_dyn_info_list_t _U_dyn_info_list;
613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* XXX fix me: there is currently no way to locate the dyn-info list
633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz       by a remote unwinder.  On ia64, this is done via a special
643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz       unwind-table entry.  Perhaps something similar can be done with
653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz       DWARF2 unwind info.  */
663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzget_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz			void *arg)
703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  *dyn_info_list_addr = (unw_word_t) &_U_dyn_info_list;
723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzaccess_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	    void *arg)
783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (write)
803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
817d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* ANDROID support update. */
82cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
83f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris      if (map_local_is_writable (addr))
847d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
85cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
867d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "mem[%x] <- %x\n", addr, *val);
877d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          *(unw_word_t *) addr = *val;
88cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
897d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
907d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      else
917d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
927d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "Unwritable memory mem[%x] <- %x\n", addr, *val);
937d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          return -1;
947d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
95cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
967d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* End of ANDROID update. */
973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1007d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* ANDROID support update. */
101cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
102f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris      if (map_local_is_readable (addr))
1037d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
104cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1057d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          *val = *(unw_word_t *) addr;
1067d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "mem[%x] -> %x\n", addr, *val);
107cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
1087d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
1097d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      else
1107d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
1117d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "Unreadable memory mem[%x] -> XXX\n", addr);
1127d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          return -1;
1137d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
114cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1157d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* End of ANDROID update. */
1163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
1213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzaccess_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
1223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	    void *arg)
1233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_word_t *addr;
1250eba2169fb19ef0707a2c96201e33769001b5f11Ken Werner  unw_tdep_context_t *uc = arg;
1263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (unw_is_fpreg (reg))
1283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1303842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzDebug (16, "reg = %s\n", unw_regname (reg));
1313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!(addr = uc_addr (uc, reg)))
1323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (write)
1353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *(unw_word_t *) addr = *val;
1373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s <- %x\n", unw_regname (reg), *val);
1383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *val = *(unw_word_t *) addr;
1423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s -> %x\n", unw_regname (reg), *val);
1433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz badreg:
1473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  Debug (1, "bad register number %u\n", reg);
1483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return -UNW_EBADREG;
1493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
1523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzaccess_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
1533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	      int write, void *arg)
1543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1550eba2169fb19ef0707a2c96201e33769001b5f11Ken Werner  unw_tdep_context_t *uc = arg;
1563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_fpreg_t *addr;
1573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!unw_is_fpreg (reg))
1593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!(addr = uc_addr (uc, reg)))
1623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (write)
1653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
1673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
1683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *(unw_fpreg_t *) addr = *val;
1693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *val = *(unw_fpreg_t *) addr;
1733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
1743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
1753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz badreg:
1793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  Debug (1, "bad register number %u\n", reg);
1803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  /* attempt to access a non-preserved register */
1813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return -UNW_EBADREG;
1823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
1853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzget_static_proc_name (unw_addr_space_t as, unw_word_t ip,
1863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz		      char *buf, size_t buf_len, unw_word_t *offp,
1873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz		      void *arg)
1883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return _Uelf32_get_proc_name (as, getpid (), ip, buf, buf_len, offp);
1903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1923842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzHIDDEN void
1933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzarm_local_addr_space_init (void)
1943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  memset (&local_addr_space, 0, sizeof (local_addr_space));
1963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
197545023c2072975c6b85a09d5faf2cf05db10e064Ken Werner  local_addr_space.acc.find_proc_info = arm_find_proc_info;
198545023c2072975c6b85a09d5faf2cf05db10e064Ken Werner  local_addr_space.acc.put_unwind_info = arm_put_unwind_info;
1993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
2003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.access_mem = access_mem;
2013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.access_reg = access_reg;
2023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.access_fpreg = access_fpreg;
2031e10c2931d970d0ae5426bba6ba9e1c2998c7451Ken Werner  local_addr_space.acc.resume = arm_local_resume;
2043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.get_proc_name = get_static_proc_name;
2053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_flush_cache (&local_addr_space, 0, 0);
206f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris
207f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris  map_local_init ();
2083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif /* !UNW_REMOTE_ONLY */
211