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