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