decode.h revision 1.1.14.2 1 1.1.14.2 yamt /* $NetBSD: decode.h,v 1.1.14.2 2006/06/21 14:52:58 yamt Exp $ */
2 1.1.14.2 yamt
3 1.1.14.2 yamt /* Contributed to the NetBSD Foundation by Cherry G. Mathew <cherry (at) mahiti.org>
4 1.1.14.2 yamt * This file contains prototypes to decode unwind descriptors.
5 1.1.14.2 yamt */
6 1.1.14.2 yamt
7 1.1.14.2 yamt #define MAXSTATERECS 20 /* The maximum number of descriptor records per region */
8 1.1.14.2 yamt
9 1.1.14.2 yamt #define IS_R1(byte) (( (byte) & 0xc0) == 0)
10 1.1.14.2 yamt #define IS_R2(byte) (((byte) & 0xf8) == 0x40)
11 1.1.14.2 yamt #define IS_R3(byte) (((byte) & 0xfc) == 0x60)
12 1.1.14.2 yamt #define IS_P1(byte) (((byte) & 0xe0) == 0x80)
13 1.1.14.2 yamt #define IS_P2(byte) (((byte) & 0xf0) == 0xa0)
14 1.1.14.2 yamt #define IS_P3(byte) (((byte) & 0xf8) == 0xb0)
15 1.1.14.2 yamt #define IS_P4(byte) ((byte) == (char) 0xb8)
16 1.1.14.2 yamt #define IS_P5(byte) ((byte) == (char) 0xb9)
17 1.1.14.2 yamt #define IS_P6(byte) (((byte) & 0xe0) == 0xc0)
18 1.1.14.2 yamt #define IS_P7(byte) (((byte) & 0xf0) == 0xe0)
19 1.1.14.2 yamt #define IS_P8(byte) ((byte) == (char) 0xf0)
20 1.1.14.2 yamt #define IS_P9(byte) ((byte) == (char) 0xf1)
21 1.1.14.2 yamt #define IS_P10(byte) ((byte) ==(char) 0xff)
22 1.1.14.2 yamt #define IS_B1(byte) (((byte) & 0xc0) == 0x80)
23 1.1.14.2 yamt #define IS_B2(byte) (((byte) & 0xe0) == 0xc0)
24 1.1.14.2 yamt #define IS_B3(byte) ((byte) == (char) 0xe0)
25 1.1.14.2 yamt #define IS_B4(byte) (((byte) & 0xf7) == 0xf0)
26 1.1.14.2 yamt #define IS_X1(byte) ((byte) == (char) 0xf9)
27 1.1.14.2 yamt #define IS_X2(byte) ((byte) == (char) 0xfa)
28 1.1.14.2 yamt #define IS_X3(byte) ((byte) == (char) 0xfb)
29 1.1.14.2 yamt #define IS_X4(byte) ((byte) == (char) 0xfc)
30 1.1.14.2 yamt
31 1.1.14.2 yamt struct unwind_desc_R1 {
32 1.1.14.2 yamt boolean_t r;
33 1.1.14.2 yamt vsize_t rlen;
34 1.1.14.2 yamt };
35 1.1.14.2 yamt
36 1.1.14.2 yamt struct unwind_desc_R2 {
37 1.1.14.2 yamt u_int mask;
38 1.1.14.2 yamt #define R2MASKRP 0x8
39 1.1.14.2 yamt #define R2MASKPFS 0x4
40 1.1.14.2 yamt #define R2MASKPSP 0x2
41 1.1.14.2 yamt
42 1.1.14.2 yamt u_int grsave;
43 1.1.14.2 yamt vsize_t rlen;
44 1.1.14.2 yamt };
45 1.1.14.2 yamt
46 1.1.14.2 yamt struct unwind_desc_R3 {
47 1.1.14.2 yamt boolean_t r;
48 1.1.14.2 yamt vsize_t rlen;
49 1.1.14.2 yamt };
50 1.1.14.2 yamt
51 1.1.14.2 yamt struct unwind_desc_P1 {
52 1.1.14.2 yamt u_int brmask;
53 1.1.14.2 yamt };
54 1.1.14.2 yamt
55 1.1.14.2 yamt struct unwind_desc_P2 {
56 1.1.14.2 yamt u_int brmask;
57 1.1.14.2 yamt u_int gr;
58 1.1.14.2 yamt };
59 1.1.14.2 yamt
60 1.1.14.2 yamt struct unwind_desc_P3 {
61 1.1.14.2 yamt u_int r;
62 1.1.14.2 yamt u_int grbr;
63 1.1.14.2 yamt };
64 1.1.14.2 yamt
65 1.1.14.2 yamt struct unwind_desc_P4 {
66 1.1.14.2 yamt vsize_t imask;
67 1.1.14.2 yamt };
68 1.1.14.2 yamt
69 1.1.14.2 yamt struct unwind_desc_P5 {
70 1.1.14.2 yamt u_int grmask;
71 1.1.14.2 yamt u_int frmask;
72 1.1.14.2 yamt };
73 1.1.14.2 yamt
74 1.1.14.2 yamt struct unwind_desc_P6 {
75 1.1.14.2 yamt boolean_t r;
76 1.1.14.2 yamt u_int rmask;
77 1.1.14.2 yamt };
78 1.1.14.2 yamt
79 1.1.14.2 yamt struct unwind_desc_P7 {
80 1.1.14.2 yamt u_int r;
81 1.1.14.2 yamt vsize_t t;
82 1.1.14.2 yamt vsize_t size;
83 1.1.14.2 yamt };
84 1.1.14.2 yamt
85 1.1.14.2 yamt struct unwind_desc_P8 {
86 1.1.14.2 yamt u_int r;
87 1.1.14.2 yamt vsize_t t;
88 1.1.14.2 yamt };
89 1.1.14.2 yamt
90 1.1.14.2 yamt struct unwind_desc_P9 {
91 1.1.14.2 yamt u_int grmask;
92 1.1.14.2 yamt u_int gr;
93 1.1.14.2 yamt };
94 1.1.14.2 yamt
95 1.1.14.2 yamt struct unwind_desc_P10 {
96 1.1.14.2 yamt u_int abi;
97 1.1.14.2 yamt u_int context;
98 1.1.14.2 yamt };
99 1.1.14.2 yamt
100 1.1.14.2 yamt struct unwind_desc_B1 {
101 1.1.14.2 yamt boolean_t r;
102 1.1.14.2 yamt u_int label;
103 1.1.14.2 yamt };
104 1.1.14.2 yamt
105 1.1.14.2 yamt struct unwind_desc_B2 {
106 1.1.14.2 yamt u_int ecount;
107 1.1.14.2 yamt vsize_t t;
108 1.1.14.2 yamt };
109 1.1.14.2 yamt
110 1.1.14.2 yamt struct unwind_desc_B3 {
111 1.1.14.2 yamt vsize_t t;
112 1.1.14.2 yamt vsize_t ecount;
113 1.1.14.2 yamt };
114 1.1.14.2 yamt
115 1.1.14.2 yamt struct unwind_desc_B4 {
116 1.1.14.2 yamt boolean_t r;
117 1.1.14.2 yamt vsize_t label;
118 1.1.14.2 yamt };
119 1.1.14.2 yamt
120 1.1.14.2 yamt struct unwind_desc_X1 {
121 1.1.14.2 yamt boolean_t r;
122 1.1.14.2 yamt boolean_t a;
123 1.1.14.2 yamt boolean_t b;
124 1.1.14.2 yamt u_int reg;
125 1.1.14.2 yamt vsize_t t;
126 1.1.14.2 yamt vsize_t offset;
127 1.1.14.2 yamt };
128 1.1.14.2 yamt
129 1.1.14.2 yamt struct unwind_desc_X2 {
130 1.1.14.2 yamt boolean_t x;
131 1.1.14.2 yamt boolean_t a;
132 1.1.14.2 yamt boolean_t b;
133 1.1.14.2 yamt u_int reg;
134 1.1.14.2 yamt boolean_t y;
135 1.1.14.2 yamt u_int treg;
136 1.1.14.2 yamt vsize_t t;
137 1.1.14.2 yamt };
138 1.1.14.2 yamt
139 1.1.14.2 yamt
140 1.1.14.2 yamt
141 1.1.14.2 yamt struct unwind_desc_X3 {
142 1.1.14.2 yamt boolean_t r;
143 1.1.14.2 yamt u_int qp;
144 1.1.14.2 yamt boolean_t a;
145 1.1.14.2 yamt boolean_t b;
146 1.1.14.2 yamt u_int reg;
147 1.1.14.2 yamt vsize_t t;
148 1.1.14.2 yamt vsize_t offset;
149 1.1.14.2 yamt };
150 1.1.14.2 yamt
151 1.1.14.2 yamt struct unwind_desc_X4 {
152 1.1.14.2 yamt u_int qp;
153 1.1.14.2 yamt boolean_t x;
154 1.1.14.2 yamt boolean_t a;
155 1.1.14.2 yamt boolean_t b;
156 1.1.14.2 yamt u_int reg;
157 1.1.14.2 yamt boolean_t y;
158 1.1.14.2 yamt u_int treg;
159 1.1.14.2 yamt vsize_t t;
160 1.1.14.2 yamt };
161 1.1.14.2 yamt
162 1.1.14.2 yamt union unwind_desc {
163 1.1.14.2 yamt struct unwind_desc_R1 R1;
164 1.1.14.2 yamt struct unwind_desc_R2 R2;
165 1.1.14.2 yamt struct unwind_desc_R3 R3;
166 1.1.14.2 yamt
167 1.1.14.2 yamt struct unwind_desc_P1 P1;
168 1.1.14.2 yamt struct unwind_desc_P2 P2;
169 1.1.14.2 yamt struct unwind_desc_P3 P3;
170 1.1.14.2 yamt struct unwind_desc_P4 P4;
171 1.1.14.2 yamt struct unwind_desc_P5 P5;
172 1.1.14.2 yamt struct unwind_desc_P6 P6;
173 1.1.14.2 yamt struct unwind_desc_P7 P7;
174 1.1.14.2 yamt struct unwind_desc_P8 P8;
175 1.1.14.2 yamt struct unwind_desc_P9 P9;
176 1.1.14.2 yamt struct unwind_desc_P10 P10;
177 1.1.14.2 yamt
178 1.1.14.2 yamt struct unwind_desc_B1 B1;
179 1.1.14.2 yamt struct unwind_desc_B2 B2;
180 1.1.14.2 yamt struct unwind_desc_B3 B3;
181 1.1.14.2 yamt struct unwind_desc_B4 B4;
182 1.1.14.2 yamt
183 1.1.14.2 yamt struct unwind_desc_X1 X1;
184 1.1.14.2 yamt struct unwind_desc_X2 X2;
185 1.1.14.2 yamt struct unwind_desc_X3 X3;
186 1.1.14.2 yamt struct unwind_desc_X4 X4;
187 1.1.14.2 yamt };
188 1.1.14.2 yamt
189 1.1.14.2 yamt enum record_type {
190 1.1.14.2 yamt R1, R2, R3,
191 1.1.14.2 yamt P1, P2, P3, P4, P5, P6, P7, P8, P9, P10,
192 1.1.14.2 yamt B1, B2, B3, B4,
193 1.1.14.2 yamt X1, X2, X3, X4
194 1.1.14.2 yamt };
195 1.1.14.2 yamt
196 1.1.14.2 yamt
197 1.1.14.2 yamt /* A record chain is a decoded unwind descriptor.
198 1.1.14.2 yamt * It is usefull for post processing unwind descriptors.
199 1.1.14.2 yamt */
200 1.1.14.2 yamt
201 1.1.14.2 yamt struct recordchain {
202 1.1.14.2 yamt enum record_type type;
203 1.1.14.2 yamt union unwind_desc udesc;
204 1.1.14.2 yamt };
205 1.1.14.2 yamt
206 1.1.14.2 yamt
207 1.1.14.2 yamt
208 1.1.14.2 yamt /* Decode Function prototypes. */
209 1.1.14.2 yamt
210 1.1.14.2 yamt char *
211 1.1.14.2 yamt unwind_decode_ule128(char *buf, unsigned long *);
212 1.1.14.2 yamt char *
213 1.1.14.2 yamt unwind_decode_R1(char *buf, union unwind_desc *uwd);
214 1.1.14.2 yamt char *
215 1.1.14.2 yamt unwind_decode_R2(char *buf, union unwind_desc *uwd);
216 1.1.14.2 yamt char *
217 1.1.14.2 yamt unwind_decode_R3(char *buf, union unwind_desc *uwd);
218 1.1.14.2 yamt char *
219 1.1.14.2 yamt unwind_decode_P1(char *buf, union unwind_desc *uwd);
220 1.1.14.2 yamt char *
221 1.1.14.2 yamt unwind_decode_P2(char *buf, union unwind_desc *uwd);
222 1.1.14.2 yamt char *
223 1.1.14.2 yamt unwind_decode_P3(char *buf, union unwind_desc *uwd);
224 1.1.14.2 yamt char *
225 1.1.14.2 yamt unwind_decode_P4(char *buf, union unwind_desc *uwd, vsize_t len);
226 1.1.14.2 yamt char *
227 1.1.14.2 yamt unwind_decode_P5(char *buf, union unwind_desc *uwd);
228 1.1.14.2 yamt char *
229 1.1.14.2 yamt unwind_decode_P6(char *buf, union unwind_desc *uwd);
230 1.1.14.2 yamt char *
231 1.1.14.2 yamt unwind_decode_P7(char *buf, union unwind_desc *uwd);
232 1.1.14.2 yamt char *
233 1.1.14.2 yamt unwind_decode_P8(char *buf, union unwind_desc *uwd);
234 1.1.14.2 yamt char *
235 1.1.14.2 yamt unwind_decode_P9(char *buf, union unwind_desc *uwd);
236 1.1.14.2 yamt char *
237 1.1.14.2 yamt unwind_decode_P10(char *buf, union unwind_desc *uwd);
238 1.1.14.2 yamt char *
239 1.1.14.2 yamt unwind_decode_B1(char *buf, union unwind_desc *uwd);
240 1.1.14.2 yamt char *
241 1.1.14.2 yamt unwind_decode_B2(char *buf, union unwind_desc *uwd);
242 1.1.14.2 yamt char *
243 1.1.14.2 yamt unwind_decode_B3(char *buf, union unwind_desc *uwd);
244 1.1.14.2 yamt char *
245 1.1.14.2 yamt unwind_decode_B4(char *buf, union unwind_desc *uwd);
246 1.1.14.2 yamt char *
247 1.1.14.2 yamt unwind_decode_X1(char *buf, union unwind_desc *uwd);
248 1.1.14.2 yamt char *
249 1.1.14.2 yamt unwind_decode_X2(char *buf, union unwind_desc *uwd);
250 1.1.14.2 yamt char *
251 1.1.14.2 yamt unwind_decode_X3(char *buf, union unwind_desc *uwd);
252 1.1.14.2 yamt char *
253 1.1.14.2 yamt unwind_decode_X4(char *buf, union unwind_desc *uwd);
254 1.1.14.2 yamt
255 1.1.14.2 yamt
256 1.1.14.2 yamt
257 1.1.14.2 yamt
258 1.1.14.2 yamt
259 1.1.14.2 yamt
260