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 RouxPROTECTED int
30ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Rouxunw_get_save_loc (unw_cursor_t *cursor, int reg, unw_save_loc_t *sloc)
31ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux{
32ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  struct cursor *c = (struct cursor *) cursor;
33ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  dwarf_loc_t loc;
34ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux
35ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  switch (reg)
36ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    {
37ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X0:
38ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X1:
39ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X2:
40ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X3:
41ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X4:
42ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X5:
43ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X6:
44ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X7:
45ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X8:
46ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X9:
47ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X10:
48ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X11:
49ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X12:
50ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X13:
51ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X14:
52ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X15:
53ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X16:
54ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X17:
55ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X18:
56ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X19:
57ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X20:
58ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X21:
59ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X22:
60ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X23:
61ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X24:
62ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X25:
63ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X26:
64ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X27:
65ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X28:
66ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X29:
67ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_X30:
68ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_SP:
69ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_PC:
70ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    case UNW_AARCH64_PSTATE:
71ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      loc = c->dwarf.loc[reg];
72ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      break;
73ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux
74ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    default:
75ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      loc = DWARF_NULL_LOC;	/* default to "not saved" */
76ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      break;
77ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    }
78ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux
79ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  memset (sloc, 0, sizeof (*sloc));
80ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux
81ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  if (DWARF_IS_NULL_LOC (loc))
82ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    {
83ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      sloc->type = UNW_SLT_NONE;
84ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      return 0;
85ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    }
86ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux
87ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux#if !defined(UNW_LOCAL_ONLY)
88ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  if (DWARF_IS_REG_LOC (loc))
89ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    {
90ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      sloc->type = UNW_SLT_REG;
91ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      sloc->u.regnum = DWARF_GET_LOC (loc);
92ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    }
93ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  else
94ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux#endif
95ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    {
96ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      sloc->type = UNW_SLT_MEMORY;
97ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux      sloc->u.addr = DWARF_GET_LOC (loc);
98ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux    }
99ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux  return 0;
100ac6c0a6535975f1dc2da6e4e2766614baac2a14aYvan Roux}
101