_UCD_access_reg_linux.c revision 8d5b1aeeffb80515197fd7aeee0b3fbfac904ecd
1b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma/* libunwind - a platform-independent unwind library
221ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala   Copyright (C) 2012 Tommi Rantala <tt.rantala@gmail.com>
3b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
4b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaThis file is part of libunwind.
5b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
6b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaPermission is hereby granted, free of charge, to any person obtaining
7b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaa copy of this software and associated documentation files (the
8b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma"Software"), to deal in the Software without restriction, including
9b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmawithout limitation the rights to use, copy, modify, merge, publish,
10b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmadistribute, sublicense, and/or sell copies of the Software, and to
11b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmapermit persons to whom the Software is furnished to do so, subject to
12b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmathe following conditions:
13b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
14b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaThe above copyright notice and this permission notice shall be
15b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaincluded in all copies or substantial portions of the Software.
16b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
17b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
18b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
20b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
21b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
22b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
23b08ae72d6c041c2c9d72d049f815d001032169caArun SharmaWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
24b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
25b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#include "_UCD_lib.h"
26b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
27b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#include "_UCD_internal.h"
28b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
29b08ae72d6c041c2c9d72d049f815d001032169caArun Sharmaint
30b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma_UCD_access_reg (unw_addr_space_t as,
31b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma                                unw_regnum_t regnum, unw_word_t *valp,
32b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma                                int write, void *arg)
33b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma{
3421ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala  struct UCD_info *ui = arg;
3521ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala
36b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  if (write)
37b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    {
38e61c6f69c30d85584ece5250b8b82b03898384f5Tommi Rantala      Debug(0, "write is not supported\n");
39b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      return -UNW_EINVAL;
40b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    }
41b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
4221ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala#if defined(UNW_TARGET_ARM)
4321ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala  if (regnum < 0 || regnum >= 16)
4421ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala    goto badreg;
458d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala#elif defined(UNW_TARGET_SH)
468d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala  if (regnum < 0 || regnum > UNW_SH_PR)
478d5b1aeeffb80515197fd7aeee0b3fbfac904ecdTommi Rantala    goto badreg;
4821ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala#else
4979c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala#if defined(UNW_TARGET_MIPS)
5079c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala  static const uint8_t remap_regs[] =
5179c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala    {
5279c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R0]  = EF_REG0,
5379c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R1]  = EF_REG1,
5479c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R2]  = EF_REG2,
5579c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R3]  = EF_REG3,
5679c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R4]  = EF_REG4,
5779c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R5]  = EF_REG5,
5879c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R6]  = EF_REG6,
5979c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R7]  = EF_REG7,
6079c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R8]  = EF_REG8,
6179c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R9]  = EF_REG9,
6279c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R10] = EF_REG10,
6379c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R11] = EF_REG11,
6479c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R12] = EF_REG12,
6579c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R13] = EF_REG13,
6679c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R14] = EF_REG14,
6779c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R15] = EF_REG15,
6879c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R16] = EF_REG16,
6979c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R17] = EF_REG17,
7079c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R18] = EF_REG18,
7179c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R19] = EF_REG19,
7279c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R20] = EF_REG20,
7379c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R21] = EF_REG21,
7479c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R22] = EF_REG22,
7579c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R23] = EF_REG23,
7679c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R24] = EF_REG24,
7779c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R25] = EF_REG25,
7879c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R28] = EF_REG28,
7979c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R29] = EF_REG29,
8079c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R30] = EF_REG30,
8179c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_R31] = EF_REG31,
8279c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala      [UNW_MIPS_PC]  = EF_CP0_EPC,
8379c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala    };
8479c2c254a74ca850aefe2c49b973dea1fa2934c2Tommi Rantala#elif defined(UNW_TARGET_X86)
85b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  static const uint8_t remap_regs[] =
86b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    {
87b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      /* names from libunwind-x86.h */
88b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EAX]    = offsetof(struct user_regs_struct, eax) / sizeof(long),
89b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EDX]    = offsetof(struct user_regs_struct, edx) / sizeof(long),
90b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_ECX]    = offsetof(struct user_regs_struct, ecx) / sizeof(long),
91b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EBX]    = offsetof(struct user_regs_struct, ebx) / sizeof(long),
92b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_ESI]    = offsetof(struct user_regs_struct, esi) / sizeof(long),
93b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EDI]    = offsetof(struct user_regs_struct, edi) / sizeof(long),
94b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EBP]    = offsetof(struct user_regs_struct, ebp) / sizeof(long),
95b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_ESP]    = offsetof(struct user_regs_struct, esp) / sizeof(long),
96b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EIP]    = offsetof(struct user_regs_struct, eip) / sizeof(long),
97b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_EFLAGS] = offsetof(struct user_regs_struct, eflags) / sizeof(long),
98b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma      [UNW_X86_TRAPNO] = offsetof(struct user_regs_struct, orig_eax) / sizeof(long),
99b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    };
100b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#elif defined(UNW_TARGET_X86_64)
101b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  static const int8_t remap_regs[] =
102b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    {
1030f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RAX]    = offsetof(struct user_regs_struct, rax) / sizeof(long),
1040f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RDX]    = offsetof(struct user_regs_struct, rdx) / sizeof(long),
1050f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RCX]    = offsetof(struct user_regs_struct, rcx) / sizeof(long),
1060f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RBX]    = offsetof(struct user_regs_struct, rbx) / sizeof(long),
1070f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RSI]    = offsetof(struct user_regs_struct, rsi) / sizeof(long),
1080f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RDI]    = offsetof(struct user_regs_struct, rdi) / sizeof(long),
1090f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RBP]    = offsetof(struct user_regs_struct, rbp) / sizeof(long),
1100f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RSP]    = offsetof(struct user_regs_struct, rsp) / sizeof(long),
1110f17b521716c8492f08f8671fd847fd3c26f8175Arun Sharma      [UNW_X86_64_RIP]    = offsetof(struct user_regs_struct, rip) / sizeof(long),
112b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma    };
113b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#else
114b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#error Port me
115b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma#endif
116b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
117b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  if (regnum < 0 || regnum >= (unw_regnum_t)ARRAY_SIZE(remap_regs))
11821ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala    goto badreg;
11921ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala
120b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  regnum = remap_regs[regnum];
12121ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala#endif
122b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
123b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  /* pr_reg is a long[] array, but it contains struct user_regs_struct's
124b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma   * image.
125b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma   */
1267e5cab6dacfaead42c483ba9cb2dc202bde703b5Tommi Rantala  Debug(1, "pr_reg[%d]:%ld (0x%lx)\n", regnum,
127b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma		(long)ui->prstatus->pr_reg[regnum],
128b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma		(long)ui->prstatus->pr_reg[regnum]
129b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  );
130b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  *valp = ui->prstatus->pr_reg[regnum];
131b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma
132b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma  return 0;
13321ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala
13421ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantalabadreg:
13521ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala  Debug(0, "bad regnum:%d\n", regnum);
13621ad2c19ea575b4485121e9f824609fe6e4f3be9Tommi Rantala  return -UNW_EINVAL;
137b08ae72d6c041c2c9d72d049f815d001032169caArun Sharma}
138