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