18d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* libunwind - a platform-independent unwind library 28d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala Copyright (C) 2008 CodeSourcery 38d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com> 48d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 58d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThis file is part of libunwind. 68d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 78d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaPermission is hereby granted, free of charge, to any person obtaining 88d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaa copy of this software and associated documentation files (the 98d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala"Software"), to deal in the Software without restriction, including 108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalawithout limitation the rights to use, copy, modify, merge, publish, 118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladistribute, sublicense, and/or sell copies of the Software, and to 128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalapermit persons to whom the Software is furnished to do so, subject to 138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalathe following conditions: 148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaThe above copyright notice and this permission notice shall be 168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaincluded in all copies or substantial portions of the Software. 178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi RantalaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifndef SH_LIBUNWIND_I_H 278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define SH_LIBUNWIND_I_H 288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* Target-dependent definitions that are internal to libunwind but need 308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala to be shared with target-independent code. */ 318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include <stdlib.h> 338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include <libunwind.h> 348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "elf32.h" 367d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris/* ANDROID support update. */ 377d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris#include "map_info.h" 387d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris/* End of ANDROID update. */ 398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "mempool.h" 408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#include "dwarf.h" 418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalatypedef struct 438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala { 448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala /* no sh-specific fast trace */ 458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala } 468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaunw_tdep_frame_t; 478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastruct unw_addr_space 498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala { 508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala struct unw_accessors acc; 518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala int big_endian; 528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_caching_policy_t caching_policy; 538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef HAVE_ATOMIC_OPS_H 548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala AO_t cache_generation; 558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else 568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala uint32_t cache_generation; 578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif 588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t dyn_generation; /* see dyn-common.h */ 598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t dyn_info_list_addr; /* (cached) dyn_info_list_addr */ 608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala struct dwarf_rs_cache global_cache; 618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala struct unw_debug_frame_list *debug_frames; 627d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris /* ANDROID support update. */ 637d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris struct map_info *map_list; 647d46a21e0a2cb561e4cad57b101a7137e01023dcChristopher Ferris /* End of ANDROID update. */ 658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala }; 668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastruct cursor 688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala { 698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala struct dwarf_cursor dwarf; /* must be first */ 708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala enum 718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala { 728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala SH_SCF_NONE, /* no signal frame */ 738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala SH_SCF_LINUX_SIGFRAME, /* non-RT signal frame */ 748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala SH_SCF_LINUX_RT_SIGFRAME, /* RT signal frame */ 758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala } 768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala sigcontext_format; 778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t sigcontext_addr; 788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t sigcontext_sp; 798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t sigcontext_pc; 808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala }; 818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define DWARF_GET_LOC(l) ((l).val) 838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef UNW_LOCAL_ONLY 858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_NULL_LOC DWARF_LOC (0, 0) 868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_NULL_LOC(l) (DWARF_GET_LOC (l) == 0) 878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC(r, t) ((dwarf_loc_t) { .val = (r) }) 888d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_REG_LOC(l) 0 898d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_REG_LOC(c,r) (DWARF_LOC((unw_word_t) \ 908d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala tdep_uc_addr((c)->as_arg, (r)), 0)) 918d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_MEM_LOC(c,m) DWARF_LOC ((m), 0) 928d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_FPREG_LOC(c,r) (DWARF_LOC((unw_word_t) \ 938d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala tdep_uc_addr((c)->as_arg, (r)), 0)) 948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val) 978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 98f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */ 99f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris unw_fpreg_t *addr = (unw_fpreg_t *) DWARF_GET_LOC (loc); 100f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris if (!addr || !map_local_is_readable ((unw_word_t) addr)) 1018d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -1; 102f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris 103f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris *val = *addr; 1048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return 0; 105f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */ 1068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 1078d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1088d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 1098d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val) 1108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 111f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */ 112f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris unw_fpreg_t *addr = (unw_fpreg_t *) DWARF_GET_LOC (loc); 113f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris if (!addr || !map_local_is_writable ((unw_word_t) addr)) 1148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -1; 115f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris 116f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris *addr = val; 1178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return 0; 118f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */ 1198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 1208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 1228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val) 1238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 124f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */ 1258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (!DWARF_GET_LOC (loc)) 1268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -1; 127f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val, 128f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris 0, c->as_arg); 129f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */ 1308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 1318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 1338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) 1348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 135f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* ANDROID support update. */ 1368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (!DWARF_GET_LOC (loc)) 1378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -1; 138f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val, 139f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris 1, c->as_arg); 140f622936d6c5239b3d5ccafdf38189cec8bca55c0Christopher Ferris/* End of ANDROID update. */ 1418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 1428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else /* !UNW_LOCAL_ONLY */ 1448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC_TYPE_FP (1 << 0) 1458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC_TYPE_REG (1 << 1) 1468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_NULL_LOC DWARF_LOC (0, 0) 1478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_NULL_LOC(l) \ 1488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala ({ dwarf_loc_t _l = (l); _l.val == 0 && _l.type == 0; }) 1498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_LOC(r, t) ((dwarf_loc_t) { .val = (r), .type = (t) }) 1508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_REG_LOC(l) (((l).type & DWARF_LOC_TYPE_REG) != 0) 1518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_IS_FP_LOC(l) (((l).type & DWARF_LOC_TYPE_FP) != 0) 1528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_REG_LOC(c,r) DWARF_LOC((r), DWARF_LOC_TYPE_REG) 1538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_MEM_LOC(c,m) DWARF_LOC ((m), 0) 1548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define DWARF_FPREG_LOC(c,r) DWARF_LOC((r), (DWARF_LOC_TYPE_REG \ 1558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala | DWARF_LOC_TYPE_FP)) 1568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 1588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_getfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t *val) 1598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 1608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala char *valp = (char *) &val; 1618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t addr; 1628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala int ret; 1638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_NULL_LOC (loc)) 1658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -UNW_EBADREG; 1668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_REG_LOC (loc)) 1688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc), 1698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala val, 0, c->as_arg); 1708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala addr = DWARF_GET_LOC (loc); 1728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp, 1738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 0, c->as_arg)) < 0) 1748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return ret; 1758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 0, 1778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala c->as_arg); 1788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 1798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 1818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_putfp (struct dwarf_cursor *c, dwarf_loc_t loc, unw_fpreg_t val) 1828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 1838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala char *valp = (char *) &val; 1848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t addr; 1858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala int ret; 1868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_NULL_LOC (loc)) 1888d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -UNW_EBADREG; 1898d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1908d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_REG_LOC (loc)) 1918d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_fpreg) (c->as, DWARF_GET_LOC (loc), 1928d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala &val, 1, c->as_arg); 1938d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala addr = DWARF_GET_LOC (loc); 1958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if ((ret = (*c->as->acc.access_mem) (c->as, addr + 0, (unw_word_t *) valp, 1968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1, c->as_arg)) < 0) 1978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return ret; 1988d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1998d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_mem) (c->as, addr + 4, (unw_word_t *) valp + 1, 2008d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1, c->as_arg); 2018d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 2028d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2038d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 2048d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_get (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t *val) 2058d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 2068d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_NULL_LOC (loc)) 2078d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -UNW_EBADREG; 2088d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2098d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala /* If a code-generator were to save a value of type unw_word_t in a 2108d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala floating-point register, we would have to support this case. I 2118d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala suppose it could happen with MMX registers, but does it really 2128d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala happen? */ 2138d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala assert (!DWARF_IS_FP_LOC (loc)); 2148d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2158d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_REG_LOC (loc)) 2168d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), val, 2178d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 0, c->as_arg); 2188d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala else 2198d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), val, 2208d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 0, c->as_arg); 2218d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 2228d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2238d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalastatic inline int 2248d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantaladwarf_put (struct dwarf_cursor *c, dwarf_loc_t loc, unw_word_t val) 2258d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala{ 2268d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_NULL_LOC (loc)) 2278d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return -UNW_EBADREG; 2288d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2298d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala /* If a code-generator were to save a value of type unw_word_t in a 2308d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala floating-point register, we would have to support this case. I 2318d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala suppose it could happen with MMX registers, but does it really 2328d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala happen? */ 2338d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala assert (!DWARF_IS_FP_LOC (loc)); 2348d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2358d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala if (DWARF_IS_REG_LOC (loc)) 2368d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_reg) (c->as, DWARF_GET_LOC (loc), &val, 2378d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1, c->as_arg); 2388d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala else 2398d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala return (*c->as->acc.access_mem) (c->as, DWARF_GET_LOC (loc), &val, 2408d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 1, c->as_arg); 2418d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala} 2428d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2438d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif /* !UNW_LOCAL_ONLY */ 2448d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_getcontext_trace unw_getcontext 2468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_init_done UNW_OBJ(init_done) 2478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_init UNW_OBJ(init) 2488d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala/* Platforms that support UNW_INFO_FORMAT_TABLE need to define 2498d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala tdep_search_unwind_table. */ 2508d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_search_unwind_table dwarf_search_unwind_table 2518d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_find_unwind_table dwarf_find_unwind_table 2528d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_uc_addr UNW_ARCH_OBJ(uc_addr) 2538d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_elf_image UNW_ARCH_OBJ(get_elf_image) 2548d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_access_reg UNW_OBJ(access_reg) 2558d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_access_fpreg UNW_OBJ(access_fpreg) 2568d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_fetch_frame(c,ip,n) do {} while(0) 2578d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_cache_frame(c,rs) do {} while(0) 2588d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_reuse_frame(c,rs) do {} while(0) 2598d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_stash_frame(c,rs) do {} while(0) 2608d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_trace(cur,addr,n) (-UNW_ENOINFO) 2618d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2628d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#ifdef UNW_LOCAL_ONLY 2638d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_find_proc_info(c,ip,n) \ 2648d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala dwarf_find_proc_info((c)->as, (ip), &(c)->pi, (n), \ 2658d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala (c)->as_arg) 2668d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_put_unwind_info(as,pi,arg) \ 2678d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala dwarf_put_unwind_info((as), (pi), (arg)) 2688d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#else 2698d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_find_proc_info(c,ip,n) \ 2708d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala (*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n), \ 2718d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala (c)->as_arg) 2728d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala# define tdep_put_unwind_info(as,pi,arg) \ 2738d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala (*(as)->acc.put_unwind_info)((as), (pi), (arg)) 2748d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif 2758d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2768d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_as(c) ((c)->dwarf.as) 2778d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_as_arg(c) ((c)->dwarf.as_arg) 2788d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_get_ip(c) ((c)->dwarf.ip) 2798d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#define tdep_big_endian(as) ((as)->big_endian) 2808d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2818d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_init_done; 2828d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2838d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern void tdep_init (void); 2848d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_search_unwind_table (unw_addr_space_t as, unw_word_t ip, 2858d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_dyn_info_t *di, unw_proc_info_t *pi, 2868d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala int need_unwind_info, void *arg); 2878d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern void *tdep_uc_addr (unw_tdep_context_t *uc, int reg); 28816b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris/* ANDROID support update. */ 289f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferrisextern int tdep_get_elf_image (unw_addr_space_t as, struct elf_image *ei, 290f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris pid_t pid, unw_word_t ip, 291f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris unsigned long *segbase, unsigned long *mapoff, 292f4a8df5f4f338f1a12c25213227e98b34b42447fChristopher Ferris char **path); 29316b95a68caaa7e021209e2cd6a877ae1e558f740Christopher Ferris/* End of ANDROID update. */ 2948d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_access_reg (struct cursor *c, unw_regnum_t reg, 2958d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_word_t *valp, int write); 2968d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantalaextern int tdep_access_fpreg (struct cursor *c, unw_regnum_t reg, 2978d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala unw_fpreg_t *valp, int write); 2988d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala 2998d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#endif /* SH_LIBUNWIND_I_H */ 300