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