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