1bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm/* libunwind - a platform-independent unwind library 2bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm Copyright (c) 2002-2004 Hewlett-Packard Development Company, L.P. 3bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 5bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmThis file is part of libunwind. 6bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 7bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining 8bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidma copy of this software and associated documentation files (the 9bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm"Software"), to deal in the Software without restriction, including 10bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish, 11bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to 12bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to 13bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmthe following conditions: 14bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 15bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmThe above copyright notice and this permission notice shall be 16bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmincluded in all copies or substantial portions of the Software. 17bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 18bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 21bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 22bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 23bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 24bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 25bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 26bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm#include <stdlib.h> 27bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 28bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm#include "unwind_i.h" 29e9cd30040e2794ee586ff853b360b47881824fdaKonstantin Belousov#include "offsets.h" 30bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 31bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm/* This routine is responsible for copying the register values in 32bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm cursor C and establishing them as the current machine state. */ 33bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 34bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmstatic inline int 35bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmestablish_machine_state (struct cursor *c) 36bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm{ 37bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm int (*access_reg) (unw_addr_space_t, unw_regnum_t, unw_word_t *, 38bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm int write, void *); 39bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm int (*access_fpreg) (unw_addr_space_t, unw_regnum_t, unw_fpreg_t *, 40bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm int write, void *); 41bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm unw_addr_space_t as = c->dwarf.as; 42bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm void *arg = c->dwarf.as_arg; 43bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm unw_fpreg_t fpval; 44bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm unw_word_t val; 45bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm int reg; 46bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 47bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm access_reg = as->acc.access_reg; 48bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm access_fpreg = as->acc.access_fpreg; 49bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 50bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm Debug (8, "copying out cursor state\n"); 51bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 523f1664176073892fe3cce239b6229ba91ba6db63mostang.com!davidm for (reg = 0; reg <= UNW_REG_LAST; ++reg) 53bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm { 543f1664176073892fe3cce239b6229ba91ba6db63mostang.com!davidm Debug (16, "copying %s %d\n", unw_regname (reg), reg); 55bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm if (unw_is_fpreg (reg)) 56bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm { 57bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm if (tdep_access_fpreg (c, reg, &fpval, 0) >= 0) 58bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm (*access_fpreg) (as, reg, &fpval, 1, arg); 59bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm } 60bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm else 61bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm { 62bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm if (tdep_access_reg (c, reg, &val, 0) >= 0) 63bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm (*access_reg) (as, reg, &val, 1, arg); 64bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm } 65bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm } 66bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm return 0; 67bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm} 68bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 69bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmPROTECTED int 70bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidmunw_resume (unw_cursor_t *cursor) 71bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm{ 72bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm struct cursor *c = (struct cursor *) cursor; 73bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm int ret; 74bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 75f576cce7480d6acee537cecfeb5530187e50f785hp.com!davidm Debug (1, "(cursor=%p)\n", c); 76bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 77bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm if ((ret = establish_machine_state (c)) < 0) 78bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm return ret; 79bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm 80bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm return (*c->dwarf.as->acc.resume) (c->dwarf.as, (unw_cursor_t *) c, 81bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm c->dwarf.as_arg); 82bcd0aff352ac86aff4f9e7071375c6aa375c9a45homeip.net!davidm} 83