1ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux/* libunwind - a platform-independent unwind library 2ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux Copyright (C) 2008 CodeSourcery 3ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com> 4ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux Copyright (C) 2013 Linaro Limited 5ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 6ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxThis file is part of libunwind. 7ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 8ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxPermission is hereby granted, free of charge, to any person obtaining 9ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxa copy of this software and associated documentation files (the 10ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux"Software"), to deal in the Software without restriction, including 11ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxwithout limitation the rights to use, copy, modify, merge, publish, 12ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxdistribute, sublicense, and/or sell copies of the Software, and to 13ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxpermit persons to whom the Software is furnished to do so, subject to 14ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxthe following conditions: 15ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 16ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxThe above copyright notice and this permission notice shall be 17ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxincluded in all copies or substantial portions of the Software. 18ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 19ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 23ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 24ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 25ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 26ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 27ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux#include "unwind_i.h" 28ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 29ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxHIDDEN int 30ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxtdep_access_reg (struct cursor *c, unw_regnum_t reg, unw_word_t *valp, 31ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux int write) 32ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux{ 33ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux dwarf_loc_t loc = DWARF_NULL_LOC; 34ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux unsigned int mask; 35ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 36ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux switch (reg) 37ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux { 38ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X0: 39ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X1: 40ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X2: 41ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X3: 42ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux mask = 1 << reg; 43ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux if (write) 44ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux { 45ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux c->dwarf.eh_args[reg] = *valp; 46ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux c->dwarf.eh_valid_mask |= mask; 47ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return 0; 48ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux } 49ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux else if ((c->dwarf.eh_valid_mask & mask) != 0) 50ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux { 51ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux *valp = c->dwarf.eh_args[reg]; 52ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return 0; 53ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux } 54ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux else 55ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux loc = c->dwarf.loc[reg]; 56ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux break; 57ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 58ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X4: 59ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X5: 60ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X6: 61ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X7: 62ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X8: 63ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X9: 64ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X10: 65ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X11: 66ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X12: 67ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X13: 68ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X14: 69ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X15: 70ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X16: 71ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X17: 72ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X18: 73ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X19: 74ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X20: 75ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X21: 76ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X22: 77ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X23: 78ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X24: 79ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X25: 80ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X26: 81ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X27: 82ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X28: 83ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X29: 84ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_X30: 85ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_PC: 86ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_PSTATE: 87ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux loc = c->dwarf.loc[reg]; 88ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux break; 89ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 90ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux case UNW_AARCH64_SP: 91ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux if (write) 92ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return -UNW_EREADONLYREG; 93ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux *valp = c->dwarf.cfa; 94ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return 0; 95ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 96ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux default: 97ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux Debug (1, "bad register number %u\n", reg); 98ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return -UNW_EBADREG; 99ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux } 100ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 101ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux if (write) 102ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return dwarf_put (&c->dwarf, loc, *valp); 103ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux else 104ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return dwarf_get (&c->dwarf, loc, valp); 105ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux} 106ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux 107ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan RouxHIDDEN int 108ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxtdep_access_fpreg (struct cursor *c, unw_regnum_t reg, unw_fpreg_t *valp, 109ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux int write) 110ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux{ 111ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux Debug (1, "bad register number %u\n", reg); 112ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux return -UNW_EBADREG; 113ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux} 114