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