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