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