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
29ded94b98ff3534a3c394591f4b254b1af6f0711cTommi Rantala#include <string.h>
3058e0e100d1e2cf87432a59a165040d786ca51c0emostang.com!davidm#include <inttypes.h>
314e41f21f65d3c492bf990c8196237fef864997e5hp.com!davidm
321f20cef0573ab930e574675298a12160dcb3f18chp.com!davidm#include <libunwind-ia64.h>
337fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
341228462adc4d1c89448def59778416adce1e986bhp.com!davidm#include "rse.h"
358045a438de919dc47c951040587aca58f169b1d1mostang.com!davidm
361228462adc4d1c89448def59778416adce1e986bhp.com!davidm#include "libunwind_i.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
5076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#if !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY)
5176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
529f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidmstatic ALWAYS_INLINE void *
5376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidminlined_uc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
5476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm{
5576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  unw_word_t reg_addr;
5676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  void *addr;
5776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
5876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  switch (reg)
5976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    {
60ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_GR + 0:	addr = &unw.read_only.r0; break;
61ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_NAT + 0:	addr = &unw.read_only.r0; break;
62ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_FR + 0:	addr = &unw.read_only.f0; break;
63ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    case UNW_IA64_FR + 1:
64ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      if (__BYTE_ORDER == __BIG_ENDIAN)
65ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm	addr = &unw.read_only.f1_be;
66ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      else
67ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm	addr = &unw.read_only.f1_le;
68ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      break;
6976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_IP:		addr = &uc->uc_mcontext.sc_br[0]; break;
7076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_CFM:		addr = &uc->uc_mcontext.sc_ar_pfs; break;
7176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_RNAT:	addr = &uc->uc_mcontext.sc_ar_rnat; break;
7276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_UNAT:	addr = &uc->uc_mcontext.sc_ar_unat; break;
7376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_LC:	addr = &uc->uc_mcontext.sc_ar_lc; break;
7476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_FPSR:	addr = &uc->uc_mcontext.sc_ar_fpsr; break;
7576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_PR:		addr = &uc->uc_mcontext.sc_pr; break;
7676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_AR_BSPSTORE:	addr = &uc->uc_mcontext.sc_ar_bsp; break;
7776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
7876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 4 ... UNW_IA64_GR + 7:
7976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_GR + 12:
8076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_gr[reg - UNW_IA64_GR];
8176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
8276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
8376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 4 ... UNW_IA64_NAT + 7:
8476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_NAT + 12:
8576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_nat;
8676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      reg_addr = (unw_word_t) &uc->uc_mcontext.sc_gr[reg - UNW_IA64_NAT];
8776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      *nat_bitnr = reg - UNW_IA64_NAT;
8876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
8976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_BR + 1 ... UNW_IA64_BR + 5:
9176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_br[reg - UNW_IA64_BR];
9276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
9376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_FR+ 2 ... UNW_IA64_FR+ 5:
9576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    case UNW_IA64_FR+16 ... UNW_IA64_FR+31:
9676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = &uc->uc_mcontext.sc_fr[reg - UNW_IA64_FR];
9776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      break;
9876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
9976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    default:
10076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm      addr = NULL;
10176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    }
10276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  return addr;
10376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm}
10476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
10576b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmstatic inline void *
10676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidmuc_addr (ucontext_t *uc, int reg, uint8_t *nat_bitnr)
10776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm{
10876b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  if (__builtin_constant_p (reg))
10976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    return inlined_uc_addr (uc, reg, nat_bitnr);
11076b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm  else
11176b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm    return tdep_uc_addr (uc, reg, nat_bitnr);
11276b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm}
11376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
114ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm/* Return TRUE if ADDR points inside unw.read_only_reg.  */
115ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
116ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidmstatic inline long
117ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidmia64_read_only_reg (void *addr)
118ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm{
119ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  return ((unsigned long) ((char *) addr - (char *) &unw.read_only)
120ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm	  < sizeof (unw.read_only));
121ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm}
122ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
12376b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#endif /* !defined(HAVE_SYS_UC_ACCESS_H) && !defined(UNW_REMOTE_ONLY) */
12476b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm
125a0f46f2a2b2e91b7c90447f79abc7c3ebc354489hp.com!davidm/* Bits 0 and 1 of a location are used to encode its type:
1267fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	bit 0: set if location uses floating-point format.
127d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	bit 1: set if location is a NaT bit on memory stack.  */
1287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
1297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_LOC_TYPE_FP		(1 << 0)
1307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_LOC_TYPE_MEMSTK_NAT	(1 << 1)
1317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
132d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#ifdef UNW_LOCAL_ONLY
133d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_REG(r,t)	(((r) << 2) | (t))
134d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_ADDR(a,t)	(((a) & ~0x3) | (t))
135d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_UC_ADDR(a,t)	IA64_LOC_ADDR(a, t)
136d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_NULL_LOC		(0)
1377fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
138d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_REG(l)		((l) >> 2)
139d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_ADDR(l)	((l) & ~0x3)
140d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_NULL_LOC(l)	((l) == 0)
141d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_FP_LOC(l)	(((l) & IA64_LOC_TYPE_FP) != 0)
142d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_MEMSTK_NAT(l)	(((l) & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
143d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_REG_LOC(l)	0
144d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_UC_LOC(l)	0
1456a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
14676b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#define IA64_REG_LOC(c,r)	((unw_word_t) uc_addr((c)->as_arg, r, NULL))
14776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm#define IA64_REG_NAT_LOC(c,r,n)	((unw_word_t) uc_addr((c)->as_arg, r, n))
148481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm#define IA64_FPREG_LOC(c,r)						 \
14976b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm	((unw_word_t) uc_addr((c)->as_arg, (r), NULL) | IA64_LOC_TYPE_FP)
1509a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
151481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm# define ia64_find_proc_info(c,ip,n)					\
152481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm	tdep_find_proc_info(unw_local_addr_space, (ip), &(c)->pi, (n),	\
153481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm			    (c)->as_arg)
15412f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_put_unwind_info(c, pi)	do { ; } while (0)
155e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
156e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm/* Note: the register accessors (ia64_{get,set}{,fp}()) must check for
15776b4736bde2a0a3ecd369a0e4faa90537f1e8dd5mostang.com!davidm   NULL locations because uc_addr() returns NULL for unsaved
158e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm   registers.  */
159e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
160e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
161481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_getfp (struct cursor *c, unw_word_t loc, unw_fpreg_t *val)
162e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
1631b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm  if (IA64_IS_NULL_LOC (loc))
164fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
165c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1662e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
167fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
168d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *val = *(unw_fpreg_t *) IA64_GET_ADDR (loc);
169e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
170e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
171e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
172e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
173481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_putfp (struct cursor *c, unw_word_t loc, unw_fpreg_t val)
174e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
175ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  unw_fpreg_t *addr = (unw_fpreg_t *) IA64_GET_ADDR (loc);
176ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
177ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
178fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
179c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1802e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
181fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
182ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  else if (ia64_read_only_reg (addr))
183ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    {
184ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      Debug (16, "attempt to read-only register\n");
185ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      return -UNW_EREADONLYREG;
186ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    }
187ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  *addr = val;
188e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
189e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
190e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
191e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
192481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_get (struct cursor *c, unw_word_t loc, unw_word_t *val)
193e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
194ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
195fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
196c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
1972e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
198fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
199d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  *val = *(unw_word_t *) IA64_GET_ADDR (loc);
200e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
201e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
202e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm
203e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidmstatic inline int
204481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmia64_put (struct cursor *c, unw_word_t loc, unw_word_t val)
205e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm{
206ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  unw_word_t *addr = (unw_word_t *) IA64_GET_ADDR (loc);
207ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm
208ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
209fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    {
210c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm      Debug (16, "access to unsaved register\n");
2112e65e639a58c1831ba97066f2974483148eeed4dmostang.com!davidm      return -UNW_EBADREG;
212fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidm    }
213ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  else if (ia64_read_only_reg (addr))
214ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    {
215ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      Debug (16, "attempt to read-only register\n");
216ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm      return -UNW_EREADONLYREG;
217ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm    }
218ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  *addr = val;
219e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm  return 0;
220e633236827c579711822c22b65f70965f8bd0cb2mostang.com!davidm}
2216a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
2226a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm#else /* !UNW_LOCAL_ONLY */
2236a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
224d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm/* Bits 0 and 1 of the second word (w1) of a location are used
225d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm   to further distinguish what location we're dealing with:
226d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
227d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm   	bit 0: set if the location is a register
228d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	bit 1: set of the location is accessed via uc_access(3)  */
229d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_TYPE_REG	(1 << 0)
230d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_TYPE_UC	(1 << 1)
231d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
232d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_REG(r,t)	((ia64_loc_t) { ((r) << 2) | (t),	\
233d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm						IA64_LOC_TYPE_REG })
234d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t), 0 })
235d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_LOC_UC_ADDR(a,t)	((ia64_loc_t) { ((a) & ~0x3) | (t),	\
236d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm						IA64_LOC_TYPE_UC })
2378fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define IA64_LOC_UC_REG(r,a)	((ia64_loc_t) { ((r) << 2),		 \
2388fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm						((a) | IA64_LOC_TYPE_REG \
2398fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm					         | IA64_LOC_TYPE_UC) })
240d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_NULL_LOC		((ia64_loc_t) { 0, 0 })
241d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
242d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_REG(l)		((l).w0 >> 2)
243d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_GET_ADDR(l)	((l).w0 & ~0x3)
2448fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define IA64_GET_AUX_ADDR(l)	((l).w1 & ~0x3)
245d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_NULL_LOC(l)	(((l).w0 | (l).w1) == 0)
246d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_FP_LOC(l)	(((l).w0 & IA64_LOC_TYPE_FP) != 0)
247d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_MEMSTK_NAT(l)	(((l).w0 & IA64_LOC_TYPE_MEMSTK_NAT) != 0)
248d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_REG_LOC(l)	(((l).w1 & IA64_LOC_TYPE_REG) != 0)
249d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_IS_UC_LOC(l)	(((l).w1 & IA64_LOC_TYPE_UC) != 0)
250d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
251d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_REG_LOC(c,r)	IA64_LOC_REG ((r), 0)
252be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm#define IA64_REG_NAT_LOC(c,r,n)	IA64_LOC_REG ((r), 0)
253d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define IA64_FPREG_LOC(c,r)	IA64_LOC_REG ((r), IA64_LOC_TYPE_FP)
2549a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
25512f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_find_proc_info(c,ip,n)					\
25612f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm	(*(c)->as->acc.find_proc_info)((c)->as, (ip), &(c)->pi, (n),	\
25712f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm				       (c)->as_arg)
25812f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm# define ia64_put_unwind_info(c,pi)					\
25912f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm	(*(c)->as->acc.put_unwind_info)((c)->as, (pi), (c)->as_arg)
2607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2618fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define ia64_uc_access_reg	UNW_OBJ(uc_access_reg)
2628fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm#define ia64_uc_access_fpreg	UNW_OBJ(uc_access_fpreg)
2638fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2648fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmextern int ia64_uc_access_reg (struct cursor *c, ia64_loc_t loc,
2658fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm			       unw_word_t *valp, int write);
2668fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmextern int ia64_uc_access_fpreg (struct cursor *c, ia64_loc_t loc,
2678fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm				 unw_fpreg_t *valp, int write);
2688fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2697fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
270d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_getfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t *val)
2717fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
272d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr;
2737fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  int ret;
2747fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
275ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
2761b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
2771b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
2781b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
2791b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
2801b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
2818fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
2828fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_fpreg (c, loc, val, 0);
2838fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
2847fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
285d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc),
286c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				       val, 0, c->as_arg);
2877fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
288d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = IA64_GET_ADDR (loc);
289d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val->raw.bits[0], 0,
290c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				  c->as_arg);
2917fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (ret < 0)
2927fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    return ret;
2937fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
294d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return (*c->as->acc.access_mem) (c->as, addr + 8, &val->raw.bits[1], 0,
295c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				   c->as_arg);
2967fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
2977fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
2987fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
299d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_putfp (struct cursor *c, ia64_loc_t loc, unw_fpreg_t val)
3007fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
301d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr;
3027fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  int ret;
3037fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
304ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
3051b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
3061b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
3071b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
3081b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
3091b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
3108fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3118fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_fpreg (c, loc, &val, 1);
3128fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
3137fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
314d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_fpreg) (c->as, IA64_GET_REG (loc), &val, 1,
315c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				       c->as_arg);
3167fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
317d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  addr = IA64_GET_ADDR (loc);
318d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ret = (*c->as->acc.access_mem) (c->as, addr + 0, &val.raw.bits[0], 1,
319c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				  c->as_arg);
3207fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (ret < 0)
3217fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    return ret;
3227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
323d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return (*c->as->acc.access_mem) (c->as, addr + 8, &val.raw.bits[1], 1,
324c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				   c->as_arg);
3257fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3267fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3277fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* Get the 64 data bits from location LOC.  If bit 0 is cleared, LOC
3287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   is a memory address, otherwise it is a register number.  If the
3297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   register is a floating-point register, the 64 bits are read from
3307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm   the significand bits.  */
3317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3327fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
333d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_get (struct cursor *c, ia64_loc_t loc, unw_word_t *val)
3347fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
335ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
3361b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
3371b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
3381b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
3391b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
3401b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
3417fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_FP_LOC (loc))
3427fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    {
3437fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      unw_fpreg_t tmp;
3447fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      int ret;
3457fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3467fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      ret = ia64_getfp (c, loc, &tmp);
3477fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      if (ret < 0)
3487fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	return ret;
3497fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
35012f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm      if (c->as->big_endian)
3517fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	*val = tmp.raw.bits[1];
3527fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      else
3537fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	*val = tmp.raw.bits[0];
3547fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      return 0;
3557fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    }
3567fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3578fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3588fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_reg (c, loc, val, 0);
3598fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
3607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_REG_LOC (loc))
361d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), val, 0,
362c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				    c->as_arg);
3637fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  else
364d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), val, 0,
365d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm				    c->as_arg);
3667fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3677fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3687fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstatic inline int
369d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmia64_put (struct cursor *c, ia64_loc_t loc, unw_word_t val)
3707fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm{
371ed18defb26fb22c3137361f46bdc5e09519e4ee7hp.com!davidm  if (IA64_IS_NULL_LOC (loc))
3721b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    {
3731b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      Debug (16, "access to unsaved register\n");
3741b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm      return -UNW_EBADREG;
3751b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm    }
3761b4583400aa5a1a8ba2d0764ff707fc7048b43femostang.com!davidm
3777fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  if (IA64_IS_FP_LOC (loc))
3787fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    {
3797fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      unw_fpreg_t tmp;
3807fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3817fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      memset (&tmp, 0, sizeof (tmp));
38212f30d648157d340228b9dbb53809b52c23f5588mostang.com!davidm      if (c->as->big_endian)
3837fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	tmp.raw.bits[1] = val;
3847fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      else
3857fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm	tmp.raw.bits[0] = val;
3867fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm      return ia64_putfp (c, loc, tmp);
3877fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    }
3887fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
3898fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (IA64_IS_UC_LOC (loc))
3908fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm    return ia64_uc_access_reg (c, loc, &val, 1);
3918fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
392c2262737f7313096b2aaa1ebbd3c7ae062005ba2model.com!marky  if (IA64_IS_REG_LOC (loc))
393d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_reg)(c->as, IA64_GET_REG (loc), &val, 1,
394c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm				    c->as_arg);
3957fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  else
396d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return (*c->as->acc.access_mem)(c->as, IA64_GET_ADDR (loc), &val, 1,
397d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm				    c->as_arg);
3987fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm}
3997fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4006a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm#endif /* !UNW_LOCAL_ONLY */
4017fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4027fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_unwind_block
4037fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4047fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t header;
4057fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t desc[0];			/* unwind descriptors */
4067fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4077fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    /* Personality routine and language-specific data follow behind
4087fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm       descriptors.  */
4097fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  };
4107fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4117fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmenum ia64_where
4127fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4137fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_NONE,	/* register isn't saved at all */
4147fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_GR,	/* register is saved in a general register */
4157fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_FR,	/* register is saved in a floating-point register */
4167fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_BR,	/* register is saved in a branch register */
4177fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_SPREL,	/* register is saved on memstack (sp-relative) */
4187fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_PSPREL,	/* register is saved on memstack (psp-relative) */
4197fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4207fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    /* At the end of each prologue these locations get resolved to
4217fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm       IA64_WHERE_PSPREL and IA64_WHERE_GR, respectively:  */
4227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4237fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_SPILL_HOME, /* register is saved in its spill home */
4247fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    IA64_WHERE_GR_SAVE	/* register is saved in next general register */
4253fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4267fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4277fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#define IA64_WHEN_NEVER	0x7fffffff
4287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_reg_info
4307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t val;		/* save location: register number or offset */
4327fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    enum ia64_where where;	/* where the register gets saved */
4337fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int when;			/* when the register gets saved */
4347fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  };
4357fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4366a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidmstruct ia64_labeled_state;	/* opaque structure */
4376a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
4383fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidmstruct ia64_reg_state
4393fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  {
4403fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_state *next;    /* next (outer) element on state stack */
4413fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_info reg[IA64_NUM_PREGS];	/* register save locations */
4423fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4436a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm
4447fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmstruct ia64_state_record
4457fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm  {
4467fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int first_region : 1;	/* is this the first region? */
4477fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int done : 1;		/* are we done scanning descriptors? */
4487fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int any_spills : 1;	/* got any register spills? */
4497fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unsigned int in_body : 1;		/* are we inside prologue or body? */
4504e41f21f65d3c492bf990c8196237fef864997e5hp.com!davidm    uint8_t *imask;		/* imask of spill_mask record or NULL */
451d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    uint16_t abi_marker;
452d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
4537fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t pr_val;		/* predicate values */
4547fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    unw_word_t pr_mask;		/* predicate mask */
4557fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4567fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    long spill_offset;		/* psp-relative offset for spill base */
4577fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int region_start;
4587fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int region_len;
45977ccc28ad910eee9e0a4488d27ba50c332173ab6mostang.com!davidm    int when_sp_restored;
4607fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int epilogue_count;
4617fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    int when_target;
4627fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4637fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    uint8_t gr_save_loc;	/* next save register */
4647fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm    uint8_t return_link_reg;	/* branch register used as return pointer */
4657fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4666a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm    struct ia64_labeled_state *labeled_states;
4676a4f3b23c1ba506fd36dee49e26e845a56451837(none)!davidm    struct ia64_reg_state curr;
4683fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4693fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm
4703fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidmstruct ia64_labeled_state
4713fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  {
4723fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_labeled_state *next;	/* next label (or NULL) */
4733fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    unsigned long label;			/* label for this state */
4743fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm    struct ia64_reg_state saved_state;
4753fbd1a1d688b8d6c55468576b55fd3a08992271emostang.com!davidm  };
4767fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
4777fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* Convenience macros: */
478c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm#define ia64_make_proc_info		UNW_OBJ(make_proc_info)
479d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm#define ia64_fetch_proc_info		UNW_OBJ(fetch_proc_info)
480bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_create_state_record	UNW_OBJ(create_state_record)
481bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_free_state_record		UNW_OBJ(free_state_record)
482bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_find_save_locs		UNW_OBJ(find_save_locs)
4834c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm#define ia64_validate_cache		UNW_OBJ(ia64_validate_cache)
4844c61d17686b7d550363c7b264732553d4a543418mostang.com!davidm#define ia64_local_validate_cache	UNW_OBJ(ia64_local_validate_cache)
485126ca1056681a08a28d7c4f16c5689b6ce9174e2hp.com!davidm#define ia64_per_thread_cache		UNW_OBJ(per_thread_cache)
486bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_scratch_loc		UNW_OBJ(scratch_loc)
487bd228fb16a2fbf6a6bb137c582079357df11de87mostang.com!davidm#define ia64_local_resume		UNW_OBJ(local_resume)
488481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidm#define ia64_local_addr_space_init	UNW_OBJ(local_addr_space_init)
489d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define ia64_strloc			UNW_OBJ(strloc)
4908da298f14f816544da4e06f3167d3f74976f0e41mostang.com!davidm#define ia64_install_cursor		UNW_OBJ(install_cursor)
491d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_switch			UNW_OBJ(rbs_switch)
492d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm#define rbs_find_stacked		UNW_OBJ(rbs_find_stacked)
4937fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
494481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_make_proc_info (struct cursor *c);
495d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidmextern int ia64_fetch_proc_info (struct cursor *c, unw_word_t ip,
496d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm				 int need_unwind_info);
497d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm/* The proc-info must be valid for IP before this routine can be
498d6946f580b6c7609c181bc6d9200481d04f7b043mostang.com!davidm   called:  */
499481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_create_state_record (struct cursor *c,
5007fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm				     struct ia64_state_record *sr);
5017fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidmextern int ia64_free_state_record (struct ia64_state_record *sr);
502481e35c2ca6da6149db30c8572979e035cfff55dmostang.com!davidmextern int ia64_find_save_locs (struct cursor *c);
5034c61d17686b7d550363c7b264732553d4a543418mostang.com!davidmextern void ia64_validate_cache (unw_addr_space_t as, void *arg);
5044c61d17686b7d550363c7b264732553d4a543418mostang.com!davidmextern int ia64_local_validate_cache (unw_addr_space_t as, void *arg);
505fe0ed7dd4181e1af0c7a45238262481e1d739ddemostang.com!davidmextern void ia64_local_addr_space_init (void);
506be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidmextern ia64_loc_t ia64_scratch_loc (struct cursor *c, unw_regnum_t reg,
507be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm				    uint8_t *nat_bitnr);
5087fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
50923a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidmextern NORETURN void ia64_install_cursor (struct cursor *c,
51023a0696c6de299a7364a4e7b96cf2ac507b41cb8mostang.com!davidm					  unw_word_t pri_unat,
5113386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t *extra,
5123386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t bspstore,
5133386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t dirty_size,
5143386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t *dirty_partition,
5153386d284fafde358ed44bfef33edd578864c285fhp.com!davidm					  unw_word_t dirty_rnat);
516c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidmextern int ia64_local_resume (unw_addr_space_t as, unw_cursor_t *cursor,
517c97d8cdab47236ffaa65e9a3a3f29e95b865c8e6mostang.com!davidm			      void *arg);
518749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmextern int rbs_switch (struct cursor *c,
519749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm		       unw_word_t saved_bsp, unw_word_t saved_bspstore,
520d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm		       ia64_loc_t saved_rnat_loc);
5215a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidmextern int rbs_find_stacked (struct cursor *c, unw_word_t regs_to_skip,
522d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm			     ia64_loc_t *locp, ia64_loc_t *rnat_locp);
5231228462adc4d1c89448def59778416adce1e986bhp.com!davidm
5241228462adc4d1c89448def59778416adce1e986bhp.com!davidm#ifndef UNW_REMOTE_ONLY
5251228462adc4d1c89448def59778416adce1e986bhp.com!davidm# define NEED_RBS_COVER_AND_FLUSH
5261228462adc4d1c89448def59778416adce1e986bhp.com!davidm# define rbs_cover_and_flush	UNW_OBJ(rbs_cover_and_flush)
5271228462adc4d1c89448def59778416adce1e986bhp.com!davidm  extern int rbs_cover_and_flush (struct cursor *c, unw_word_t nregs,
5281228462adc4d1c89448def59778416adce1e986bhp.com!davidm				  unw_word_t *dirty_partition,
5291228462adc4d1c89448def59778416adce1e986bhp.com!davidm				  unw_word_t *dirty_rnat,
5301228462adc4d1c89448def59778416adce1e986bhp.com!davidm				  unw_word_t *bspstore);
5311228462adc4d1c89448def59778416adce1e986bhp.com!davidm#endif
5325a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
533d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm/* Warning: ia64_strloc() is for debugging only and it is NOT re-entrant! */
534d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmextern const char *ia64_strloc (ia64_loc_t loc);
535d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
5368fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm/* Return true if the register-backing store is inside a ucontext_t
5378fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm   that needs to be accessed via uc_access(3).  */
5388fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
5398fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmstatic inline int
5408fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidmrbs_on_uc (struct rbs_area *rbs)
5418fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm{
5428fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  return IA64_IS_UC_LOC (rbs->rnat_loc) && !IA64_IS_REG_LOC (rbs->rnat_loc);
5438fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm}
5448fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm
545749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm/* Return true if BSP points to a word that's stored on register
546749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm   backing-store RBS.  */
547749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmstatic inline int
548749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidmrbs_contains (struct rbs_area *rbs, unw_word_t bsp)
549749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm{
550749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  int result;
551749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm
552749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  /* Caveat: this takes advantage of unsigned arithmetic.  The full
553749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm     test is (bsp >= rbs->end - rbs->size) && (bsp < rbs->end).  We
554749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm     take advantage of the fact that -n == ~n + 1.  */
555749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  result = bsp - rbs->end > ~rbs->size;
556c67d345c33f1d0b6e4adce3e03f8a1f332722669hp.com!davidm  Debug (16, "0x%lx in [0x%lx-0x%lx) => %d\n",
5578d4f6ff52d13cf6fc90faf4e455e24337986fe25hp.com!davidm	 (long) bsp, (long) (rbs->end - rbs->size), (long) rbs->end, result);
558749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm  return result;
559749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm}
560749cd255297c458a4f95101669f958a16c73c53cmostang.com!davidm
561a024a719e1b4d1fde2b28afa886853e4ce573949hp.com!davidmstatic inline ia64_loc_t
562d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmrbs_get_rnat_loc (struct rbs_area *rbs, unw_word_t bsp)
563d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm{
5649f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm  unw_word_t rnat_addr = rse_rnat_addr (bsp);
565d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  ia64_loc_t rnat_loc;
566d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
567d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  if (rbs_contains (rbs, rnat_addr))
568d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    {
5698fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm      if (rbs_on_uc (rbs))
570d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	rnat_loc = IA64_LOC_UC_ADDR (rnat_addr, 0);
571d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm      else
572d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm	rnat_loc = IA64_LOC_ADDR (rnat_addr, 0);
573d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    }
574d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  else
575d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    rnat_loc = rbs->rnat_loc;
576d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  return rnat_loc;
577d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm}
578d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
579a024a719e1b4d1fde2b28afa886853e4ce573949hp.com!davidmstatic inline ia64_loc_t
580d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidmrbs_loc (struct rbs_area *rbs, unw_word_t bsp)
581d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm{
5828fee91bd1365ad85e524144645ca2a59a45e91d4mostang.com!davidm  if (rbs_on_uc (rbs))
583d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return IA64_LOC_UC_ADDR (bsp, 0);
584d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  else
585d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    return IA64_LOC_ADDR (bsp, 0);
586d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm}
587d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm
5885a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidmstatic inline int
589eacf0e24e15a6793a88d41b3294c2c1ee43a097emostang.com!davidmia64_get_stacked (struct cursor *c, unw_word_t reg,
590d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm		  ia64_loc_t *locp, ia64_loc_t *rnat_locp)
5915a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm{
5925a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  struct rbs_area *rbs = c->rbs_area + c->rbs_curr;
593d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  unw_word_t addr, regs_to_skip = reg - 32;
5945a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  int ret = 0;
5955a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
596eacf0e24e15a6793a88d41b3294c2c1ee43a097emostang.com!davidm  assert (reg >= 32 && reg < 128);
5975a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
5989f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm  addr = rse_skip_regs (c->bsp, regs_to_skip);
5997057901782a226fa2c99bf4bf1d2dcb7c0c8c155mostang.com!davidm  if (locp)
600d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    *locp = rbs_loc (rbs, addr);
6015a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  if (rnat_locp)
602d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm    *rnat_locp = rbs_get_rnat_loc (rbs, addr);
6035a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm
604d412b24291e797e2a7f3f437fd9abb0b2f9c3aa1mostang.com!davidm  if (!rbs_contains (rbs, addr))
6055a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm    ret = rbs_find_stacked (c, regs_to_skip, locp, rnat_locp);
6065a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm  return ret;
6075a55c1d8a8b4374c487fbfa0d8045b139cd243ecmostang.com!davidm}
6089a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
609be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm/* The UNaT slot # calculation is identical to the one for RNaT slots,
610be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm   but for readability/clarity, we don't want to use
611be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm   ia64_rnat_slot_num() directly.  */
6129f3360a5464aa1c35c44f418421561f0dc22bb41mostang.com!davidm#define ia64_unat_slot_num(addr)	rse_slot_num(addr)
613be1d46b41c5a9bec717938c79475378722b3f004mostang.com!davidm
6141228462adc4d1c89448def59778416adce1e986bhp.com!davidm/* The following are helper macros which makes it easier for libunwind
6151228462adc4d1c89448def59778416adce1e986bhp.com!davidm   to be used in the kernel.  They allow the kernel to optimize away
6161228462adc4d1c89448def59778416adce1e986bhp.com!davidm   any unused code without littering everything with #ifdefs.  */
6171228462adc4d1c89448def59778416adce1e986bhp.com!davidm#define ia64_is_big_endian(c)	((c)->as->big_endian)
6181228462adc4d1c89448def59778416adce1e986bhp.com!davidm#define ia64_get_abi(c)		((c)->as->abi)
6191228462adc4d1c89448def59778416adce1e986bhp.com!davidm#define ia64_set_abi(c, v)	((c)->as->abi = (v))
6201228462adc4d1c89448def59778416adce1e986bhp.com!davidm#define ia64_get_abi_marker(c)	((c)->last_abi_marker)
6211228462adc4d1c89448def59778416adce1e986bhp.com!davidm
6227fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm/* XXX should be in glibc: */
6237fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#ifndef IA64_SC_FLAG_ONSTACK
6247fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_ONSTACK_BIT    0 /* running on signal stack? */
6257fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_IN_SYSCALL_BIT 1 /* did signal interrupt a syscall? */
6267fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_FPH_VALID_BIT  2 /* is state in f[32]-f[127] valid? */
6277fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm
6287fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_ONSTACK		(1 << IA64_SC_FLAG_ONSTACK_BIT)
6297fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_IN_SYSCALL	(1 << IA64_SC_FLAG_IN_SYSCALL_BIT)
6307fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm# define IA64_SC_FLAG_FPH_VALID		(1 << IA64_SC_FLAG_FPH_VALID_BIT)
6317fbfe0a255eb7ff3f27efa5adc6ed69dab471ecfmostang.com!davidm#endif
6329a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm
6339a2039fe0179b715daed0205564f6cffa519b389mostang.com!davidm#endif /* unwind_i_h */
634