1fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm/* libunwind - a platform-independent unwind library
25b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm   Copyright (C) 2004 Hewlett-Packard Co
35b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
5fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmThis file is part of libunwind.
6fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
7fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmPermission is hereby granted, free of charge, to any person obtaining
8fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidma copy of this software and associated documentation files (the
9fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm"Software"), to deal in the Software without restriction, including
10fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmwithout limitation the rights to use, copy, modify, merge, publish,
11fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmdistribute, sublicense, and/or sell copies of the Software, and to
12fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmpermit persons to whom the Software is furnished to do so, subject to
13fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmthe following conditions:
14fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
15fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmThe above copyright notice and this permission notice shall be
16fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmincluded in all copies or substantial portions of the Software.
17fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
18fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
25fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
26fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm#include "unwind_i.h"
27fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
28fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidmHIDDEN int
295b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidmtdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp,
305b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm		 int write)
31fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm{
325b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  struct dwarf_loc loc;
33fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
34fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm  switch (reg)
35fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm    {
36fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm    case UNW_HPPA_IP:
37fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm      if (write)
385b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm	c->dwarf.ip = *valp;		/* update the IP cache */
395b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm      if (c->dwarf.pi_valid && (*valp < c->dwarf.pi.start_ip
405b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm				|| *valp >= c->dwarf.pi.end_ip))
415b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm	c->dwarf.pi_valid = 0;		/* new IP outside of current proc */
42fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm      break;
43fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
445b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    case UNW_HPPA_CFA:
45fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm    case UNW_HPPA_SP:
46fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm      if (write)
47fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm	return -UNW_EREADONLYREG;
485b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm      *valp = c->dwarf.cfa;
49fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm      return 0;
50fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
515b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm      /* Do the exception-handling register remapping: */
525b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    case UNW_HPPA_EH0: reg = UNW_HPPA_GR + 20; break;
535b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    case UNW_HPPA_EH1: reg = UNW_HPPA_GR + 21; break;
545b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    case UNW_HPPA_EH2: reg = UNW_HPPA_GR + 22; break;
555b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    case UNW_HPPA_EH3: reg = UNW_HPPA_GR + 31; break;
565b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
57fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm    default:
585b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm      break;
59fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm    }
60fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm
615b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  if ((unsigned) (reg - UNW_HPPA_GR) >= 32)
625b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    return -UNW_EBADREG;
635b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
645b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  loc = c->dwarf.loc[reg];
655b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
665b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  if (write)
675b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    return dwarf_put (&c->dwarf, loc, *valp);
685b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  else
695b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    return dwarf_get (&c->dwarf, loc, valp);
705b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm}
715b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
725b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidmHIDDEN int
735b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidmtdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp,
745b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm		   int write)
755b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm{
765b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  struct dwarf_loc loc;
775b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
785b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  if ((unsigned) (reg - UNW_HPPA_FR) >= 32)
795b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    return -UNW_EBADREG;
805b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
815b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm  loc = c->dwarf.loc[reg];
825b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm
83fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm  if (write)
845b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    return dwarf_putfp (&c->dwarf, loc, *valp);
85fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm  else
865b0507c432c378e2e4f99ac78083222b8438cc09hp.com!davidm    return dwarf_getfp (&c->dwarf, loc, valp);
87fd40db490a2aecd38c8c1f9644a7573d7c2edb2chomeip.net!davidm}
88