unwind_i.h revision 9f3360a5464aa1c35c44f418421561f0dc22bb41
17fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* libunwind - a platform-independent unwind library
29f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm   Copyright (C) 2001-2005 Hewlett-Packard Co
37fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
47fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
57fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmThis file is part of libunwind.
67fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
7aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmPermission is hereby granted, free of charge, to any person obtaining
8aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidma copy of this software and associated documentation files (the
9aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidm"Software"), to deal in the Software without restriction, including
10aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmwithout limitation the rights to use, copy, modify, merge, publish,
11aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmdistribute, sublicense, and/or sell copies of the Software, and to
12aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmpermit persons to whom the Software is furnished to do so, subject to
13aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmthe following conditions:
14aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidm
15aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmThe above copyright notice and this permission notice shall be
16aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmincluded in all copies or substantial portions of the Software.
17aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidm
18aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
21aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
22aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24aca3843d6f53f2b36cb66c167a10e3e30e8ebd3amostang.com!davidmWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
257fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
269a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm#ifndef unwind_i_h
279a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm#define unwind_i_h
289a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#include <memory.h>
3058e0e100d1e2cf87432a59a165040d786ca51c0emostang.com!davidm#include <inttypes.h>
314e41f21f65d3c492bf990c8196237fef864997e5hp.com!davidm
321f20cef0573ab930e574675298a12160dcb3f18chp.com!davidm#include <libunwind-ia64.h>
337fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
348045a438de919dc47c951040587aca58f169b1d1mostang.com!davidm#include "ia64/rse.h"
358045a438de919dc47c951040587aca58f169b1d1mostang.com!davidm
3612f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm#include "internal.h"
373fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm
38a2cd0592cab7f153d44d13bc49452c260c82a612(none)!davidm#define IA64_UNW_VER(x)		    ((x) >> 48)
39a2cd0592cab7f153d44d13bc49452c260c82a612(none)!davidm#define IA64_UNW_FLAG_MASK	    ((unw_word_t) 0x0000ffff00000000ULL)
40a2cd0592cab7f153d44d13bc49452c260c82a612(none)!davidm#define IA64_UNW_FLAG_OSMASK	    ((unw_word_t) 0x0000f00000000000ULL)
41a2cd0592cab7f153d44d13bc49452c260c82a612(none)!davidm#define IA64_UNW_FLAG_EHANDLER(x)   ((x) & (unw_word_t) 0x0000000100000000ULL)
42a2cd0592cab7f153d44d13bc49452c260c82a612(none)!davidm#define IA64_UNW_FLAG_UHANDLER(x)   ((x) & (unw_word_t) 0x0000000200000000ULL)
43a2cd0592cab7f153d44d13bc49452c260c82a612(none)!davidm#define IA64_UNW_LENGTH(x)	    ((x) & (unw_word_t) 0x00000000ffffffffULL)
447fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
458fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#ifdef MIN
468fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm# undef MIN
478fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#endif
487fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define MIN(a,b)	((a) < (b) ? (a) : (b))
497fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
5012f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm#include "tdep.h"
517fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
5276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#if !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY)
5376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
549f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidmstatic ALWAYS_INLINE void *
5576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidminlined_uc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
5676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm{
5776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  unw_word_t reg_addr;
5876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  void *addr;
5976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
6076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  switch (reg)
6176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    {
62ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_GR + 0:	addr = &unw.read_only.r0; break;
63ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_NAT + 0:	addr = &unw.read_only.r0; break;
64ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_FR + 0:	addr = &unw.read_only.f0; break;
65ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_FR + 1:
66ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      if (__BYTE_ORDER == __BIG_ENDIAN)
67ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm	addr = &unw.read_only.f1_be;
68ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      else
69ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm	addr = &unw.read_only.f1_le;
70ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      break;
7176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_IP:		addr = &uc->uc_mcontext.sc_br[0]; break;
7276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_CFM:		addr = &uc->uc_mcontext.sc_ar_pfs; break;
7376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_RNAT:	addr = &uc->uc_mcontext.sc_ar_rnat; break;
7476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_UNAT:	addr = &uc->uc_mcontext.sc_ar_unat; break;
7576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_LC:	addr = &uc->uc_mcontext.sc_ar_lc; break;
7676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_FPSR:	addr = &uc->uc_mcontext.sc_ar_fpsr; break;
7776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_PR:		addr = &uc->uc_mcontext.sc_pr; break;
7876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      /* This may look confusing, but it's correct: AR_BSPSTORE needs
7976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         to return the address past the last word written, which is
8076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         stored in sc_ar_bsp.  On the other hand, AR_BSP needs to
8176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         return the address that was in ar.bsp at the time the context
8276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         was captured.  As described in unw_init_local(), sc_ar_bsp is
8376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         (ab-)used for this purpose.  */
8476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_BSP:	addr = &uc->uc_mcontext.sc_rbs_base; break;
8576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_BSPSTORE:	addr = &uc->uc_mcontext.sc_ar_bsp; break;
8676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
8776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 4 ... UNW_IA64_GR + 7:
8876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 12:
8976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_gr[reg - UNW_IA64_GR];
9076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
9176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 4 ... UNW_IA64_NAT + 7:
9376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 12:
9476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_nat;
9576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      reg_addr = (unw_word_t) &uc->uc_mcontext.sc_gr[reg - UNW_IA64_NAT];
9676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      *nat_bitnr = reg - UNW_IA64_NAT;
9776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
9876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_BR + 1 ... UNW_IA64_BR + 5:
10076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_br[reg - UNW_IA64_BR];
10176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
10276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
10376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_FR+ 2 ... UNW_IA64_FR+ 5:
10476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_FR+16 ... UNW_IA64_FR+31:
10576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_fr[reg - UNW_IA64_FR];
10676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
10776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
10876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    default:
10976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = NULL;
11076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    }
11176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  return addr;
11276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm}
11376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
11476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmstatic inline void *
11576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmuc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
11676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm{
11776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  if (__builtin_constant_p (reg))
11876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    return inlined_uc_addr (uc, reg, nat_bitnr);
11976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  else
12076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    return tdep_uc_addr (uc, reg, nat_bitnr);
12176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm}
12276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
123ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm/* Return TRUE if ADDR points inside unw.read_only_reg.  */
124ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
125ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidmstatic inline long
126ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidmia64_read_only_reg (void *addr)
127ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm{
128ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  return ((unsigned long) ((char *) addr - (char *) &unw.read_only)
129ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm	  < sizeof (unw.read_only));
130ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm}
131ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
13276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#endif /* !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY) */
13376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
134a0f46f2a2b2e91b7c90447f79abc7c3ebc354489hp.com!davidm/* Bits 0 and 1 of a location are used to encode its type:
1357fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	bit 0: set if location uses floating-point format.
136d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	bit 1: set if location is a NaT bit on memory stack.  */
1377fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
1387fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_LOC_TYPE_FP		(1 << 0)
1397fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_LOC_TYPE_MEMSTK_NAT	(1 << 1)
1407fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
141d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#ifdef UNW_LOCAL_ONLY
142d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_REG(r,t)	(((r) << 2) | (t))
143d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_ADDR(a,t)	(((a) & ~0x3) | (t))
144d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_UC_ADDR(a,t)	IA64_LOC_ADDR(a, t)
145d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_NULL_LOC		(0)
1467fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
147d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_REG(l)		((l) >> 2)
148d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_ADDR(l)	((l) & ~0x3)
149d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_NULL_LOC(l)	((l) == 0)
150d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_FP_LOC(l)	(((l) & IA64_LOC_TYPE_FP) != 0)
151d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_MEMSTK_NAT(l)	(((l) & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
152d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_REG_LOC(l)	0
153d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_UC_LOC(l)	0
1546a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
15576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#define IA64_REG_LOC(c,r)	((unw_word_t) uc_addr((c)->as_arg, r, NULL))
15676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#define IA64_REG_NAT_LOC(c,r,n)	((unw_word_t) uc_addr((c)->as_arg, r, n))
157481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm#define IA64_FPREG_LOC(c,r)						 \
15876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm	((unw_word_t) uc_addr((c)->as_arg, (r), NULL) | IA64_LOC_TYPE_FP)
1599a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
160481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm# define ia64_find_proc_info(c,ip,n)					\
161481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm	tdep_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n),	\
162481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm			    (c)->as_arg)
16312f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_put_unwind_info(c, pi)	do { ; } while (0)
164e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
165e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm/* Note: the register accessors (ia64_{get,set}{,fp}()) must check for
16676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm   NULL locations because uc_addr() returns NULL for unsaved
167e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm   registers.  */
168e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
169e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
170481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_getfp (struct cursor *c, unw_word_t loc, unw_fpreg_t *val)
171e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
1721b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm  if (IA64_IS_NULL_LOC (loc))
173fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
174c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1752e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
176fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
177d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *val = *(unw_fpreg_t *) IA64_GET_ADDR (loc);
178e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
179e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
180e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
181e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
182481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
183e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
184ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  unw_fpreg_t *addr = (unw_fpreg_t *) IA64_GET_ADDR (loc);
185ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
186ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
187fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
188c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1892e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
190fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
191ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  else if (ia64_read_only_reg (addr))
192ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    {
193ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      Debug (16, "attempt to read-only register\n");
194ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      return -UNW_EREADONLYREG;
195ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    }
196ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  *addr = val;
197e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
198e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
199e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
200e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
201481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
202e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
203ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
204fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
205c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
2062e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
207fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
208d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *val = *(unw_word_t *) IA64_GET_ADDR (loc);
209e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
210e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
211e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
212e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
213481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
214e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
215ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  unw_word_t *addr = (unw_word_t *) IA64_GET_ADDR (loc);
216ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
217ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
218fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
219c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
2202e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
221fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
222ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  else if (ia64_read_only_reg (addr))
223ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    {
224ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      Debug (16, "attempt to read-only register\n");
225ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      return -UNW_EREADONLYREG;
226ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    }
227ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  *addr = val;
228e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
229e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
2306a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
2316a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm#else /* !UNW_LOCAL_ONLY */
2326a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
233d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm/* Bits 0 and 1 of the second word (w1) of a location are used
234d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm   to further distinguish what location we're dealing with:
235d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
236d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm   	bit 0: set if the location is a register
237d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	bit 1: set of the location is accessed via uc_access(3)  */
238d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_TYPE_REG	(1 << 0)
239d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_TYPE_UC	(1 << 1)
240d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
241d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_REG(r,t)	((ia64_loc_t) { ((r) << 2) | (t),	\
242d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm						IA64_LOC_TYPE_REG })
243d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t), 0 })
244d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_UC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t),	\
245d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm						IA64_LOC_TYPE_UC })
2468fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define IA64_LOC_UC_REG(r,a)	((ia64_loc_t) { ((r) << 2),		 \
2478fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm						((a) | IA64_LOC_TYPE_REG \
2488fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm					         | IA64_LOC_TYPE_UC) })
249d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_NULL_LOC		((ia64_loc_t) { 0, 0 })
250d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
251d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_REG(l)		((l).w0 >> 2)
252d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_ADDR(l)	((l).w0 & ~0x3)
2538fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define IA64_GET_AUX_ADDR(l)	((l).w1 & ~0x3)
254d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_NULL_LOC(l)	(((l).w0 | (l).w1) == 0)
255d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_FP_LOC(l)	(((l).w0 & IA64_LOC_TYPE_FP) != 0)
256d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_MEMSTK_NAT(l)	(((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
257d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_REG_LOC(l)	(((l).w1 & IA64_LOC_TYPE_REG) != 0)
258d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_UC_LOC(l)	(((l).w1 & IA64_LOC_TYPE_UC) != 0)
259d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
260d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_REG_LOC(c,r)	IA64_LOC_REG ((r), 0)
261be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm#define IA64_REG_NAT_LOC(c,r,n)	IA64_LOC_REG ((r), 0)
262d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_FPREG_LOC(c,r)	IA64_LOC_REG ((r), IA64_LOC_TYPE_FP)
2639a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
26412f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_find_proc_info(c,ip,n)					\
26512f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
26612f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm				       (c)->as_arg)
26712f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_put_unwind_info(c,pi)					\
26812f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm	(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
2697fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2708fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define ia64_uc_access_reg	UNW_OBJ(uc_access_reg)
2718fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define ia64_uc_access_fpreg	UNW_OBJ(uc_access_fpreg)
2728fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2738fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmextern int ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc,
2748fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm			       unw_word_t *valp, int write);
2758fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmextern int ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc,
2768fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm				 unw_fpreg_t *valp, int write);
2778fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2787fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
279d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val)
2807fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
281d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr;
2827fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  int ret;
2837fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
284ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
2851b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
2861b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
2871b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
2881b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
2891b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
2908fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
2918fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_fpreg (c, loc, val, 0);
2928fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2937fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
294d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc),
295c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				       val, 0, c->as_arg);
2967fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
297d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = IA64_GET_ADDR (loc);
298d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val->raw.bits[0], 0,
299c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				  c->as_arg);
3007fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (ret < 0)
3017fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    return ret;
3027fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
303d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return (*c->as->acc.access_mem) (c->as, addr + 8, &val->raw.bits[1], 0,
304c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				   c->as_arg);
3057fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3067fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3077fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
308d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_putfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t val)
3097fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
310d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr;
3117fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  int ret;
3127fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
313ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
3141b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
3151b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
3161b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
3171b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
3181b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
3198fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3208fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_fpreg (c, loc, &val, 1);
3218fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
3227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
323d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), &val, 1,
324c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				       c->as_arg);
3257fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
326d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = IA64_GET_ADDR (loc);
327d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val.raw.bits[0], 1,
328c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				  c->as_arg);
3297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (ret < 0)
3307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    return ret;
3317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
332d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return (*c->as->acc.access_mem) (c->as, addr + 8, &val.raw.bits[1], 1,
333c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				   c->as_arg);
3347fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3357fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3367fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* Get the 64 data bits from location LOC.  If bit 0 is cleared, LOC
3377fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   is a memory address, otherwise it is a register number.  If the
3387fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   register is a floating-point register, the 64 bits are read from
3397fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   the significand bits.  */
3407fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3417fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
342d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
3437fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
344ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
3451b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
3461b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
3471b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
3481b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
3491b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
3507fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_FP_LOC (loc))
3517fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    {
3527fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      unw_fpreg_t tmp;
3537fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      int ret;
3547fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3557fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      ret = ia64_getfp (c, loc, &tmp);
3567fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      if (ret < 0)
3577fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	return ret;
3587fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
35912f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm      if (c->as->big_endian)
3607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	*val = tmp.raw.bits[1];
3617fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      else
3627fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	*val = tmp.raw.bits[0];
3637fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      return 0;
3647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    }
3657fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3668fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3678fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_reg (c, loc, val, 0);
3688fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
3697fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
370d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), val, 0,
371c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				    c->as_arg);
3727fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  else
373d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), val, 0,
374d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm				    c->as_arg);
3757fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3767fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3777fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
378d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
3797fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
380ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
3811b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
3821b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
3831b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
3841b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
3851b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
3867fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_FP_LOC (loc))
3877fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    {
3887fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      unw_fpreg_t tmp;
3897fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3907fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      memset (&tmp, 0, sizeof (tmp));
39112f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm      if (c->as->big_endian)
3927fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	tmp.raw.bits[1] = val;
3937fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      else
3947fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	tmp.raw.bits[0] = val;
3957fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      return ia64_putfp (c, loc, tmp);
3967fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    }
3977fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3988fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3998fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_reg (c, loc, &val, 1);
4008fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
401c2262737f7313096b2aaa1ebbd3c7ae062005ba2model.com!marky  if (IA64_IS_REG_LOC (loc))
402d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), &val, 1,
403c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				    c->as_arg);
4047fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  else
405d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), &val, 1,
406d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm				    c->as_arg);
4077fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
4087fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4096a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm#endif /* !UNW_LOCAL_ONLY */
4107fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4117fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_unwind_block
4127fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4137fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t header;
4147fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t desc[0];			/* unwind descriptors */
4157fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4167fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    /* Personality routine and language-specific data follow behind
4177fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm       descriptors.  */
4187fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  };
4197fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4207fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmenum ia64_where
4217fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_NONE,	/* register isn't saved at all */
4237fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_GR,	/* register is saved in a general register */
4247fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_FR,	/* register is saved in a floating-point register */
4257fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_BR,	/* register is saved in a branch register */
4267fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_SPREL,	/* register is saved on memstack (sp-relative) */
4277fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_PSPREL,	/* register is saved on memstack (psp-relative) */
4287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    /* At the end of each prologue these locations get resolved to
4307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm       IA64_WHERE_PSPREL and IA64_WHERE_GR, respectively:  */
4317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4327fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_SPILL_HOME, /* register is saved in its spill home */
4337fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_GR_SAVE	/* register is saved in next general register */
4343fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4357fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4367fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_WHEN_NEVER	0x7fffffff
4377fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4387fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_reg_info
4397fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4407fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t val;		/* save location: register number or offset */
4417fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    enum ia64_where where;	/* where the register gets saved */
4427fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int when;			/* when the register gets saved */
4437fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  };
4447fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4456a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidmstruct ia64_labeled_state;	/* opaque structure */
4466a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
4473fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidmstruct ia64_reg_state
4483fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  {
4493fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_state *next;    /* next (outer) element on state stack */
4503fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_info reg[IA64_NUM_PREGS];	/* register save locations */
4513fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4526a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
4537fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_state_record
4547fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4557fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int first_region : 1;	/* is this the first region? */
4567fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int done : 1;		/* are we done scanning descriptors? */
4577fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int any_spills : 1;	/* got any register spills? */
4587fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int in_body : 1;		/* are we inside prologue or body? */
4594e41f21f65d3c492bf990c8196237fef864997e5hp.com!davidm    uint8_t *imask;		/* imask of spill_mask record or NULL */
460d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    uint16_t abi_marker;
461d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
4627fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t pr_val;		/* predicate values */
4637fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t pr_mask;		/* predicate mask */
4647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4657fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    long spill_offset;		/* psp-relative offset for spill base */
4667fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int region_start;
4677fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int region_len;
46877ccc28ad910eee9e0a4488d27ba50c332173ab6mostang.com!davidm    int when_sp_restored;
4697fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int epilogue_count;
4707fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int when_target;
4717fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4727fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    uint8_t gr_save_loc;	/* next save register */
4737fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    uint8_t return_link_reg;	/* branch register used as return pointer */
4747fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4756a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm    struct ia64_labeled_state *labeled_states;
4766a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm    struct ia64_reg_state curr;
4773fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4783fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm
4793fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidmstruct ia64_labeled_state
4803fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  {
4813fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_labeled_state *next;	/* next label (or NULL) */
4823fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    unsigned long label;			/* label for this state */
4833fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_state saved_state;
4843fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4857fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4867fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* Convenience macros: */
487c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm#define ia64_make_proc_info		UNW_OBJ(make_proc_info)
488d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm#define ia64_fetch_proc_info		UNW_OBJ(fetch_proc_info)
489bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_create_state_record	UNW_OBJ(create_state_record)
490bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_free_state_record		UNW_OBJ(free_state_record)
491bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_find_save_locs		UNW_OBJ(find_save_locs)
4924c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm#define ia64_validate_cache		UNW_OBJ(ia64_validate_cache)
4934c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm#define ia64_local_validate_cache	UNW_OBJ(ia64_local_validate_cache)
494126ca1056681a08a28d7c4f16c5689b6ce9174e2hp.com!davidm#define ia64_per_thread_cache		UNW_OBJ(per_thread_cache)
495bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_scratch_loc		UNW_OBJ(scratch_loc)
496bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_local_resume		UNW_OBJ(local_resume)
497481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm#define ia64_local_addr_space_init	UNW_OBJ(local_addr_space_init)
498d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define ia64_strloc			UNW_OBJ(strloc)
4998da298f14f816544da4e06f3167d3f74976f0e41mostang.com!davidm#define ia64_install_cursor		UNW_OBJ(install_cursor)
500d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_switch			UNW_OBJ(rbs_switch)
501d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_find_stacked		UNW_OBJ(rbs_find_stacked)
502d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_cover_and_flush		UNW_OBJ(rbs_cover_and_flush)
5037fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
504481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_make_proc_info (struct cursor *c);
505d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidmextern int ia64_fetch_proc_info (struct cursor *c, unw_word_t ip,
506d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm				 int need_unwind_info);
507d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm/* The proc-info must be valid for IP before this routine can be
508d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm   called:  */
509481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_create_state_record (struct cursor *c,
5107fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm				     struct ia64_state_record *sr);
5117fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmextern int ia64_free_state_record (struct ia64_state_record *sr);
512481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_find_save_locs (struct cursor *c);
5134c61d17686b7d550363c7b264732553d4a543418mostang.com!davidmextern void ia64_validate_cache (unw_addr_space_t as, void *arg);
5144c61d17686b7d550363c7b264732553d4a543418mostang.com!davidmextern int ia64_local_validate_cache (unw_addr_space_t as, void *arg);
515fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidmextern void ia64_local_addr_space_init (void);
516be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidmextern ia64_loc_t ia64_scratch_loc (struct cursor *c, unw_regnum_t reg,
517be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm				    uint8_t *nat_bitnr);
5187fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
51923a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidmextern NORETURN void ia64_install_cursor (struct cursor *c,
52023a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidm					  unw_word_t pri_unat,
5213386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t *extra,
5223386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t bspstore,
5233386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t dirty_size,
5243386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t *dirty_partition,
5253386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t dirty_rnat);
526c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidmextern int ia64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
527c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm			      void *arg);
528749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmextern int rbs_switch (struct cursor *c,
529749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm		       unw_word_t saved_bsp, unw_word_t saved_bspstore,
530d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm		       ia64_loc_t saved_rnat_loc);
5315a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidmextern int rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
532d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm			     ia64_loc_t *locp, ia64_loc_t *rnat_locp);
5333386d284fafde358ed44bfef33edd578864c285fhp.com!davidmextern int rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
5343386d284fafde358ed44bfef33edd578864c285fhp.com!davidm				unw_word_t *dirty_partition,
5353386d284fafde358ed44bfef33edd578864c285fhp.com!davidm				unw_word_t *dirty_rnat,
5363386d284fafde358ed44bfef33edd578864c285fhp.com!davidm				unw_word_t *bspstore);
5375a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
538d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm/* Warning: ia64_strloc() is for debugging only and it is NOT re-entrant! */
539d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmextern const char *ia64_strloc (ia64_loc_t loc);
540d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
5418fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm/* Return true if the register-backing store is inside a ucontext_t
5428fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm   that needs to be accessed via uc_access(3).  */
5438fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
5448fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmstatic inline int
5458fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmrbs_on_uc (struct rbs_area *rbs)
5468fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm{
5478fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  return IA64_IS_UC_LOC (rbs->rnat_loc) && !IA64_IS_REG_LOC (rbs->rnat_loc);
5488fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm}
5498fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
550749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm/* Return true if BSP points to a word that's stored on register
551749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm   backing-store RBS.  */
552749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmstatic inline int
553749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmrbs_contains (struct rbs_area *rbs, unw_word_t bsp)
554749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm{
555749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  int result;
556749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm
557749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  /* Caveat: this takes advantage of unsigned arithmetic.  The full
558749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm     test is (bsp >= rbs->end - rbs->size) && (bsp < rbs->end).  We
559749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm     take advantage of the fact that -n == ~n + 1.  */
560749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  result = bsp - rbs->end > ~rbs->size;
561c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm  Debug (16, "0x%lx in [0x%lx-0x%lx) => %d\n",
5628d4f6ff52d13cf6fc90faf4e455e24337986fe25hp.com!davidm	 (long) bsp, (long) (rbs->end - rbs->size), (long) rbs->end, result);
563749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  return result;
564749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm}
565749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm
566a024a719e1b4d1fde2b28afa886853e4ce573949hp.com!davidmstatic inline ia64_loc_t
567d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmrbs_get_rnat_loc (struct rbs_area *rbs, unw_word_t bsp)
568d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm{
5699f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm  unw_word_t rnat_addr = rse_rnat_addr (bsp);
570d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ia64_loc_t rnat_loc;
571d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
572d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  if (rbs_contains (rbs, rnat_addr))
573d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    {
5748fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm      if (rbs_on_uc (rbs))
575d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0);
576d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm      else
577d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
578d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    }
579d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  else
580d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    rnat_loc = rbs->rnat_loc;
581d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return rnat_loc;
582d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm}
583d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
584a024a719e1b4d1fde2b28afa886853e4ce573949hp.com!davidmstatic inline ia64_loc_t
585d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmrbs_loc (struct rbs_area *rbs, unw_word_t bsp)
586d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm{
5878fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (rbs_on_uc (rbs))
588d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return IA64_LOC_UC_ADDR (bsp, 0);
589d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  else
590d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return IA64_LOC_ADDR (bsp, 0);
591d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm}
592d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
5935a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidmstatic inline int
594eacf0e24e15a6793a88d41b3294c2c1ee43a097emostang.com!davidmia64_get_stacked (struct cursor *c, unw_word_t reg,
595d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm		  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
5965a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm{
5975a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  struct rbs_area *rbs = c->rbs_area + c->rbs_curr;
598d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr, regs_to_skip = reg - 32;
5995a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  int ret = 0;
6005a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
601eacf0e24e15a6793a88d41b3294c2c1ee43a097emostang.com!davidm  assert (reg >= 32 && reg < 128);
6025a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
6039f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm  addr = rse_skip_regs (c->bsp, regs_to_skip);
6047057901782a226fa2c99bf4bf1d2dcb7c0c8c155mostang.com!davidm  if (locp)
605d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    *locp = rbs_loc (rbs, addr);
6065a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  if (rnat_locp)
607d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    *rnat_locp = rbs_get_rnat_loc (rbs, addr);
6085a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
609d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  if (!rbs_contains (rbs, addr))
6105a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm    ret = rbs_find_stacked (c, regs_to_skip, locp, rnat_locp);
6115a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  return ret;
6125a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm}
6139a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
614be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm/* The UNaT slot # calculation is identical to the one for RNaT slots,
615be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm   but for readability/clarity, we don't want to use
616be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm   ia64_rnat_slot_num() directly.  */
6179f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm#define ia64_unat_slot_num(addr)	rse_slot_num(addr)
618be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm
6197fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* XXX should be in glibc: */
6207fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#ifndef IA64_SC_FLAG_ONSTACK
6217fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_ONSTACK_BIT    0 /* running on signal stack? */
6227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_IN_SYSCALL_BIT 1 /* did signal interrupt a syscall? */
6237fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_FPH_VALID_BIT  2 /* is state in f[32]-f[127] valid? */
6247fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
6257fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_ONSTACK		(1 << IA64_SC_FLAG_ONSTACK_BIT)
6267fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_IN_SYSCALL	(1 << IA64_SC_FLAG_IN_SYSCALL_BIT)
6277fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_FPH_VALID		(1 << IA64_SC_FLAG_FPH_VALID_BIT)
6287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#endif
6299a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
6309a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm#endif /* unwind_i_h */
631