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