1dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov/* libunwind - a platform-independent unwind library 2dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 3dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovThis file is part of libunwind. 4dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 5dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovPermission is hereby granted, free of charge, to any person obtaining 6dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousova copy of this software and associated documentation files (the 7dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov"Software"), to deal in the Software without restriction, including 8dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousovwithout limitation the rights to use, copy, modify, merge, publish, 9dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousovdistribute, sublicense, and/or sell copies of the Software, and to 10dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousovpermit persons to whom the Software is furnished to do so, subject to 11dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousovthe following conditions: 12dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 13dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovThe above copyright notice and this permission notice shall be 14dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousovincluded in all copies or substantial portions of the Software. 15dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 16dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik BelousovWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ 23dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 24dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#include "_UCD_lib.h" 25dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 26dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#include "_UCD_internal.h" 27dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 28dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousovint 29dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov_UCD_access_reg (unw_addr_space_t as, 30dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov unw_regnum_t regnum, unw_word_t *valp, 31dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov int write, void *arg) 32dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov{ 33dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov if (write) 34dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov { 35e61c6f69c30d85584ece5250b8b82b03898384f5Tommi Rantala Debug(0, "write is not supported\n"); 36dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov return -UNW_EINVAL; 37dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov } 38dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 39dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov struct UCD_info *ui = arg; 40dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 41dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#if defined(UNW_TARGET_X86) 42dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov switch (regnum) { 43dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EAX: 44dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_eax; 45dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 46dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EDX: 47dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_edx; 48dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 49dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_ECX: 50dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_ecx; 51dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 52dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EBX: 53dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_ebx; 54dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 55dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_ESI: 56dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_esi; 57dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 58dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EDI: 59dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_edi; 60dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 61dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EBP: 62dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_ebp; 63dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 64dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_ESP: 65dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_esp; 66dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 67dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EIP: 68dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_eip; 69dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 70dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_EFLAGS: 71dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_eflags; 72dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 73dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_TRAPNO: 74dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_trapno; 75dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 76dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov default: 77e61c6f69c30d85584ece5250b8b82b03898384f5Tommi Rantala Debug(0, "bad regnum:%d\n", regnum); 78dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov return -UNW_EINVAL; 79dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov }; 80dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#elif defined(UNW_TARGET_X86_64) 81dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov switch (regnum) { 82dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RAX: 83dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rax; 84dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 85dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RDX: 86dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rdx; 87dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 88dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RCX: 89dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rcx; 90dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 91dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RBX: 92dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rbx; 93dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 94dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RSI: 95dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rsi; 96dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 97dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RDI: 98dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rdi; 99dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 100dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RBP: 101dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rbp; 102dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 103dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RSP: 104dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rsp; 105dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 106dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov case UNW_X86_64_RIP: 107dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov *valp = ui->prstatus->pr_reg.r_rip; 108dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov break; 109dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov default: 110e61c6f69c30d85584ece5250b8b82b03898384f5Tommi Rantala Debug(0, "bad regnum:%d\n", regnum); 111dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov return -UNW_EINVAL; 112dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov }; 113dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#else 114dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#error Port me 115dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov#endif 116dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov 117dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov return 0; 118dc9be1a97a7712b36533a9c362ecc3e6492fbc9bKostik Belousov} 119