11883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm/* libunwind - a platform-independent unwind library
22f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm   Copyright (C) 2001-2002, 2004 Hewlett-Packard Co
31883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
41883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
51883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmThis file is part of libunwind.
61883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
71883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining
81883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidma copy of this software and associated documentation files (the
91883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm"Software"), to deal in the Software without restriction, including
101883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish,
111883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to
121883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to
131883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmthe following conditions:
141883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
151883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmThe above copyright notice and this permission notice shall be
161883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmincluded in all copies or substantial portions of the Software.
171883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
181883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
191883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
201883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
211883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
221883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
231883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
241883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
251883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
261883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm#include "init.h"
271883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm#include "unwind_i.h"
281883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
291883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmPROTECTED int
301883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidmunw_init_remote (unw_cursor_t *cursor, unw_addr_space_t as, void *as_arg)
311883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm{
321883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm#ifdef UNW_LOCAL_ONLY
331883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm  return -UNW_EINVAL;
341883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm#else /* !UNW_LOCAL_ONLY */
351883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm  struct cursor *c = (struct cursor *) cursor;
36080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm  unw_word_t sp, bsp;
37080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm  int ret;
381883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
395d0f376b08126b51a001d7cdfba1ec4e0d644f54Tommi Rantala  if (!tdep_init_done)
401883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm    tdep_init ();
411883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
42f576cce7480d6acee537cecfeb5530187e50f785hp.com!davidm  Debug (1, "(cursor=%p)\n", c);
431883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm
442f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm  if (as == unw_local_addr_space)
452f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm    /* This special-casing is unfortunate and shouldn't be needed;
462f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm       however, both Linux and HP-UX need to adjust the context a bit
472f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm       before it's usable.  Try to think of a cleaner way of doing
482f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm       this.  Not sure it's possible though, as long as we want to be
492f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm       able to use the context returned by getcontext() et al.  */
502f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm    return unw_init_local (cursor, as_arg);
512f6b56efda661c47ae834e4d3ed0a618b22beac2hp.com!davidm
521883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm  c->as = as;
531883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm  c->as_arg = as_arg;
54080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm
55080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm  if ((ret = ia64_get (c, IA64_REG_LOC (c, UNW_IA64_GR + 12), &sp)) < 0
56080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm      || (ret = ia64_get (c, IA64_REG_LOC (c, UNW_IA64_AR_BSP), &bsp)) < 0)
57080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm    return ret;
58080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm
59080f8423d959f38702d61574403c2f6c54344eb2hp.com!davidm  return common_init (c, sp, bsp);
601883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm#endif /* !UNW_LOCAL_ONLY */
611883db9df16936b46d6ef3521caff2ec7c5a895bhomeip.net!davidm}
62