unwind_i.h revision 8045a438de919dc47c951040587aca58f169b1d1
17fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* libunwind - a platform-independent unwind library
24c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm   Copyright (C) 2001-2004 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
5476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmstatic inline 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    {
6276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 0:	addr = &unw.r0; break;
6376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 0:	addr = &unw.r0; break;
6476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_IP:		addr = &uc->uc_mcontext.sc_br[0]; break;
6576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_CFM:		addr = &uc->uc_mcontext.sc_ar_pfs; break;
6676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_RNAT:	addr = &uc->uc_mcontext.sc_ar_rnat; break;
6776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_UNAT:	addr = &uc->uc_mcontext.sc_ar_unat; break;
6876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_LC:	addr = &uc->uc_mcontext.sc_ar_lc; break;
6976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_FPSR:	addr = &uc->uc_mcontext.sc_ar_fpsr; break;
7076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_PR:		addr = &uc->uc_mcontext.sc_pr; break;
7176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      /* This may look confusing, but it's correct: AR_BSPSTORE needs
7276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         to return the address past the last word written, which is
7376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         stored in sc_ar_bsp.  On the other hand, AR_BSP needs to
7476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         return the address that was in ar.bsp at the time the context
7576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         was captured.  As described in unw_init_local(), sc_ar_bsp is
7676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm         (ab-)used for this purpose.  */
7776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_BSP:	addr = &uc->uc_mcontext.sc_rbs_base; break;
7876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_BSPSTORE:	addr = &uc->uc_mcontext.sc_ar_bsp; break;
7976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
8076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 4 ... UNW_IA64_GR + 7:
8176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 12:
8276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_gr[reg - UNW_IA64_GR];
8376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
8476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
8576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 4 ... UNW_IA64_NAT + 7:
8676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 12:
8776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_nat;
8876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      reg_addr = (unw_word_t) &uc->uc_mcontext.sc_gr[reg - UNW_IA64_NAT];
8976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      *nat_bitnr = reg - UNW_IA64_NAT;
9076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
9176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_BR + 1 ... UNW_IA64_BR + 5:
9376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_br[reg - UNW_IA64_BR];
9476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
9576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_FR+ 2 ... UNW_IA64_FR+ 5:
9776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_FR+16 ... UNW_IA64_FR+31:
9876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_fr[reg - UNW_IA64_FR];
9976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
10076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
10176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    default:
10276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = NULL;
10376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    }
10476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  return addr;
10576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm}
10676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
10776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmstatic inline void *
10876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmuc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
10976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm{
11076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  if (__builtin_constant_p (reg))
11176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    return inlined_uc_addr (uc, reg, nat_bitnr);
11276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  else
11376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    return tdep_uc_addr (uc, reg, nat_bitnr);
11476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm}
11576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
11676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#endif /* !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY) */
11776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
118a0f46f2a2b2e91b7c90447f79abc7c3ebc354489hp.com!davidm/* Bits 0 and 1 of a location are used to encode its type:
1197fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	bit 0: set if location uses floating-point format.
120d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	bit 1: set if location is a NaT bit on memory stack.  */
1217fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
1227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_LOC_TYPE_FP		(1 << 0)
1237fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_LOC_TYPE_MEMSTK_NAT	(1 << 1)
1247fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
125d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#ifdef UNW_LOCAL_ONLY
126d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_REG(r,t)	(((r) << 2) | (t))
127d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_ADDR(a,t)	(((a) & ~0x3) | (t))
128d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_UC_ADDR(a,t)	IA64_LOC_ADDR(a, t)
129d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_NULL_LOC		(0)
1307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
131d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_REG(l)		((l) >> 2)
132d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_ADDR(l)	((l) & ~0x3)
133d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_NULL_LOC(l)	((l) == 0)
134d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_FP_LOC(l)	(((l) & IA64_LOC_TYPE_FP) != 0)
135d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_MEMSTK_NAT(l)	(((l) & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
136d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_REG_LOC(l)	0
137d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_UC_LOC(l)	0
1386a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
13976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#define IA64_REG_LOC(c,r)	((unw_word_t) uc_addr((c)->as_arg, r, NULL))
14076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#define IA64_REG_NAT_LOC(c,r,n)	((unw_word_t) uc_addr((c)->as_arg, r, n))
141481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm#define IA64_FPREG_LOC(c,r)						 \
14276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm	((unw_word_t) uc_addr((c)->as_arg, (r), NULL) | IA64_LOC_TYPE_FP)
1439a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
144481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm# define ia64_find_proc_info(c,ip,n)					\
145481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm	tdep_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n),	\
146481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm			    (c)->as_arg)
14712f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_put_unwind_info(c, pi)	do { ; } while (0)
148e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
149e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm/* Note: the register accessors (ia64_{get,set}{,fp}()) must check for
15076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm   NULL locations because uc_addr() returns NULL for unsaved
151e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm   registers.  */
152e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
153e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
154481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_getfp (struct cursor *c, unw_word_t loc, unw_fpreg_t *val)
155e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
156e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  if (!loc)
157fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
158c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1592e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
160fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
161d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *val = *(unw_fpreg_t *) IA64_GET_ADDR (loc);
162e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
163e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
164e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
165e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
166481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
167e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
168e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  if (!loc)
169fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
170c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1712e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
172fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
173d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *(unw_fpreg_t *) IA64_GET_ADDR (loc) = val;
174e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
175e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
176e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
177e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
178481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
179e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
180e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  if (!loc)
181fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
182c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1832e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
184fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
185d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *val = *(unw_word_t *) IA64_GET_ADDR (loc);
186e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
187e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
188e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
189e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
190481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
191e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
192e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  if (!loc)
193fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
194c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1952e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
196fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
197d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *(unw_word_t *) IA64_GET_ADDR (loc) = (val);
198e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
199e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
2006a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
2016a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm#else /* !UNW_LOCAL_ONLY */
2026a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
203d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm/* Bits 0 and 1 of the second word (w1) of a location are used
204d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm   to further distinguish what location we're dealing with:
205d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
206d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm   	bit 0: set if the location is a register
207d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	bit 1: set of the location is accessed via uc_access(3)  */
208d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_TYPE_REG	(1 << 0)
209d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_TYPE_UC	(1 << 1)
210d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
211d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_REG(r,t)	((ia64_loc_t) { ((r) << 2) | (t),	\
212d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm						IA64_LOC_TYPE_REG })
213d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t), 0 })
214d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_UC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t),	\
215d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm						IA64_LOC_TYPE_UC })
2168fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define IA64_LOC_UC_REG(r,a)	((ia64_loc_t) { ((r) << 2),		 \
2178fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm						((a) | IA64_LOC_TYPE_REG \
2188fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm					         | IA64_LOC_TYPE_UC) })
219d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_NULL_LOC		((ia64_loc_t) { 0, 0 })
220d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
221d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_REG(l)		((l).w0 >> 2)
222d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_ADDR(l)	((l).w0 & ~0x3)
2238fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define IA64_GET_AUX_ADDR(l)	((l).w1 & ~0x3)
224d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_NULL_LOC(l)	(((l).w0 | (l).w1) == 0)
225d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_FP_LOC(l)	(((l).w0 & IA64_LOC_TYPE_FP) != 0)
226d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_MEMSTK_NAT(l)	(((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
227d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_REG_LOC(l)	(((l).w1 & IA64_LOC_TYPE_REG) != 0)
228d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_UC_LOC(l)	(((l).w1 & IA64_LOC_TYPE_UC) != 0)
229d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
230d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_REG_LOC(c,r)	IA64_LOC_REG ((r), 0)
231be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm#define IA64_REG_NAT_LOC(c,r,n)	IA64_LOC_REG ((r), 0)
232d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_FPREG_LOC(c,r)	IA64_LOC_REG ((r), IA64_LOC_TYPE_FP)
2339a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
23412f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_find_proc_info(c,ip,n)					\
23512f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
23612f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm				       (c)->as_arg)
23712f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_put_unwind_info(c,pi)					\
23812f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm	(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
2397fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2408fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define ia64_uc_access_reg	UNW_OBJ(uc_access_reg)
2418fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define ia64_uc_access_fpreg	UNW_OBJ(uc_access_fpreg)
2428fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2438fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmextern int ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc,
2448fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm			       unw_word_t *valp, int write);
2458fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmextern int ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc,
2468fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm				 unw_fpreg_t *valp, int write);
2478fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2487fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
249d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val)
2507fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
251d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr;
2527fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  int ret;
2537fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2548fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
2558fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_fpreg (c, loc, val, 0);
2568fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2577fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
258d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc),
259c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				       val, 0, c->as_arg);
2607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
261d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = IA64_GET_ADDR (loc);
262d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val->raw.bits[0], 0,
263c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				  c->as_arg);
2647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (ret < 0)
2657fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    return ret;
2667fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
267d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return (*c->as->acc.access_mem) (c->as, addr + 8, &val->raw.bits[1], 0,
268c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				   c->as_arg);
2697fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
2707fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2717fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
272d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_putfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t val)
2737fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
274d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr;
2757fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  int ret;
2767fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2778fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
2788fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_fpreg (c, loc, &val, 1);
2798fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2807fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
281d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), &val, 1,
282c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				       c->as_arg);
2837fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
284d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = IA64_GET_ADDR (loc);
285d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val.raw.bits[0], 1,
286c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				  c->as_arg);
2877fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (ret < 0)
2887fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    return ret;
2897fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
290d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return (*c->as->acc.access_mem) (c->as, addr + 8, &val.raw.bits[1], 1,
291c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				   c->as_arg);
2927fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
2937fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2947fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* Get the 64 data bits from location LOC.  If bit 0 is cleared, LOC
2957fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   is a memory address, otherwise it is a register number.  If the
2967fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   register is a floating-point register, the 64 bits are read from
2977fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   the significand bits.  */
2987fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2997fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
300d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
3017fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
3027fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_FP_LOC (loc))
3037fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    {
3047fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      unw_fpreg_t tmp;
3057fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      int ret;
3067fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3077fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      ret = ia64_getfp (c, loc, &tmp);
3087fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      if (ret < 0)
3097fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	return ret;
3107fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
31112f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm      if (c->as->big_endian)
3127fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	*val = tmp.raw.bits[1];
3137fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      else
3147fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	*val = tmp.raw.bits[0];
3157fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      return 0;
3167fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    }
3177fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3188fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3198fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_reg (c, loc, val, 0);
3208fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
3217fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
322d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), val, 0,
323c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				    c->as_arg);
3247fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  else
325d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), val, 0,
326d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm				    c->as_arg);
3277fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
330d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
3317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
3327fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_FP_LOC (loc))
3337fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    {
3347fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      unw_fpreg_t tmp;
3357fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3367fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      memset (&tmp, 0, sizeof (tmp));
33712f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm      if (c->as->big_endian)
3387fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	tmp.raw.bits[1] = val;
3397fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      else
3407fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	tmp.raw.bits[0] = val;
3417fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      return ia64_putfp (c, loc, tmp);
3427fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    }
3437fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3448fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3458fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_reg (c, loc, &val, 1);
3468fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
347c2262737f7313096b2aaa1ebbd3c7ae062005ba2model.com!marky  if (IA64_IS_REG_LOC (loc))
348d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), &val, 1,
349c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				    c->as_arg);
3507fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  else
351d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), &val, 1,
352d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm				    c->as_arg);
3537fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3547fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3556a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm#endif /* !UNW_LOCAL_ONLY */
3567fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3577fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_unwind_block
3587fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
3597fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t header;
3607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t desc[0];			/* unwind descriptors */
3617fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3627fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    /* Personality routine and language-specific data follow behind
3637fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm       descriptors.  */
3647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  };
3657fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3667fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmenum ia64_where
3677fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
3687fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_NONE,	/* register isn't saved at all */
3697fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_GR,	/* register is saved in a general register */
3707fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_FR,	/* register is saved in a floating-point register */
3717fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_BR,	/* register is saved in a branch register */
3727fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_SPREL,	/* register is saved on memstack (sp-relative) */
3737fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_PSPREL,	/* register is saved on memstack (psp-relative) */
3747fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3757fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    /* At the end of each prologue these locations get resolved to
3767fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm       IA64_WHERE_PSPREL and IA64_WHERE_GR, respectively:  */
3777fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3787fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_SPILL_HOME, /* register is saved in its spill home */
3797fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_GR_SAVE	/* register is saved in next general register */
3803fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
3817fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3827fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_WHEN_NEVER	0x7fffffff
3837fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3847fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_reg_info
3857fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
3867fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t val;		/* save location: register number or offset */
3877fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    enum ia64_where where;	/* where the register gets saved */
3887fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int when;			/* when the register gets saved */
3897fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  };
3907fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3916a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidmstruct ia64_labeled_state;	/* opaque structure */
3926a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
3933fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidmstruct ia64_reg_state
3943fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  {
3953fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_state *next;    /* next (outer) element on state stack */
3963fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_info reg[IA64_NUM_PREGS];	/* register save locations */
3973fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
3986a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
3997fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_state_record
4007fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4017fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int first_region : 1;	/* is this the first region? */
4027fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int done : 1;		/* are we done scanning descriptors? */
4037fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int any_spills : 1;	/* got any register spills? */
4047fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int in_body : 1;		/* are we inside prologue or body? */
4054e41f21f65d3c492bf990c8196237fef864997e5hp.com!davidm    uint8_t *imask;		/* imask of spill_mask record or NULL */
406d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    uint16_t abi_marker;
407d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
4087fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t pr_val;		/* predicate values */
4097fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t pr_mask;		/* predicate mask */
4107fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4117fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    long spill_offset;		/* psp-relative offset for spill base */
4127fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int region_start;
4137fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int region_len;
41477ccc28ad910eee9e0a4488d27ba50c332173ab6mostang.com!davidm    int when_sp_restored;
4157fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int epilogue_count;
4167fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int when_target;
4177fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4187fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    uint8_t gr_save_loc;	/* next save register */
4197fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    uint8_t return_link_reg;	/* branch register used as return pointer */
4207fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4216a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm    struct ia64_labeled_state *labeled_states;
4226a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm    struct ia64_reg_state curr;
4233fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4243fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm
4253fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidmstruct ia64_labeled_state
4263fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  {
4273fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_labeled_state *next;	/* next label (or NULL) */
4283fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    unsigned long label;			/* label for this state */
4293fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_state saved_state;
4303fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4327fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* Convenience macros: */
433c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm#define ia64_make_proc_info		UNW_OBJ(make_proc_info)
434d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm#define ia64_fetch_proc_info		UNW_OBJ(fetch_proc_info)
435bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_create_state_record	UNW_OBJ(create_state_record)
436bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_free_state_record		UNW_OBJ(free_state_record)
437bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_find_save_locs		UNW_OBJ(find_save_locs)
4384c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm#define ia64_validate_cache		UNW_OBJ(ia64_validate_cache)
4394c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm#define ia64_local_validate_cache	UNW_OBJ(ia64_local_validate_cache)
440126ca1056681a08a28d7c4f16c5689b6ce9174e2hp.com!davidm#define ia64_per_thread_cache		UNW_OBJ(per_thread_cache)
441bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_scratch_loc		UNW_OBJ(scratch_loc)
442bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_local_resume		UNW_OBJ(local_resume)
443481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm#define ia64_local_addr_space_init	UNW_OBJ(local_addr_space_init)
444d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define ia64_strloc			UNW_OBJ(strloc)
4458da298f14f816544da4e06f3167d3f74976f0e41mostang.com!davidm#define ia64_install_cursor		UNW_OBJ(install_cursor)
446d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_switch			UNW_OBJ(rbs_switch)
447d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_find_stacked		UNW_OBJ(rbs_find_stacked)
448d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_cover_and_flush		UNW_OBJ(rbs_cover_and_flush)
4497fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
450481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_make_proc_info (struct cursor *c);
451d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidmextern int ia64_fetch_proc_info (struct cursor *c, unw_word_t ip,
452d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm				 int need_unwind_info);
453d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm/* The proc-info must be valid for IP before this routine can be
454d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm   called:  */
455481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_create_state_record (struct cursor *c,
4567fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm				     struct ia64_state_record *sr);
4577fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmextern int ia64_free_state_record (struct ia64_state_record *sr);
458481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_find_save_locs (struct cursor *c);
4594c61d17686b7d550363c7b264732553d4a543418mostang.com!davidmextern void ia64_validate_cache (unw_addr_space_t as, void *arg);
4604c61d17686b7d550363c7b264732553d4a543418mostang.com!davidmextern int ia64_local_validate_cache (unw_addr_space_t as, void *arg);
461fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidmextern void ia64_local_addr_space_init (void);
462be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidmextern ia64_loc_t ia64_scratch_loc (struct cursor *c, unw_regnum_t reg,
463be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm				    uint8_t *nat_bitnr);
4647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
46523a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidmextern NORETURN void ia64_install_cursor (struct cursor *c,
46623a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidm					  unw_word_t pri_unat,
46723a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidm					  unw_word_t *extra);
468c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidmextern int ia64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
469c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm			      void *arg);
470749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmextern int rbs_switch (struct cursor *c,
471749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm		       unw_word_t saved_bsp, unw_word_t saved_bspstore,
472d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm		       ia64_loc_t saved_rnat_loc);
4735a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidmextern int rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
474d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm			     ia64_loc_t *locp, ia64_loc_t *rnat_locp);
47532a1dc6be5b6caed9a3c366dab941e20b3f39ca1mostang.com!davidmextern int rbs_cover_and_flush (struct cursor *c, unw_word_t nregs);
4765a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
477d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm/* Warning: ia64_strloc() is for debugging only and it is NOT re-entrant! */
478d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmextern const char *ia64_strloc (ia64_loc_t loc);
479d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
4808fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm/* Return true if the register-backing store is inside a ucontext_t
4818fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm   that needs to be accessed via uc_access(3).  */
4828fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
4838fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmstatic inline int
4848fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmrbs_on_uc (struct rbs_area *rbs)
4858fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm{
4868fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  return IA64_IS_UC_LOC (rbs->rnat_loc) && !IA64_IS_REG_LOC (rbs->rnat_loc);
4878fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm}
4888fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
489749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm/* Return true if BSP points to a word that's stored on register
490749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm   backing-store RBS.  */
491749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmstatic inline int
492749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmrbs_contains (struct rbs_area *rbs, unw_word_t bsp)
493749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm{
494749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  int result;
495749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm
496749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  /* Caveat: this takes advantage of unsigned arithmetic.  The full
497749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm     test is (bsp >= rbs->end - rbs->size) && (bsp < rbs->end).  We
498749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm     take advantage of the fact that -n == ~n + 1.  */
499749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  result = bsp - rbs->end > ~rbs->size;
500c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm  Debug (16, "0x%lx in [0x%lx-0x%lx) => %d\n",
5018d4f6ff52d13cf6fc90faf4e455e24337986fe25hp.com!davidm	 (long) bsp, (long) (rbs->end - rbs->size), (long) rbs->end, result);
502749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  return result;
503749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm}
504749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm
505a024a719e1b4d1fde2b28afa886853e4ce573949hp.com!davidmstatic inline ia64_loc_t
506d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmrbs_get_rnat_loc (struct rbs_area *rbs, unw_word_t bsp)
507d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm{
508d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t rnat_addr = ia64_rse_rnat_addr (bsp);
509d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ia64_loc_t rnat_loc;
510d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
511d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  if (rbs_contains (rbs, rnat_addr))
512d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    {
5138fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm      if (rbs_on_uc (rbs))
514d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0);
515d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm      else
516d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
517d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    }
518d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  else
519d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    rnat_loc = rbs->rnat_loc;
520d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return rnat_loc;
521d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm}
522d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
523a024a719e1b4d1fde2b28afa886853e4ce573949hp.com!davidmstatic inline ia64_loc_t
524d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmrbs_loc (struct rbs_area *rbs, unw_word_t bsp)
525d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm{
5268fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (rbs_on_uc (rbs))
527d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return IA64_LOC_UC_ADDR (bsp, 0);
528d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  else
529d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return IA64_LOC_ADDR (bsp, 0);
530d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm}
531d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
5325a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidmstatic inline int
533eacf0e24e15a6793a88d41b3294c2c1ee43a097emostang.com!davidmia64_get_stacked (struct cursor *c, unw_word_t reg,
534d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm		  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
5355a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm{
5365a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  struct rbs_area *rbs = c->rbs_area + c->rbs_curr;
537d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr, regs_to_skip = reg - 32;
5385a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  int ret = 0;
5395a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
540eacf0e24e15a6793a88d41b3294c2c1ee43a097emostang.com!davidm  assert (reg >= 32 && reg < 128);
5415a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
542d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = ia64_rse_skip_regs (c->bsp, regs_to_skip);
5437057901782a226fa2c99bf4bf1d2dcb7c0c8c155mostang.com!davidm  if (locp)
544d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    *locp = rbs_loc (rbs, addr);
5455a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  if (rnat_locp)
546d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    *rnat_locp = rbs_get_rnat_loc (rbs, addr);
5475a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
548d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  if (!rbs_contains (rbs, addr))
5495a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm    ret = rbs_find_stacked (c, regs_to_skip, locp, rnat_locp);
5505a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  return ret;
5515a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm}
5529a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
553be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm/* The UNaT slot # calculation is identical to the one for RNaT slots,
554be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm   but for readability/clarity, we don't want to use
555be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm   ia64_rnat_slot_num() directly.  */
556be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm#define ia64_unat_slot_num(addr)	ia64_rse_slot_num(addr)
557be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm
5587fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* XXX should be in glibc: */
5597fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#ifndef IA64_SC_FLAG_ONSTACK
5607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_ONSTACK_BIT    0 /* running on signal stack? */
5617fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_IN_SYSCALL_BIT 1 /* did signal interrupt a syscall? */
5627fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_FPH_VALID_BIT  2 /* is state in f[32]-f[127] valid? */
5637fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
5647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_ONSTACK		(1 << IA64_SC_FLAG_ONSTACK_BIT)
5657fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_IN_SYSCALL	(1 << IA64_SC_FLAG_IN_SYSCALL_BIT)
5667fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_FPH_VALID		(1 << IA64_SC_FLAG_FPH_VALID_BIT)
5677fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#endif
5689a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
5699a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm#endif /* unwind_i_h */
570