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