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 Jacobowitz/* Return the address of the 64-bit slot in UC for REG (even for o32,
423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz   where registers are 32-bit, the slots are still 64-bit).  */
433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline void *
453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzuc_addr (ucontext_t *uc, int reg)
463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (reg >= UNW_MIPS_R0 && reg < UNW_MIPS_R0 + 32)
483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return &uc->uc_mcontext.gregs[reg - UNW_MIPS_R0];
4979c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala  else if (reg == UNW_MIPS_PC)
5079c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala    return &uc->uc_mcontext.pc;
513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    return NULL;
533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# ifdef UNW_LOCAL_ONLY
563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
573842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzHIDDEN void *
583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitztdep_uc_addr (ucontext_t *uc, int reg)
593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  char *addr = uc_addr (uc, reg);
613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (reg >= UNW_MIPS_R0 && reg <= UNW_MIPS_R31
633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      && tdep_big_endian (unw_local_addr_space)
643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      && unw_local_addr_space->abi == UNW_MIPS_ABI_O32)
653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    addr += 4;
663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return addr;
683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# endif /* UNW_LOCAL_ONLY */
713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
723842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzHIDDEN unw_dyn_info_list_t _U_dyn_info_list;
733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* XXX fix me: there is currently no way to locate the dyn-info list
753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz       by a remote unwinder.  On ia64, this is done via a special
763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz       unwind-table entry.  Perhaps something similar can be done with
773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz       DWARF2 unwind info.  */
783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic void
803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzput_unwind_info (unw_addr_space_t as, unw_proc_info_t *proc_info, void *arg)
813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  /* it's a no-op */
833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzget_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dyn_info_list_addr,
873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz			void *arg)
883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  *dyn_info_list_addr = (unw_word_t) (intptr_t) &_U_dyn_info_list;
903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzaccess_mem (unw_addr_space_t as, unw_word_t addr, unw_word_t *val, int write,
953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	    void *arg)
963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (write)
983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
997d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* ANDROID support update. */
100cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
101f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris      if (map_local_is_writable (addr))
1027d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
103cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1047d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "mem[%llx] <- %llx\n", (long long) addr, (long long) *val);
105d1c383c5bb03420decf5cf789cf14ab144b0720dChristopher Ferris          *(unw_word_t *) (uintptr_t) addr = *val;
106cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
1077d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
1087d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      else
1097d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
1107d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "Unwritable memory mem[%llx] <- %llx\n", (long long) addr,
1117d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris                 (long long) *val);
1127d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          return -1;
1137d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
114cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1157d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* End of ANDROID update. */
1163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1197d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* ANDROID support update. */
120cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
121f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris      if (map_local_is_readable (addr))
1227d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
123cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
124d1c383c5bb03420decf5cf789cf14ab144b0720dChristopher Ferris          *val = *(unw_word_t *) (uintptr_t) addr;
1257d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "mem[%llx] -> %llx\n", (long long) addr, (long long) *val);
126cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#ifdef UNW_LOCAL_ONLY
1277d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
1287d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      else
1297d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        {
1307d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          Debug (16, "Unreadable memory mem[%llx] -> XXX\n", (long long) addr);
1317d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris          return -1;
1327d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris        }
133cdf9ee587b78148c5d48dae1b5ea72ec8df64c96Christopher Ferris#endif
1347d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris      /* End of ANDROID update. */
1353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
1403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzaccess_reg (unw_addr_space_t as, unw_regnum_t reg, unw_word_t *val, int write,
1413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	    void *arg)
1423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_word_t *addr;
1443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  ucontext_t *uc = arg;
1453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (unw_is_fpreg (reg))
1473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  Debug (16, "reg = %s\n", unw_regname (reg));
1503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!(addr = uc_addr (uc, reg)))
1513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (write)
1543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *(unw_word_t *) (intptr_t) addr = (mips_reg_t) *val;
1563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s <- %llx\n", unw_regname (reg), (long long) *val);
1573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *val = (mips_reg_t) *(unw_word_t *) (intptr_t) addr;
1613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s -> %llx\n", unw_regname (reg), (long long) *val);
1623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz badreg:
1663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  Debug (1, "bad register number %u\n", reg);
1673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return -UNW_EBADREG;
1683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
1693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
1713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzaccess_fpreg (unw_addr_space_t as, unw_regnum_t reg, unw_fpreg_t *val,
1723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	      int write, void *arg)
1733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
1743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  ucontext_t *uc = arg;
1753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_fpreg_t *addr;
1763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!unw_is_fpreg (reg))
1783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (!(addr = uc_addr (uc, reg)))
1813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    goto badreg;
1823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  if (write)
1843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s <- %08lx.%08lx.%08lx\n", unw_regname (reg),
1863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
1873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *(unw_fpreg_t *) (intptr_t) addr = *val;
1883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  else
1903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    {
1913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      *val = *(unw_fpreg_t *) (intptr_t) addr;
1923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz      Debug (12, "%s -> %08lx.%08lx.%08lx\n", unw_regname (reg),
1933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz	     ((long *)val)[0], ((long *)val)[1], ((long *)val)[2]);
1943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz    }
1953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return 0;
1963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
1973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz badreg:
1983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  Debug (1, "bad register number %u\n", reg);
1993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  /* attempt to access a non-preserved register */
2003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return -UNW_EBADREG;
2013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic int
2043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzget_static_proc_name (unw_addr_space_t as, unw_word_t ip,
2053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz		      char *buf, size_t buf_len, unw_word_t *offp,
2063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz		      void *arg)
2073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
2083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  return elf_w (get_proc_name) (as, getpid (), ip, buf, buf_len, offp);
2103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2123842dac7333e42aa44531eda34ba55200b99ccf8Daniel JacobowitzHIDDEN void
2133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzmips_local_addr_space_init (void)
2143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{
2153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  memset (&local_addr_space, 0, sizeof (local_addr_space));
2163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.big_endian = (__BYTE_ORDER == __BIG_ENDIAN);
2173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#if _MIPS_SIM == _ABIO32
2183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.abi = UNW_MIPS_ABI_O32;
2193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#elif _MIPS_SIM == _ABIN32
2203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.abi = UNW_MIPS_ABI_N32;
2213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#elif _MIPS_SIM == _ABI64
2223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.abi = UNW_MIPS_ABI_N64;
2233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else
2243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# error Unsupported ABI
2253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif
2263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.addr_size = sizeof (void *);
2273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.caching_policy = UNW_CACHE_GLOBAL;
2283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.find_proc_info = dwarf_find_proc_info;
2293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.put_unwind_info = put_unwind_info;
2303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.get_dyn_info_list_addr = get_dyn_info_list_addr;
2313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.access_mem = access_mem;
2323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.access_reg = access_reg;
2333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.access_fpreg = access_fpreg;
234890e23eb9d3ffd9be2a025189a21794b5ed0e0ffTommi Rantala  local_addr_space.acc.resume = NULL;  /* mips_local_resume?  FIXME!  */
2353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  local_addr_space.acc.get_proc_name = get_static_proc_name;
2363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz  unw_flush_cache (&local_addr_space, 0, 0);
237f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris
238f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris  map_local_init ();
2393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}
2403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz
2413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif /* !UNW_REMOTE_ONLY */
242