1a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock/* libunwind - a platform-independent unwind library 2a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock Copyright (c) 2002-2004 Hewlett-Packard Development Company, L.P. 3a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock Contributed by David Mosberger-Tang <davidm@hpl.hp.com> 4a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 5a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock Modified for x86_64 by Max Asbock <masbock@us.ibm.com> 6a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 7a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockThis file is part of libunwind. 8a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 9a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockPermission is hereby granted, free of charge, to any person obtaining 10a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbocka copy of this software and associated documentation files (the 11a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock"Software"), to deal in the Software without restriction, including 12a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockwithout limitation the rights to use, copy, modify, merge, publish, 13a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockdistribute, sublicense, and/or sell copies of the Software, and to 14a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockpermit persons to whom the Software is furnished to do so, subject to 15a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockthe following conditions: 16a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 17a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockThe above copyright notice and this permission notice shall be 18a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockincluded in all copies or substantial portions of the Software. 19a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 20a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 21a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 22a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 23a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 24a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 25a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 26a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 27a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 28a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock#include "unwind_i.h" 29a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 30a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock#if 0 31a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockstatic inline dwarf_loc_t 32a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbocklinux_scratch_loc (struct cursor *c, unw_regnum_t reg) 33a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock{ 34a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock unw_word_t addr = c->sigcontext_addr; 35a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 36a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock switch (c->sigcontext_format) 37a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock { 38a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case X86_64_SCF_NONE: 39a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return DWARF_REG_LOC (&c->dwarf, reg); 40a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 41a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case X86_64_SCF_LINUX_RT_SIGFRAME: 42a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock addr += LINUX_UC_MCONTEXT_OFF; 43a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock break; 44c64723835c0c855fde5bec3d7528db64fe539015Konstantin Belousov 45c64723835c0c855fde5bec3d7528db64fe539015Konstantin Belousov case X86_64_SCF_FREEBSD_SIGFRAME: 46c64723835c0c855fde5bec3d7528db64fe539015Konstantin Belousov addr += FREEBSD_UC_MCONTEXT_OFF; 47c64723835c0c855fde5bec3d7528db64fe539015Konstantin Belousov break; 48a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock } 49a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 50a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return DWARF_REG_LOC (&c->dwarf, reg); 51a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 52a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock} 53a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 54a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockHIDDEN dwarf_loc_t 55a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockx86_64_scratch_loc (struct cursor *c, unw_regnum_t reg) 56a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock{ 57a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock if (c->sigcontext_addr) 58a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return linux_scratch_loc (c, reg); 59a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock else 60a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return DWARF_REG_LOC (&c->dwarf, reg); 61a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock} 62a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock#endif 63a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 64a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockHIDDEN int 65a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbocktdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp, 66a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock int write) 67a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock{ 68a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock dwarf_loc_t loc = DWARF_NULL_LOC; 69555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm unsigned int mask; 70555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm int arg_num; 71a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 72a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock switch (reg) 73a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock { 74a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 75a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_RIP: 76a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock if (write) 77a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock c->dwarf.ip = *valp; /* also update the RIP cache */ 78a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock loc = c->dwarf.loc[RIP]; 79a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock break; 80a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 81a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_CFA: 82555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm case UNW_X86_64_RSP: 83a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock if (write) 84a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return -UNW_EREADONLYREG; 85a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock *valp = c->dwarf.cfa; 86a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return 0; 87a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 88555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm case UNW_X86_64_RAX: 89555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm case UNW_X86_64_RDX: 90555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm arg_num = reg - UNW_X86_64_RAX; 91555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm mask = (1 << arg_num); 92555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm if (write) 93555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm { 94555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm c->dwarf.eh_args[arg_num] = *valp; 95555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm c->dwarf.eh_valid_mask |= mask; 96555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm return 0; 97555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm } 98555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm else if ((c->dwarf.eh_valid_mask & mask) != 0) 99be2bed2712097dae6d44bb1a9d46da2b0c17db4ahomeip.net!davidm { 100555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm *valp = c->dwarf.eh_args[arg_num]; 101be2bed2712097dae6d44bb1a9d46da2b0c17db4ahomeip.net!davidm return 0; 102be2bed2712097dae6d44bb1a9d46da2b0c17db4ahomeip.net!davidm } 103555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm else 104555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm loc = c->dwarf.loc[(reg == UNW_X86_64_RAX) ? RAX : RDX]; 105be2bed2712097dae6d44bb1a9d46da2b0c17db4ahomeip.net!davidm break; 106555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm 107555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm case UNW_X86_64_RCX: loc = c->dwarf.loc[RCX]; break; 108555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm case UNW_X86_64_RBX: loc = c->dwarf.loc[RBX]; break; 109555bae8aa36e7868b498bae39a92eb1e79a11629hp.com!davidm 110a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_RBP: loc = c->dwarf.loc[RBP]; break; 111a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_RSI: loc = c->dwarf.loc[RSI]; break; 112a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_RDI: loc = c->dwarf.loc[RDI]; break; 113a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R8: loc = c->dwarf.loc[R8]; break; 114a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R9: loc = c->dwarf.loc[R9]; break; 115a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R10: loc = c->dwarf.loc[R10]; break; 116a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R11: loc = c->dwarf.loc[R11]; break; 117a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R12: loc = c->dwarf.loc[R12]; break; 118a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R13: loc = c->dwarf.loc[R13]; break; 119a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R14: loc = c->dwarf.loc[R14]; break; 120a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock case UNW_X86_64_R15: loc = c->dwarf.loc[R15]; break; 121a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 122a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock default: 123a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock Debug (1, "bad register number %u\n", reg); 124a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return -UNW_EBADREG; 125a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock } 126a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 127a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock if (write) 128a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return dwarf_put (&c->dwarf, loc, *valp); 129a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock else 130a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return dwarf_get (&c->dwarf, loc, valp); 131a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock} 132a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock 133a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbockHIDDEN int 134a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbocktdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp, 135a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock int write) 136a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock{ 137a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock return -UNW_EBADREG; 138a766efd844260866e0d216f6eeef87f4593f60b2ibm.com!masbock} 139