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 
6 This file is part of libunwind.
7 
8 Permission is hereby granted, free of charge, to any person obtaining
9 a copy of this software and associated documentation files (the
10 "Software"), to deal in the Software without restriction, including
11 without limitation the rights to use, copy, modify, merge, publish,
12 distribute, sublicense, and/or sell copies of the Software, and to
13 permit persons to whom the Software is furnished to do so, subject to
14 the following conditions:
15 
16 The above copyright notice and this permission notice shall be
17 included in all copies or substantial portions of the Software.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
20 EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21 MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
22 NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
23 LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
24 OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
25 WITH 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 
35 const 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