| /* libunwind - a platform-independent unwind library |
| Copyright (C) 2001-2002 Hewlett-Packard Co |
| Contributed by David Mosberger-Tang <davidm@hpl.hp.com> |
| |
| This file is part of libunwind. |
| |
| Permission is hereby granted, free of charge, to any person obtaining |
| a copy of this software and associated documentation files (the |
| "Software"), to deal in the Software without restriction, including |
| without limitation the rights to use, copy, modify, merge, publish, |
| distribute, sublicense, and/or sell copies of the Software, and to |
| permit persons to whom the Software is furnished to do so, subject to |
| the following conditions: |
| |
| The above copyright notice and this permission notice shall be |
| included in all copies or substantial portions of the Software. |
| |
| THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
| EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
| MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
| NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
| LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
| OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
| WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ |
| |
| #define IA64_LOG_UNW_CACHE_SIZE 7 |
| #define IA64_UNW_CACHE_SIZE (1 << IA64_LOG_UNW_CACHE_SIZE) |
| |
| #define IA64_LOG_UNW_HASH_SIZE (IA64_LOG_UNW_CACHE_SIZE + 1) |
| #define IA64_UNW_HASH_SIZE (1 << IA64_LOG_UNW_HASH_SIZE) |
| |
| typedef unsigned char unw_hash_index_t; |
| |
| struct ia64_script_insn |
| { |
| unsigned int opc; /* see enum ia64_script_insn_opcode */ |
| unsigned int dst; |
| unw_word_t val; |
| }; |
| |
| /* Updating each preserved register may result in one script |
| instruction each. At the end of the script, psp gets popped, |
| accounting for one more instruction. */ |
| #define IA64_MAX_SCRIPT_LEN (IA64_NUM_PREGS + 1) |
| |
| struct ia64_script |
| { |
| unw_word_t ip; /* ip this script is for */ |
| unw_word_t pr_mask; /* mask of predicates script depends on */ |
| unw_word_t pr_val; /* predicate values this script is for */ |
| unw_proc_info_t pi; /* info about underlying procedure */ |
| unsigned short lru_chain; /* used for least-recently-used chain */ |
| unsigned short coll_chain; /* used for hash collisions */ |
| unsigned short hint; /* hint for next script to try (or -1) */ |
| unsigned short count; /* number of instructions in script */ |
| unsigned short abi_marker; |
| struct ia64_script_insn insn[IA64_MAX_SCRIPT_LEN]; |
| }; |
| |
| struct ia64_script_cache |
| { |
| #ifdef HAVE_ATOMIC_OPS_H |
| AO_TS_t busy; /* is the script-cache busy? */ |
| #else |
| pthread_mutex_t lock; |
| #endif |
| unsigned short lru_head; /* index of lead-recently used script */ |
| unsigned short lru_tail; /* index of most-recently used script */ |
| |
| /* hash table that maps instruction pointer to script index: */ |
| unsigned short hash[IA64_UNW_HASH_SIZE]; |
| |
| uint32_t generation; /* generation number */ |
| |
| /* script cache: */ |
| struct ia64_script buckets[IA64_UNW_CACHE_SIZE]; |
| }; |
| |
| #define ia64_get_cached_proc_info UNW_OBJ(ia64_get_cached_proc_info) |
| |
| struct cursor; /* forward declaration */ |
| |
| extern int ia64_get_cached_proc_info (struct cursor *c); |