libunwind_i.h revision 3842dac7333e42aa44531eda34ba55200b99ccf8
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#ifndef MIPS_LIBUNWIND_I_H 263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define MIPS_LIBUNWIND_I_H 273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* Target-dependent definitions that are internal to libunwind but need 293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz to be shared with target-independent code. */ 303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include <stdlib.h> 323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include <libunwind.h> 333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#if !defined(UNW_REMOTE_ONLY) && _MIPS_SIM == _ABI64 353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# include "elf64.h" 363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else 373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# include "elf32.h" 383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif 393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "mempool.h" 403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#include "dwarf.h" 413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstruct unw_addr_space 433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz { 443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz struct unw_accessors acc; 453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int big_endian; 473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz mips_abi_t abi; 483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unsigned int addr_size; 493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_caching_policy_t caching_policy; 513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef HAVE_ATOMIC_OPS_H 523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz AO_t cache_generation; 533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else 543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz uint32_t cache_generation; 553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif 563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t dyn_generation; /* see dyn-common.h */ 573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */ 583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz struct dwarf_rs_cache global_cache; 593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz struct unw_debug_frame_list *debug_frames; 603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz}; 613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_big_endian(as) ((as)->big_endian) 633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstruct cursor 653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz { 663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz struct dwarf_cursor dwarf; /* must be first */ 673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t sigcontext_addr; 683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz }; 693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define DWARF_GET_LOC(l) ((l).val) 713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifndef UNW_REMOTE_ONLY 733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# if _MIPS_SIM == _ABIN32 743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitztypedef long long mips_reg_t; 753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# else 763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitztypedef long mips_reg_t; 773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# endif 783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif 793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef UNW_LOCAL_ONLY 813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_NULL_LOC DWARF_LOC (0, 0) 823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_NULL_LOC(l) (DWARF_GET_LOC (l) == 0) 833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC(r, t) ((dwarf_loc_t) { .val = (r) }) 843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_REG_LOC(l) 0 853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_REG_LOC(c,r) (DWARF_LOC((unw_word_t) (intptr_t) \ 863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz tdep_uc_addr((c)->as_arg, (r)), 0)) 873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_MEM_LOC(c,m) DWARF_LOC ((m), 0) 883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_FPREG_LOC(c,r) (DWARF_LOC((unw_word_t) (intptr_t) \ 893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz tdep_uc_addr((c)->as_arg, (r)), 0)) 903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* FIXME: Implement these for the MIPS FPU. */ 923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val) 943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (!DWARF_GET_LOC (loc)) 963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -1; 973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *val = *(unw_fpreg_t *) (intptr_t) DWARF_GET_LOC (loc); 983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return 0; 993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 1003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 1023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val) 1033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 1043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (!DWARF_GET_LOC (loc)) 1053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -1; 1063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *(unw_fpreg_t *) (intptr_t) DWARF_GET_LOC (loc) = val; 1073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return 0; 1083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 1093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 1113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val) 1123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 1133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (!DWARF_GET_LOC (loc)) 1143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -1; 1153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *val = *(mips_reg_t *) (intptr_t) DWARF_GET_LOC (loc); 1163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return 0; 1173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 1183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 1203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) 1213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 1223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (!DWARF_GET_LOC (loc)) 1233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -1; 1243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *(mips_reg_t *) (intptr_t) DWARF_GET_LOC (loc) = val; 1253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return 0; 1263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 1273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else /* !UNW_LOCAL_ONLY */ 1293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC_TYPE_FP (1 << 0) 1303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC_TYPE_REG (1 << 1) 1313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_NULL_LOC DWARF_LOC (0, 0) 1323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_NULL_LOC(l) \ 1333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; }) 1343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_LOC(r, t) ((dwarf_loc_t) { .val = (r), .type = (t) }) 1353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_REG_LOC(l) (((l).type & DWARF_LOC_TYPE_REG) != 0) 1363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_IS_FP_LOC(l) (((l).type & DWARF_LOC_TYPE_FP) != 0) 1373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_REG_LOC(c,r) DWARF_LOC((r), DWARF_LOC_TYPE_REG) 1383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_MEM_LOC(c,m) DWARF_LOC ((m), 0) 1393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define DWARF_FPREG_LOC(c,r) DWARF_LOC((r), (DWARF_LOC_TYPE_REG \ 1403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz | DWARF_LOC_TYPE_FP)) 1413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 1433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzread_s32 (struct dwarf_cursor *c, unw_word_t addr, unw_word_t *val) 1443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 1453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int offset = addr & 4; 1463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int ret; 1473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t memval; 1483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz ret = (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 0, c->as_arg); 1503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (ret < 0) 1513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return ret; 1523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if ((offset != 0) == tdep_big_endian (c->as)) 1543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *val = (int32_t) memval; 1553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz else 1563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz *val = (int32_t) (memval >> 32); 1573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return 0; 1593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 1603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 1623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzwrite_s32 (struct dwarf_cursor *c, unw_word_t addr, const unw_word_t *val) 1633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 1643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int offset = addr & 4; 1653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int ret; 1663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t memval; 1673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz ret = (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 0, c->as_arg); 1693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (ret < 0) 1703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return ret; 1713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if ((offset != 0) == tdep_big_endian (c->as)) 1733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz memval = (memval & ~0xffffffffLL) | (uint32_t) *val; 1743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz else 1753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz memval = (memval & 0xffffffffLL) | (uint32_t) (*val << 32); 1763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_mem) (c->as, addr - offset, &memval, 1, c->as_arg); 1783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 1793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* FIXME: Implement these for the MIPS FPU. */ 1813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 1823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val) 1833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 1843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz char *valp = (char *) &val; 1853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t addr; 1863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int ret; 1873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_NULL_LOC (loc)) 1893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -UNW_EBADREG; 1903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_REG_LOC (loc)) 1923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc), 1933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz val, 0, c->as_arg); 1943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz addr = DWARF_GET_LOC (loc); 1963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp, 1973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 0, c->as_arg)) < 0) 1983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return ret; 1993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0, 2013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz c->as_arg); 2023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 2033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 2053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val) 2063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 2073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz char *valp = (char *) &val; 2083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t addr; 2093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int ret; 2103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_NULL_LOC (loc)) 2123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -UNW_EBADREG; 2133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_REG_LOC (loc)) 2153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc), 2163842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz &val, 1, c->as_arg); 2173842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2183842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz addr = DWARF_GET_LOC (loc); 2193842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp, 2203842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1, c->as_arg)) < 0) 2213842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return ret; 2223842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2233842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 2243842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1, c->as_arg); 2253842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 2263842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2273842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 2283842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val) 2293842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 2303842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_NULL_LOC (loc)) 2313842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -UNW_EBADREG; 2323842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2333842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz /* If a code-generator were to save a value of type unw_word_t in a 2343842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz floating-point register, we would have to support this case. I 2353842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz suppose it could happen with MMX registers, but does it really 2363842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz happen? */ 2373842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz assert (!DWARF_IS_FP_LOC (loc)); 2383842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2393842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_REG_LOC (loc)) 2403842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val, 2413842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 0, c->as_arg); 2423842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz else if (c->as->abi == UNW_MIPS_ABI_O32) 2433842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return read_s32 (c, DWARF_GET_LOC (loc), val); 2443842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz else 2453842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val, 2463842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 0, c->as_arg); 2473842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 2483842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2493842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzstatic inline int 2503842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzdwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) 2513842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz{ 2523842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_NULL_LOC (loc)) 2533842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return -UNW_EBADREG; 2543842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2553842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz /* If a code-generator were to save a value of type unw_word_t in a 2563842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz floating-point register, we would have to support this case. I 2573842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz suppose it could happen with MMX registers, but does it really 2583842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz happen? */ 2593842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz assert (!DWARF_IS_FP_LOC (loc)); 2603842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2613842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz if (DWARF_IS_REG_LOC (loc)) 2623842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val, 2633842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1, c->as_arg); 2643842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz else if (c->as->abi == UNW_MIPS_ABI_O32) 2653842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return write_s32 (c, DWARF_GET_LOC (loc), &val); 2663842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz else 2673842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val, 2683842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 1, c->as_arg); 2693842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz} 2703842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2713842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif /* !UNW_LOCAL_ONLY */ 2723842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2733842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_needs_initialization UNW_OBJ(needs_initialization) 2743842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_init UNW_OBJ(init) 2753842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz/* Platforms that support UNW_INFO_FORMAT_TABLE need to define 2763842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz tdep_search_unwind_table. */ 2773842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_search_unwind_table dwarf_search_unwind_table 2783842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_uc_addr UNW_ARCH_OBJ(uc_addr) 2793842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) 2803842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_access_reg UNW_OBJ(access_reg) 2813842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_access_fpreg UNW_OBJ(access_fpreg) 2823842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2833842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#ifdef UNW_LOCAL_ONLY 2843842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_find_proc_info(c,ip,n) \ 2853842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n), \ 2863842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz (c)->as_arg) 2873842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_put_unwind_info(as,pi,arg) \ 2883842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz dwarf_put_unwind_info((as), (pi), (arg)) 2893842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#else 2903842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_find_proc_info(c,ip,n) \ 2913842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n), \ 2923842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz (c)->as_arg) 2933842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz# define tdep_put_unwind_info(as,pi,arg) \ 2943842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz (*(as)->acc.put_unwind_info)((as), (pi), (arg)) 2953842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif 2963842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 2973842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_as(c) ((c)->dwarf.as) 2983842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_as_arg(c) ((c)->dwarf.as_arg) 2993842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#define tdep_get_ip(c) ((c)->dwarf.ip) 3003842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 3013842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_needs_initialization; 3023842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 3033842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern void tdep_init (void); 3043842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, 3053842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_dyn_info_t *di, unw_proc_info_t *pi, 3063842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz int need_unwind_info, void *arg); 3073842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern void *tdep_uc_addr (ucontext_t *uc, int reg); 3083842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_get_elf_image (struct elf_image *ei, pid_t pid, unw_word_t ip, 3093842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unsigned long *segbase, unsigned long *mapoff); 3103842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_access_reg (struct cursor *c, unw_regnum_t reg, 3113842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_word_t *valp, int write); 3123842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitzextern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, 3133842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz unw_fpreg_t *valp, int write); 3143842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz 3153842dac7333e42aa44531eda34ba55200b99ccf8Daniel Jacobowitz#endif /* MIPS_LIBUNWIND_I_H */ 316