1/* libunwind - a platform-independent unwind library
2   Copyright (C) 2003-2004 Hewlett-Packard Co
3	Contributed by David Mosberger-Tang <davidm@hpl.hp.com>
4   Copyright (C) 2013 Linaro Limited
5
6This file is part of libunwind.
7
8Permission is hereby granted, free of charge, to any person obtaining
9a copy of this software and associated documentation files (the
10"Software"), to deal in the Software without restriction, including
11without limitation the rights to use, copy, modify, merge, publish,
12distribute, sublicense, and/or sell copies of the Software, and to
13permit persons to whom the Software is furnished to do so, subject to
14the following conditions:
15
16The above copyright notice and this permission notice shall be
17included in all copies or substantial portions of the Software.
18
19THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.  */
26
27#include "_UPT_internal.h"
28
29#include <stddef.h>
30
31#ifdef HAVE_ASM_PTRACE_OFFSETS_H
32# include <asm/ptrace_offsets.h>
33#endif
34
35const int _UPT_reg_offset[UNW_REG_LAST + 1] =
36  {
37#ifdef HAVE_ASM_PTRACE_OFFSETS_H
38# ifndef PT_AR_CSD
39#  define PT_AR_CSD	-1	/* this was introduced with rev 2.1 of ia64 */
40# endif
41
42    [UNW_IA64_GR +  0]	= -1,		[UNW_IA64_GR +  1]	= PT_R1,
43    [UNW_IA64_GR +  2]	= PT_R2,	[UNW_IA64_GR +  3]	= PT_R3,
44    [UNW_IA64_GR +  4]	= PT_R4,	[UNW_IA64_GR +  5]	= PT_R5,
45    [UNW_IA64_GR +  6]	= PT_R6,	[UNW_IA64_GR +  7]	= PT_R7,
46    [UNW_IA64_GR +  8]	= PT_R8,	[UNW_IA64_GR +  9]	= PT_R9,
47    [UNW_IA64_GR + 10]	= PT_R10,	[UNW_IA64_GR + 11]	= PT_R11,
48    [UNW_IA64_GR + 12]	= PT_R12,	[UNW_IA64_GR + 13]	= PT_R13,
49    [UNW_IA64_GR + 14]	= PT_R14,	[UNW_IA64_GR + 15]	= PT_R15,
50    [UNW_IA64_GR + 16]	= PT_R16,	[UNW_IA64_GR + 17]	= PT_R17,
51    [UNW_IA64_GR + 18]	= PT_R18,	[UNW_IA64_GR + 19]	= PT_R19,
52    [UNW_IA64_GR + 20]	= PT_R20,	[UNW_IA64_GR + 21]	= PT_R21,
53    [UNW_IA64_GR + 22]	= PT_R22,	[UNW_IA64_GR + 23]	= PT_R23,
54    [UNW_IA64_GR + 24]	= PT_R24,	[UNW_IA64_GR + 25]	= PT_R25,
55    [UNW_IA64_GR + 26]	= PT_R26,	[UNW_IA64_GR + 27]	= PT_R27,
56    [UNW_IA64_GR + 28]	= PT_R28,	[UNW_IA64_GR + 29]	= PT_R29,
57    [UNW_IA64_GR + 30]	= PT_R30,	[UNW_IA64_GR + 31]	= PT_R31,
58
59    [UNW_IA64_NAT+  0]	= -1,		[UNW_IA64_NAT+  1]	= PT_NAT_BITS,
60    [UNW_IA64_NAT+  2]	= PT_NAT_BITS,	[UNW_IA64_NAT+  3]	= PT_NAT_BITS,
61    [UNW_IA64_NAT+  4]	= PT_NAT_BITS,	[UNW_IA64_NAT+  5]	= PT_NAT_BITS,
62    [UNW_IA64_NAT+  6]	= PT_NAT_BITS,	[UNW_IA64_NAT+  7]	= PT_NAT_BITS,
63    [UNW_IA64_NAT+  8]	= PT_NAT_BITS,	[UNW_IA64_NAT+  9]	= PT_NAT_BITS,
64    [UNW_IA64_NAT+ 10]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 11]	= PT_NAT_BITS,
65    [UNW_IA64_NAT+ 12]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 13]	= PT_NAT_BITS,
66    [UNW_IA64_NAT+ 14]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 15]	= PT_NAT_BITS,
67    [UNW_IA64_NAT+ 16]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 17]	= PT_NAT_BITS,
68    [UNW_IA64_NAT+ 18]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 19]	= PT_NAT_BITS,
69    [UNW_IA64_NAT+ 20]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 21]	= PT_NAT_BITS,
70    [UNW_IA64_NAT+ 22]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 23]	= PT_NAT_BITS,
71    [UNW_IA64_NAT+ 24]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 25]	= PT_NAT_BITS,
72    [UNW_IA64_NAT+ 26]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 27]	= PT_NAT_BITS,
73    [UNW_IA64_NAT+ 28]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 29]	= PT_NAT_BITS,
74    [UNW_IA64_NAT+ 30]	= PT_NAT_BITS,	[UNW_IA64_NAT+ 31]	= PT_NAT_BITS,
75
76    [UNW_IA64_FR +  0]	= -1,		[UNW_IA64_FR +  1]	= -1,
77    [UNW_IA64_FR +  2]	= PT_F2,	[UNW_IA64_FR +  3]	= PT_F3,
78    [UNW_IA64_FR +  4]	= PT_F4,	[UNW_IA64_FR +  5]	= PT_F5,
79    [UNW_IA64_FR +  6]	= PT_F6,	[UNW_IA64_FR +  7]	= PT_F7,
80    [UNW_IA64_FR +  8]	= PT_F8,	[UNW_IA64_FR +  9]	= PT_F9,
81    [UNW_IA64_FR + 10]	= PT_F10,	[UNW_IA64_FR + 11]	= PT_F11,
82    [UNW_IA64_FR + 12]	= PT_F12,	[UNW_IA64_FR + 13]	= PT_F13,
83    [UNW_IA64_FR + 14]	= PT_F14,	[UNW_IA64_FR + 15]	= PT_F15,
84    [UNW_IA64_FR + 16]	= PT_F16,	[UNW_IA64_FR + 17]	= PT_F17,
85    [UNW_IA64_FR + 18]	= PT_F18,	[UNW_IA64_FR + 19]	= PT_F19,
86    [UNW_IA64_FR + 20]	= PT_F20,	[UNW_IA64_FR + 21]	= PT_F21,
87    [UNW_IA64_FR + 22]	= PT_F22,	[UNW_IA64_FR + 23]	= PT_F23,
88    [UNW_IA64_FR + 24]	= PT_F24,	[UNW_IA64_FR + 25]	= PT_F25,
89    [UNW_IA64_FR + 26]	= PT_F26,	[UNW_IA64_FR + 27]	= PT_F27,
90    [UNW_IA64_FR + 28]	= PT_F28,	[UNW_IA64_FR + 29]	= PT_F29,
91    [UNW_IA64_FR + 30]	= PT_F30,	[UNW_IA64_FR + 31]	= PT_F31,
92    [UNW_IA64_FR + 32]	= PT_F32,	[UNW_IA64_FR + 33]	= PT_F33,
93    [UNW_IA64_FR + 34]	= PT_F34,	[UNW_IA64_FR + 35]	= PT_F35,
94    [UNW_IA64_FR + 36]	= PT_F36,	[UNW_IA64_FR + 37]	= PT_F37,
95    [UNW_IA64_FR + 38]	= PT_F38,	[UNW_IA64_FR + 39]	= PT_F39,
96    [UNW_IA64_FR + 40]	= PT_F40,	[UNW_IA64_FR + 41]	= PT_F41,
97    [UNW_IA64_FR + 42]	= PT_F42,	[UNW_IA64_FR + 43]	= PT_F43,
98    [UNW_IA64_FR + 44]	= PT_F44,	[UNW_IA64_FR + 45]	= PT_F45,
99    [UNW_IA64_FR + 46]	= PT_F46,	[UNW_IA64_FR + 47]	= PT_F47,
100    [UNW_IA64_FR + 48]	= PT_F48,	[UNW_IA64_FR + 49]	= PT_F49,
101    [UNW_IA64_FR + 50]	= PT_F50,	[UNW_IA64_FR + 51]	= PT_F51,
102    [UNW_IA64_FR + 52]	= PT_F52,	[UNW_IA64_FR + 53]	= PT_F53,
103    [UNW_IA64_FR + 54]	= PT_F54,	[UNW_IA64_FR + 55]	= PT_F55,
104    [UNW_IA64_FR + 56]	= PT_F56,	[UNW_IA64_FR + 57]	= PT_F57,
105    [UNW_IA64_FR + 58]	= PT_F58,	[UNW_IA64_FR + 59]	= PT_F59,
106    [UNW_IA64_FR + 60]	= PT_F60,	[UNW_IA64_FR + 61]	= PT_F61,
107    [UNW_IA64_FR + 62]	= PT_F62,	[UNW_IA64_FR + 63]	= PT_F63,
108    [UNW_IA64_FR + 64]	= PT_F64,	[UNW_IA64_FR + 65]	= PT_F65,
109    [UNW_IA64_FR + 66]	= PT_F66,	[UNW_IA64_FR + 67]	= PT_F67,
110    [UNW_IA64_FR + 68]	= PT_F68,	[UNW_IA64_FR + 69]	= PT_F69,
111    [UNW_IA64_FR + 70]	= PT_F70,	[UNW_IA64_FR + 71]	= PT_F71,
112    [UNW_IA64_FR + 72]	= PT_F72,	[UNW_IA64_FR + 73]	= PT_F73,
113    [UNW_IA64_FR + 74]	= PT_F74,	[UNW_IA64_FR + 75]	= PT_F75,
114    [UNW_IA64_FR + 76]	= PT_F76,	[UNW_IA64_FR + 77]	= PT_F77,
115    [UNW_IA64_FR + 78]	= PT_F78,	[UNW_IA64_FR + 79]	= PT_F79,
116    [UNW_IA64_FR + 80]	= PT_F80,	[UNW_IA64_FR + 81]	= PT_F81,
117    [UNW_IA64_FR + 82]	= PT_F82,	[UNW_IA64_FR + 83]	= PT_F83,
118    [UNW_IA64_FR + 84]	= PT_F84,	[UNW_IA64_FR + 85]	= PT_F85,
119    [UNW_IA64_FR + 86]	= PT_F86,	[UNW_IA64_FR + 87]	= PT_F87,
120    [UNW_IA64_FR + 88]	= PT_F88,	[UNW_IA64_FR + 89]	= PT_F89,
121    [UNW_IA64_FR + 90]	= PT_F90,	[UNW_IA64_FR + 91]	= PT_F91,
122    [UNW_IA64_FR + 92]	= PT_F92,	[UNW_IA64_FR + 93]	= PT_F93,
123    [UNW_IA64_FR + 94]	= PT_F94,	[UNW_IA64_FR + 95]	= PT_F95,
124    [UNW_IA64_FR + 96]	= PT_F96,	[UNW_IA64_FR + 97]	= PT_F97,
125    [UNW_IA64_FR + 98]	= PT_F98,	[UNW_IA64_FR + 99]	= PT_F99,
126    [UNW_IA64_FR +100]	= PT_F100,	[UNW_IA64_FR +101]	= PT_F101,
127    [UNW_IA64_FR +102]	= PT_F102,	[UNW_IA64_FR +103]	= PT_F103,
128    [UNW_IA64_FR +104]	= PT_F104,	[UNW_IA64_FR +105]	= PT_F105,
129    [UNW_IA64_FR +106]	= PT_F106,	[UNW_IA64_FR +107]	= PT_F107,
130    [UNW_IA64_FR +108]	= PT_F108,	[UNW_IA64_FR +109]	= PT_F109,
131    [UNW_IA64_FR +110]	= PT_F110,	[UNW_IA64_FR +111]	= PT_F111,
132    [UNW_IA64_FR +112]	= PT_F112,	[UNW_IA64_FR +113]	= PT_F113,
133    [UNW_IA64_FR +114]	= PT_F114,	[UNW_IA64_FR +115]	= PT_F115,
134    [UNW_IA64_FR +116]	= PT_F116,	[UNW_IA64_FR +117]	= PT_F117,
135    [UNW_IA64_FR +118]	= PT_F118,	[UNW_IA64_FR +119]	= PT_F119,
136    [UNW_IA64_FR +120]	= PT_F120,	[UNW_IA64_FR +121]	= PT_F121,
137    [UNW_IA64_FR +122]	= PT_F122,	[UNW_IA64_FR +123]	= PT_F123,
138    [UNW_IA64_FR +124]	= PT_F124,	[UNW_IA64_FR +125]	= PT_F125,
139    [UNW_IA64_FR +126]	= PT_F126,	[UNW_IA64_FR +127]	= PT_F127,
140
141    [UNW_IA64_AR +  0]	= -1,		[UNW_IA64_AR +  1]	= -1,
142    [UNW_IA64_AR +  2]	= -1,		[UNW_IA64_AR +  3]	= -1,
143    [UNW_IA64_AR +  4]	= -1,		[UNW_IA64_AR +  5]	= -1,
144    [UNW_IA64_AR +  6]	= -1,		[UNW_IA64_AR +  7]	= -1,
145    [UNW_IA64_AR +  8]	= -1,		[UNW_IA64_AR +  9]	= -1,
146    [UNW_IA64_AR + 10]	= -1,		[UNW_IA64_AR + 11]	= -1,
147    [UNW_IA64_AR + 12]	= -1,		[UNW_IA64_AR + 13]	= -1,
148    [UNW_IA64_AR + 14]	= -1,		[UNW_IA64_AR + 15]	= -1,
149    [UNW_IA64_AR + 16]	= PT_AR_RSC,	[UNW_IA64_AR + 17]	= PT_AR_BSP,
150    [UNW_IA64_AR + 18]	= PT_AR_BSPSTORE,[UNW_IA64_AR + 19]	= PT_AR_RNAT,
151    [UNW_IA64_AR + 20]	= -1,		[UNW_IA64_AR + 21]	= -1,
152    [UNW_IA64_AR + 22]	= -1,		[UNW_IA64_AR + 23]	= -1,
153    [UNW_IA64_AR + 24]	= -1,		[UNW_IA64_AR + 25]	= PT_AR_CSD,
154    [UNW_IA64_AR + 26]	= -1,		[UNW_IA64_AR + 27]	= -1,
155    [UNW_IA64_AR + 28]	= -1,		[UNW_IA64_AR + 29]	= -1,
156    [UNW_IA64_AR + 30]	= -1,		[UNW_IA64_AR + 31]	= -1,
157    [UNW_IA64_AR + 32]	= PT_AR_CCV,	[UNW_IA64_AR + 33]	= -1,
158    [UNW_IA64_AR + 34]	= -1,		[UNW_IA64_AR + 35]	= -1,
159    [UNW_IA64_AR + 36]	= PT_AR_UNAT,	[UNW_IA64_AR + 37]	= -1,
160    [UNW_IA64_AR + 38]	= -1,		[UNW_IA64_AR + 39]	= -1,
161    [UNW_IA64_AR + 40]	= PT_AR_FPSR,	[UNW_IA64_AR + 41]	= -1,
162    [UNW_IA64_AR + 42]	= -1,		[UNW_IA64_AR + 43]	= -1,
163    [UNW_IA64_AR + 44]	= -1,		[UNW_IA64_AR + 45]	= -1,
164    [UNW_IA64_AR + 46]	= -1,		[UNW_IA64_AR + 47]	= -1,
165    [UNW_IA64_AR + 48]	= -1,		[UNW_IA64_AR + 49]	= -1,
166    [UNW_IA64_AR + 50]	= -1,		[UNW_IA64_AR + 51]	= -1,
167    [UNW_IA64_AR + 52]	= -1,		[UNW_IA64_AR + 53]	= -1,
168    [UNW_IA64_AR + 54]	= -1,		[UNW_IA64_AR + 55]	= -1,
169    [UNW_IA64_AR + 56]	= -1,		[UNW_IA64_AR + 57]	= -1,
170    [UNW_IA64_AR + 58]	= -1,		[UNW_IA64_AR + 59]	= -1,
171    [UNW_IA64_AR + 60]	= -1,		[UNW_IA64_AR + 61]	= -1,
172    [UNW_IA64_AR + 62]	= -1,		[UNW_IA64_AR + 63]	= -1,
173    [UNW_IA64_AR + 64]	= PT_AR_PFS,	[UNW_IA64_AR + 65]	= PT_AR_LC,
174    [UNW_IA64_AR + 66]	= PT_AR_EC,	[UNW_IA64_AR + 67]	= -1,
175    [UNW_IA64_AR + 68]	= -1,		[UNW_IA64_AR + 69]	= -1,
176    [UNW_IA64_AR + 70]	= -1,		[UNW_IA64_AR + 71]	= -1,
177    [UNW_IA64_AR + 72]	= -1,		[UNW_IA64_AR + 73]	= -1,
178    [UNW_IA64_AR + 74]	= -1,		[UNW_IA64_AR + 75]	= -1,
179    [UNW_IA64_AR + 76]	= -1,		[UNW_IA64_AR + 77]	= -1,
180    [UNW_IA64_AR + 78]	= -1,		[UNW_IA64_AR + 79]	= -1,
181    [UNW_IA64_AR + 80]	= -1,		[UNW_IA64_AR + 81]	= -1,
182    [UNW_IA64_AR + 82]	= -1,		[UNW_IA64_AR + 83]	= -1,
183    [UNW_IA64_AR + 84]	= -1,		[UNW_IA64_AR + 85]	= -1,
184    [UNW_IA64_AR + 86]	= -1,		[UNW_IA64_AR + 87]	= -1,
185    [UNW_IA64_AR + 88]	= -1,		[UNW_IA64_AR + 89]	= -1,
186    [UNW_IA64_AR + 90]	= -1,		[UNW_IA64_AR + 91]	= -1,
187    [UNW_IA64_AR + 92]	= -1,		[UNW_IA64_AR + 93]	= -1,
188    [UNW_IA64_AR + 94]	= -1,		[UNW_IA64_AR + 95]	= -1,
189    [UNW_IA64_AR + 96]	= -1,		[UNW_IA64_AR + 97]	= -1,
190    [UNW_IA64_AR + 98]	= -1,		[UNW_IA64_AR + 99]	= -1,
191    [UNW_IA64_AR +100]	= -1,		[UNW_IA64_AR +101]	= -1,
192    [UNW_IA64_AR +102]	= -1,		[UNW_IA64_AR +103]	= -1,
193    [UNW_IA64_AR +104]	= -1,		[UNW_IA64_AR +105]	= -1,
194    [UNW_IA64_AR +106]	= -1,		[UNW_IA64_AR +107]	= -1,
195    [UNW_IA64_AR +108]	= -1,		[UNW_IA64_AR +109]	= -1,
196    [UNW_IA64_AR +110]	= -1,		[UNW_IA64_AR +111]	= -1,
197    [UNW_IA64_AR +112]	= -1,		[UNW_IA64_AR +113]	= -1,
198    [UNW_IA64_AR +114]	= -1,		[UNW_IA64_AR +115]	= -1,
199    [UNW_IA64_AR +116]	= -1,		[UNW_IA64_AR +117]	= -1,
200    [UNW_IA64_AR +118]	= -1,		[UNW_IA64_AR +119]	= -1,
201    [UNW_IA64_AR +120]	= -1,		[UNW_IA64_AR +121]	= -1,
202    [UNW_IA64_AR +122]	= -1,		[UNW_IA64_AR +123]	= -1,
203    [UNW_IA64_AR +124]	= -1,		[UNW_IA64_AR +125]	= -1,
204    [UNW_IA64_AR +126]	= -1,		[UNW_IA64_AR +127]	= -1,
205
206    [UNW_IA64_BR +  0]	= PT_B0,	[UNW_IA64_BR +  1]	= PT_B1,
207    [UNW_IA64_BR +  2]	= PT_B2,	[UNW_IA64_BR +  3]	= PT_B3,
208    [UNW_IA64_BR +  4]	= PT_B4,	[UNW_IA64_BR +  5]	= PT_B5,
209    [UNW_IA64_BR +  6]	= PT_B6,	[UNW_IA64_BR +  7]	= PT_B7,
210
211    [UNW_IA64_PR]	= PT_PR,
212    [UNW_IA64_CFM]	= PT_CFM,
213    [UNW_IA64_IP]	= PT_CR_IIP
214#elif defined(HAVE_TTRACE)
215# warning No support for ttrace() yet.
216#elif defined(UNW_TARGET_HPPA)
217    [UNW_HPPA_GR +  0]	= 0x000,	[UNW_HPPA_GR +  1]	= 0x004,
218    [UNW_HPPA_GR +  2]	= 0x008,	[UNW_HPPA_GR +  3]	= 0x00c,
219    [UNW_HPPA_GR +  4]	= 0x010,	[UNW_HPPA_GR +  5]	= 0x014,
220    [UNW_HPPA_GR +  6]	= 0x018,	[UNW_HPPA_GR +  7]	= 0x01c,
221    [UNW_HPPA_GR +  8]	= 0x020,	[UNW_HPPA_GR +  9]	= 0x024,
222    [UNW_HPPA_GR + 10]	= 0x028,	[UNW_HPPA_GR + 11]	= 0x02c,
223    [UNW_HPPA_GR + 12]	= 0x030,	[UNW_HPPA_GR + 13]	= 0x034,
224    [UNW_HPPA_GR + 14]	= 0x038,	[UNW_HPPA_GR + 15]	= 0x03c,
225    [UNW_HPPA_GR + 16]	= 0x040,	[UNW_HPPA_GR + 17]	= 0x044,
226    [UNW_HPPA_GR + 18]	= 0x048,	[UNW_HPPA_GR + 19]	= 0x04c,
227    [UNW_HPPA_GR + 20]	= 0x050,	[UNW_HPPA_GR + 21]	= 0x054,
228    [UNW_HPPA_GR + 22]	= 0x058,	[UNW_HPPA_GR + 23]	= 0x05c,
229    [UNW_HPPA_GR + 24]	= 0x060,	[UNW_HPPA_GR + 25]	= 0x064,
230    [UNW_HPPA_GR + 26]	= 0x068,	[UNW_HPPA_GR + 27]	= 0x06c,
231    [UNW_HPPA_GR + 28]	= 0x070,	[UNW_HPPA_GR + 29]	= 0x074,
232    [UNW_HPPA_GR + 30]	= 0x078,	[UNW_HPPA_GR + 31]	= 0x07c,
233
234    [UNW_HPPA_FR +  0]	= 0x080,	[UNW_HPPA_FR +  1]	= 0x088,
235    [UNW_HPPA_FR +  2]	= 0x090,	[UNW_HPPA_FR +  3]	= 0x098,
236    [UNW_HPPA_FR +  4]	= 0x0a0,	[UNW_HPPA_FR +  5]	= 0x0a8,
237    [UNW_HPPA_FR +  6]	= 0x0b0,	[UNW_HPPA_FR +  7]	= 0x0b8,
238    [UNW_HPPA_FR +  8]	= 0x0c0,	[UNW_HPPA_FR +  9]	= 0x0c8,
239    [UNW_HPPA_FR + 10]	= 0x0d0,	[UNW_HPPA_FR + 11]	= 0x0d8,
240    [UNW_HPPA_FR + 12]	= 0x0e0,	[UNW_HPPA_FR + 13]	= 0x0e8,
241    [UNW_HPPA_FR + 14]	= 0x0f0,	[UNW_HPPA_FR + 15]	= 0x0f8,
242    [UNW_HPPA_FR + 16]	= 0x100,	[UNW_HPPA_FR + 17]	= 0x108,
243    [UNW_HPPA_FR + 18]	= 0x110,	[UNW_HPPA_FR + 19]	= 0x118,
244    [UNW_HPPA_FR + 20]	= 0x120,	[UNW_HPPA_FR + 21]	= 0x128,
245    [UNW_HPPA_FR + 22]	= 0x130,	[UNW_HPPA_FR + 23]	= 0x138,
246    [UNW_HPPA_FR + 24]	= 0x140,	[UNW_HPPA_FR + 25]	= 0x148,
247    [UNW_HPPA_FR + 26]	= 0x150,	[UNW_HPPA_FR + 27]	= 0x158,
248    [UNW_HPPA_FR + 28]	= 0x160,	[UNW_HPPA_FR + 29]	= 0x168,
249    [UNW_HPPA_FR + 30]	= 0x170,	[UNW_HPPA_FR + 31]	= 0x178,
250
251    [UNW_HPPA_IP]	= 0x1a8		/* IAOQ[0] */
252#elif defined(UNW_TARGET_X86)
253#if defined __FreeBSD__
254#define UNW_R_OFF(R, r) \
255    [UNW_X86_##R]	= offsetof(gregset_t, r_##r),
256    UNW_R_OFF(EAX, eax)
257    UNW_R_OFF(EDX, edx)
258    UNW_R_OFF(ECX, ecx)
259    UNW_R_OFF(EBX, ebx)
260    UNW_R_OFF(ESI, esi)
261    UNW_R_OFF(EDI, edi)
262    UNW_R_OFF(EBP, ebp)
263    UNW_R_OFF(ESP, esp)
264    UNW_R_OFF(EIP, eip)
265//  UNW_R_OFF(CS, cs)
266//  UNW_R_OFF(EFLAGS, eflags)
267//  UNW_R_OFF(SS, ss)
268#elif defined __linux__
269    [UNW_X86_EAX]	= 0x18,
270    [UNW_X86_EBX]	= 0x00,
271    [UNW_X86_ECX]	= 0x04,
272    [UNW_X86_EDX]	= 0x08,
273    [UNW_X86_ESI]	= 0x0c,
274    [UNW_X86_EDI]	= 0x10,
275    [UNW_X86_EBP]	= 0x14,
276    [UNW_X86_EIP]	= 0x30,
277    [UNW_X86_ESP]	= 0x3c
278/*  CS			= 0x34, */
279/*  DS			= 0x1c, */
280/*  ES			= 0x20, */
281/*  FS			= 0x24, */
282/*  GS			= 0x28, */
283/*  ORIG_EAX		= 0x2c, */
284/*  EFLAGS		= 0x38, */
285/*  SS			= 0x40 */
286#else
287#error Port me
288#endif
289#elif defined(UNW_TARGET_X86_64)
290#if defined __FreeBSD__
291#define UNW_R_OFF(R, r) \
292    [UNW_X86_64_##R]	= offsetof(gregset_t, r_##r),
293    UNW_R_OFF(RAX, rax)
294    UNW_R_OFF(RDX, rdx)
295    UNW_R_OFF(RCX, rcx)
296    UNW_R_OFF(RBX, rbx)
297    UNW_R_OFF(RSI, rsi)
298    UNW_R_OFF(RDI, rdi)
299    UNW_R_OFF(RBP, rbp)
300    UNW_R_OFF(RSP, rsp)
301    UNW_R_OFF(R8, r8)
302    UNW_R_OFF(R9, r9)
303    UNW_R_OFF(R10, r10)
304    UNW_R_OFF(R11, r11)
305    UNW_R_OFF(R12, r12)
306    UNW_R_OFF(R13, r13)
307    UNW_R_OFF(R14, r14)
308    UNW_R_OFF(R15, r15)
309    UNW_R_OFF(RIP, rip)
310//  UNW_R_OFF(CS, cs)
311//  UNW_R_OFF(EFLAGS, rflags)
312//  UNW_R_OFF(SS, ss)
313#undef UNW_R_OFF
314#elif defined __linux__
315    [UNW_X86_64_RAX]	= 0x50,
316    [UNW_X86_64_RDX]	= 0x60,
317    [UNW_X86_64_RCX]	= 0x58,
318    [UNW_X86_64_RBX]	= 0x28,
319    [UNW_X86_64_RSI]	= 0x68,
320    [UNW_X86_64_RDI]	= 0x70,
321    [UNW_X86_64_RBP]	= 0x20,
322    [UNW_X86_64_RSP]	= 0x98,
323    [UNW_X86_64_R8]	= 0x48,
324    [UNW_X86_64_R9]	= 0x40,
325    [UNW_X86_64_R10]	= 0x38,
326    [UNW_X86_64_R11]	= 0x30,
327    [UNW_X86_64_R12]	= 0x18,
328    [UNW_X86_64_R13]	= 0x10,
329    [UNW_X86_64_R14]	= 0x08,
330    [UNW_X86_64_R15]	= 0x00,
331    [UNW_X86_64_RIP]	= 0x80
332//  [UNW_X86_64_CS]	= 0x88,
333//  [UNW_X86_64_EFLAGS]	= 0x90,
334//  [UNW_X86_64_RSP]	= 0x98,
335//  [UNW_X86_64_SS]	= 0xa0
336#else
337#error Port me
338#endif
339#elif defined(UNW_TARGET_PPC32) || defined(UNW_TARGET_PPC64)
340
341#define UNW_REG_SLOT_SIZE sizeof(unsigned long)
342#define UNW_PPC_R(v) ((v) * UNW_REG_SLOT_SIZE)
343#define UNW_PPC_PT(p) UNW_PPC_R(PT_##p)
344
345#define UNW_FP_OFF(b, i)    \
346    [UNW_PPC##b##_F##i] = UNW_PPC_R(PT_FPR0 + i * 8/UNW_REG_SLOT_SIZE)
347
348#define UNW_R_OFF(b, i) \
349    [UNW_PPC##b##_R##i] = UNW_PPC_R(PT_R##i)
350
351#define UNW_PPC_REGS(b) \
352    UNW_R_OFF(b, 0),	\
353    UNW_R_OFF(b, 1),	\
354    UNW_R_OFF(b, 2),	\
355    UNW_R_OFF(b, 3),	\
356    UNW_R_OFF(b, 4),	\
357    UNW_R_OFF(b, 5),	\
358    UNW_R_OFF(b, 6),	\
359    UNW_R_OFF(b, 7),	\
360    UNW_R_OFF(b, 8),	\
361    UNW_R_OFF(b, 9),	\
362    UNW_R_OFF(b, 10),	\
363    UNW_R_OFF(b, 11),	\
364    UNW_R_OFF(b, 12),	\
365    UNW_R_OFF(b, 13),	\
366    UNW_R_OFF(b, 14),	\
367    UNW_R_OFF(b, 15),	\
368    UNW_R_OFF(b, 16),	\
369    UNW_R_OFF(b, 17),	\
370    UNW_R_OFF(b, 18),	\
371    UNW_R_OFF(b, 19),	\
372    UNW_R_OFF(b, 20),	\
373    UNW_R_OFF(b, 21),	\
374    UNW_R_OFF(b, 22),	\
375    UNW_R_OFF(b, 23),	\
376    UNW_R_OFF(b, 24),	\
377    UNW_R_OFF(b, 25),	\
378    UNW_R_OFF(b, 26),	\
379    UNW_R_OFF(b, 27),	\
380    UNW_R_OFF(b, 28),	\
381    UNW_R_OFF(b, 29),	\
382    UNW_R_OFF(b, 30),	\
383    UNW_R_OFF(b, 31),	\
384                               \
385    [UNW_PPC##b##_CTR] = UNW_PPC_PT(CTR), \
386    [UNW_PPC##b##_XER] = UNW_PPC_PT(XER), \
387    [UNW_PPC##b##_LR]  = UNW_PPC_PT(LNK), \
388                               \
389    UNW_FP_OFF(b, 0), \
390    UNW_FP_OFF(b, 1), \
391    UNW_FP_OFF(b, 2), \
392    UNW_FP_OFF(b, 3), \
393    UNW_FP_OFF(b, 4), \
394    UNW_FP_OFF(b, 5), \
395    UNW_FP_OFF(b, 6), \
396    UNW_FP_OFF(b, 7), \
397    UNW_FP_OFF(b, 8), \
398    UNW_FP_OFF(b, 9), \
399    UNW_FP_OFF(b, 10), \
400    UNW_FP_OFF(b, 11), \
401    UNW_FP_OFF(b, 12), \
402    UNW_FP_OFF(b, 13), \
403    UNW_FP_OFF(b, 14), \
404    UNW_FP_OFF(b, 15), \
405    UNW_FP_OFF(b, 16), \
406    UNW_FP_OFF(b, 17), \
407    UNW_FP_OFF(b, 18), \
408    UNW_FP_OFF(b, 19), \
409    UNW_FP_OFF(b, 20), \
410    UNW_FP_OFF(b, 21), \
411    UNW_FP_OFF(b, 22), \
412    UNW_FP_OFF(b, 23), \
413    UNW_FP_OFF(b, 24), \
414    UNW_FP_OFF(b, 25), \
415    UNW_FP_OFF(b, 26), \
416    UNW_FP_OFF(b, 27), \
417    UNW_FP_OFF(b, 28), \
418    UNW_FP_OFF(b, 29), \
419    UNW_FP_OFF(b, 30), \
420    UNW_FP_OFF(b, 31)
421
422#define UNW_PPC32_REGS \
423    [UNW_PPC32_FPSCR] = UNW_PPC_PT(FPSCR), \
424    [UNW_PPC32_CCR] = UNW_PPC_PT(CCR)
425
426#define UNW_VR_OFF(i)	\
427    [UNW_PPC64_V##i] = UNW_PPC_R(PT_VR0 + i * 2)
428
429#define UNW_PPC64_REGS \
430    [UNW_PPC64_NIP] = UNW_PPC_PT(NIP), \
431    [UNW_PPC64_FRAME_POINTER] = -1, \
432    [UNW_PPC64_ARG_POINTER] = -1,   \
433    [UNW_PPC64_CR0] = -1,           \
434    [UNW_PPC64_CR1] = -1,           \
435    [UNW_PPC64_CR2] = -1,           \
436    [UNW_PPC64_CR3] = -1,           \
437    [UNW_PPC64_CR4] = -1,           \
438    [UNW_PPC64_CR5] = -1,           \
439    [UNW_PPC64_CR6] = -1,           \
440    [UNW_PPC64_CR7] = -1,           \
441    [UNW_PPC64_VRSAVE] = UNW_PPC_PT(VRSAVE), \
442    [UNW_PPC64_VSCR] = UNW_PPC_PT(VSCR),     \
443    [UNW_PPC64_SPE_ACC] = -1,       \
444    [UNW_PPC64_SPEFSCR] = -1,       \
445    UNW_VR_OFF(0), \
446    UNW_VR_OFF(1), \
447    UNW_VR_OFF(2), \
448    UNW_VR_OFF(3), \
449    UNW_VR_OFF(4), \
450    UNW_VR_OFF(5), \
451    UNW_VR_OFF(6), \
452    UNW_VR_OFF(7), \
453    UNW_VR_OFF(8), \
454    UNW_VR_OFF(9), \
455    UNW_VR_OFF(10), \
456    UNW_VR_OFF(11), \
457    UNW_VR_OFF(12), \
458    UNW_VR_OFF(13), \
459    UNW_VR_OFF(14), \
460    UNW_VR_OFF(15), \
461    UNW_VR_OFF(16), \
462    UNW_VR_OFF(17), \
463    UNW_VR_OFF(18), \
464    UNW_VR_OFF(19), \
465    UNW_VR_OFF(20), \
466    UNW_VR_OFF(21), \
467    UNW_VR_OFF(22), \
468    UNW_VR_OFF(23), \
469    UNW_VR_OFF(24), \
470    UNW_VR_OFF(25), \
471    UNW_VR_OFF(26), \
472    UNW_VR_OFF(27), \
473    UNW_VR_OFF(28), \
474    UNW_VR_OFF(29), \
475    UNW_VR_OFF(30), \
476    UNW_VR_OFF(31)
477
478#if defined(UNW_TARGET_PPC32)
479    UNW_PPC_REGS(32),
480    UNW_PPC32_REGS,
481#else
482    UNW_PPC_REGS(64),
483    UNW_PPC64_REGS,
484#endif
485
486#elif defined(UNW_TARGET_ARM)
487    [UNW_ARM_R0]       = 0x00,
488    [UNW_ARM_R1]       = 0x04,
489    [UNW_ARM_R2]       = 0x08,
490    [UNW_ARM_R3]       = 0x0c,
491    [UNW_ARM_R4]       = 0x10,
492    [UNW_ARM_R5]       = 0x14,
493    [UNW_ARM_R6]       = 0x18,
494    [UNW_ARM_R7]       = 0x1c,
495    [UNW_ARM_R8]       = 0x20,
496    [UNW_ARM_R9]       = 0x24,
497    [UNW_ARM_R10]      = 0x28,
498    [UNW_ARM_R11]      = 0x2c,
499    [UNW_ARM_R12]      = 0x30,
500    [UNW_ARM_R13]      = 0x34,
501    [UNW_ARM_R14]      = 0x38,
502    [UNW_ARM_R15]      = 0x3c,
503#elif defined(UNW_TARGET_MIPS)
504#elif defined(UNW_TARGET_SH)
505#elif defined(UNW_TARGET_AARCH64)
506    [UNW_AARCH64_X0]       = 0x00,
507    [UNW_AARCH64_X1]       = 0x08,
508    [UNW_AARCH64_X2]       = 0x10,
509    [UNW_AARCH64_X3]       = 0x18,
510    [UNW_AARCH64_X4]       = 0x20,
511    [UNW_AARCH64_X5]       = 0x28,
512    [UNW_AARCH64_X6]       = 0x30,
513    [UNW_AARCH64_X7]       = 0x38,
514    [UNW_AARCH64_X8]       = 0x40,
515    [UNW_AARCH64_X9]       = 0x48,
516    [UNW_AARCH64_X10]      = 0x50,
517    [UNW_AARCH64_X11]      = 0x58,
518    [UNW_AARCH64_X12]      = 0x60,
519    [UNW_AARCH64_X13]      = 0x68,
520    [UNW_AARCH64_X14]      = 0x70,
521    [UNW_AARCH64_X15]      = 0x78,
522    [UNW_AARCH64_X16]      = 0x80,
523    [UNW_AARCH64_X17]      = 0x88,
524    [UNW_AARCH64_X18]      = 0x90,
525    [UNW_AARCH64_X19]      = 0x98,
526    [UNW_AARCH64_X20]      = 0xa0,
527    [UNW_AARCH64_X21]      = 0xa8,
528    [UNW_AARCH64_X22]      = 0xb0,
529    [UNW_AARCH64_X23]      = 0xb8,
530    [UNW_AARCH64_X24]      = 0xc0,
531    [UNW_AARCH64_X25]      = 0xc8,
532    [UNW_AARCH64_X26]      = 0xd0,
533    [UNW_AARCH64_X27]      = 0xd8,
534    [UNW_AARCH64_X28]      = 0xe0,
535    [UNW_AARCH64_X29]      = 0xe8,
536    [UNW_AARCH64_X30]      = 0xf0,
537    [UNW_AARCH64_SP]       = 0xf8,
538    [UNW_AARCH64_PC]       = 0x100,
539    [UNW_AARCH64_PSTATE]   = 0x108
540#else
541# error Fix me.
542#endif
543  };
544