14c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm/* libunwind - a platform-independent unwind library 2ea7155ebfd6f792539674d71299f8fa018c11effhp.com!davidm Copyright (C) 2003-2005 Hewlett-Packard Co 34c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 44c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 54c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmThis file is part of libunwind. 64c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 74c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmPermission is hereby granted, free of charge, to any person obtaining 84c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidma copy of this software and associated documentation files (the 94c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm"Software"), to deal in the Software without restriction, including 104c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmwithout limitation the rights to use, copy, modify, merge, publish, 114c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to 124c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmpermit persons to whom the Software is furnished to do so, subject to 134c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmthe following conditions: 144c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 154c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmThe above copyright notice and this permission notice shall be 164c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmincluded in all copies or substantial portions of the Software. 174c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 184c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 194c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 204c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 214c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 224c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 234c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 244c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 254c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 264c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm#include "_UPT_internal.h" 274c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 28f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm#if UNW_TARGET_IA64 && defined(__linux) 294c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm# include "elf64.h" 304c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm# include "os-linux.h" 314c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 32f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidmstatic inline int 33f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidmget_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, 34f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm int *countp) 354c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm{ 364c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm unsigned long lo, hi, off; 374c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm struct UPT_info *ui = arg; 384c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm struct map_iterator mi; 394c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm char path[PATH_MAX]; 404c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm unw_word_t res; 414c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm int count = 0; 424c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 434c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm maps_init (&mi, ui->pid); 448d991d9258abab1ef6b649b2d8bec742ab2bb5bfJoel Brobecker while (maps_next (&mi, &lo, &hi, &off)) 454c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm { 464c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm if (off) 474c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm continue; 484c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 4925ee9f81727616f3269032c52483e4421d451291Arun Sharma invalidate_edi(&ui->edi); 504c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 5125ee9f81727616f3269032c52483e4421d451291Arun Sharma if (elf_map_image (&ui->edi.ei, path) < 0) 52346b85ec54b3d4471eb437ccccd2878a95c029cfhp.com!davidm /* ignore unmappable stuff like "/SYSV00001b58 (deleted)" */ 53346b85ec54b3d4471eb437ccccd2878a95c029cfhp.com!davidm continue; 544c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 554c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm Debug (16, "checking object %s\n", path); 564c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 57d93d96ad833390519ea68a2df22dd55dd26a3214Martin Milata if (tdep_find_unwind_table (&ui->edi, as, path, lo, off, 0) > 0) 584c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm { 5925ee9f81727616f3269032c52483e4421d451291Arun Sharma res = _Uia64_find_dyn_list (as, &ui->edi.di_cache, arg); 604c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm if (res && count++ == 0) 614c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm { 624c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm Debug (12, "dyn_info_list_addr = 0x%lx\n", (long) res); 634c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm *dil_addr = res; 644c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm } 654c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm } 664c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm } 674c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm maps_close (&mi); 68f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm *countp = count; 69f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm return 0; 70f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm} 71f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm 724c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm#else 7314a264e044abc9e9471bec994e54f7e05380372bhp.com!davidm 7414a264e044abc9e9471bec994e54f7e05380372bhp.com!davidmstatic inline int 7514a264e044abc9e9471bec994e54f7e05380372bhp.com!davidmget_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, void *arg, 7614a264e044abc9e9471bec994e54f7e05380372bhp.com!davidm int *countp) 7714a264e044abc9e9471bec994e54f7e05380372bhp.com!davidm{ 78d1c383c5bb03420decf5cf789cf14ab144b0720dChristopher Ferris/* ANDROID support update. */ 79d1c383c5bb03420decf5cf789cf14ab144b0720dChristopher Ferris# pragma message("Implement get_list_addr(), please.") 80d1c383c5bb03420decf5cf789cf14ab144b0720dChristopher Ferris/* End of ANDROID update. */ 81b85ca594404759a5fc80a2bf64b1a177b83148a2hp.com!davidm *countp = 0; 8214a264e044abc9e9471bec994e54f7e05380372bhp.com!davidm return 0; 8314a264e044abc9e9471bec994e54f7e05380372bhp.com!davidm} 8414a264e044abc9e9471bec994e54f7e05380372bhp.com!davidm 854c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm#endif 864c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 87f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidmint 88f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm_UPT_get_dyn_info_list_addr (unw_addr_space_t as, unw_word_t *dil_addr, 89f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm void *arg) 90f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm{ 91f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm int count, ret; 92f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm 93f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm Debug (12, "looking for dyn_info list\n"); 94f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm 95f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm if ((ret = get_list_addr (as, dil_addr, arg, &count)) < 0) 96f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm return ret; 97f8bc3b80d193a9d88793fb38c0062ae4df74d311mostang.com!davidm 984c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm /* If multiple dynamic-info list addresses are found, we would have 994c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm to determine which was is the one actually in use (since the 1004c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm dynamic name resolution algorithm will pick one "winner"). 1014c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm Perhaps we'd have to track them all until we find one that's 1024c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm non-empty. Hopefully, this case simply will never arise, since 1034c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm only libunwind defines the dynamic info list head. */ 1044c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm assert (count <= 1); 1054c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm 1064c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm return (count > 0) ? 0 : -UNW_ENOINFO; 1074c9772769b6298b03ea65cb595150472b6b0fd92hp.com!davidm} 108