1 #include <stdio.h>
2 #include <byteswap.h>
3 #include "utils.h"
4 #include "subunit.h"
5
6 #if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
7 #define cpu_to_be32(x) bswap_32(x)
8 #define be32_to_cpu(x) bswap_32(x)
9 #define be16_to_cpup(x) bswap_16(*x)
10 #define cpu_to_be64(x) bswap_64(x)
11 #else
12 #define cpu_to_be32(x) (x)
13 #define be32_to_cpu(x) (x)
14 #define be16_to_cpup(x) (*x)
15 #define cpu_to_be64(x) (x)
16 #endif
17
18 #include "vphn.c"
19
20 static struct test {
21 char *descr;
22 long input[VPHN_REGISTER_COUNT];
23 u32 expected[VPHN_ASSOC_BUFSIZE];
24 } all_tests[] = {
25 {
26 "vphn: no data",
27 {
28 0xffffffffffffffff,
29 0xffffffffffffffff,
30 0xffffffffffffffff,
31 0xffffffffffffffff,
32 0xffffffffffffffff,
33 0xffffffffffffffff,
34 },
35 {
36 0x00000000
37 }
38 },
39 {
40 "vphn: 1 x 16-bit value",
41 {
42 0x8001ffffffffffff,
43 0xffffffffffffffff,
44 0xffffffffffffffff,
45 0xffffffffffffffff,
46 0xffffffffffffffff,
47 0xffffffffffffffff,
48 },
49 {
50 0x00000001,
51 0x00000001
52 }
53 },
54 {
55 "vphn: 2 x 16-bit values",
56 {
57 0x80018002ffffffff,
58 0xffffffffffffffff,
59 0xffffffffffffffff,
60 0xffffffffffffffff,
61 0xffffffffffffffff,
62 0xffffffffffffffff,
63 },
64 {
65 0x00000002,
66 0x00000001,
67 0x00000002
68 }
69 },
70 {
71 "vphn: 3 x 16-bit values",
72 {
73 0x800180028003ffff,
74 0xffffffffffffffff,
75 0xffffffffffffffff,
76 0xffffffffffffffff,
77 0xffffffffffffffff,
78 0xffffffffffffffff,
79 },
80 {
81 0x00000003,
82 0x00000001,
83 0x00000002,
84 0x00000003
85 }
86 },
87 {
88 "vphn: 4 x 16-bit values",
89 {
90 0x8001800280038004,
91 0xffffffffffffffff,
92 0xffffffffffffffff,
93 0xffffffffffffffff,
94 0xffffffffffffffff,
95 0xffffffffffffffff,
96 },
97 {
98 0x00000004,
99 0x00000001,
100 0x00000002,
101 0x00000003,
102 0x00000004
103 }
104 },
105 {
106 /* Parsing the next 16-bit value out of the next 64-bit input
107 * value.
108 */
109 "vphn: 5 x 16-bit values",
110 {
111 0x8001800280038004,
112 0x8005ffffffffffff,
113 0xffffffffffffffff,
114 0xffffffffffffffff,
115 0xffffffffffffffff,
116 0xffffffffffffffff,
117 },
118 {
119 0x00000005,
120 0x00000001,
121 0x00000002,
122 0x00000003,
123 0x00000004,
124 0x00000005
125 }
126 },
127 {
128 /* Parse at most 6 x 64-bit input values */
129 "vphn: 24 x 16-bit values",
130 {
131 0x8001800280038004,
132 0x8005800680078008,
133 0x8009800a800b800c,
134 0x800d800e800f8010,
135 0x8011801280138014,
136 0x8015801680178018
137 },
138 {
139 0x00000018,
140 0x00000001,
141 0x00000002,
142 0x00000003,
143 0x00000004,
144 0x00000005,
145 0x00000006,
146 0x00000007,
147 0x00000008,
148 0x00000009,
149 0x0000000a,
150 0x0000000b,
151 0x0000000c,
152 0x0000000d,
153 0x0000000e,
154 0x0000000f,
155 0x00000010,
156 0x00000011,
157 0x00000012,
158 0x00000013,
159 0x00000014,
160 0x00000015,
161 0x00000016,
162 0x00000017,
163 0x00000018
164 }
165 },
166 {
167 "vphn: 1 x 32-bit value",
168 {
169 0x00000001ffffffff,
170 0xffffffffffffffff,
171 0xffffffffffffffff,
172 0xffffffffffffffff,
173 0xffffffffffffffff,
174 0xffffffffffffffff
175 },
176 {
177 0x00000001,
178 0x00000001
179 }
180 },
181 {
182 "vphn: 2 x 32-bit values",
183 {
184 0x0000000100000002,
185 0xffffffffffffffff,
186 0xffffffffffffffff,
187 0xffffffffffffffff,
188 0xffffffffffffffff,
189 0xffffffffffffffff
190 },
191 {
192 0x00000002,
193 0x00000001,
194 0x00000002
195 }
196 },
197 {
198 /* Parsing the next 32-bit value out of the next 64-bit input
199 * value.
200 */
201 "vphn: 3 x 32-bit values",
202 {
203 0x0000000100000002,
204 0x00000003ffffffff,
205 0xffffffffffffffff,
206 0xffffffffffffffff,
207 0xffffffffffffffff,
208 0xffffffffffffffff
209 },
210 {
211 0x00000003,
212 0x00000001,
213 0x00000002,
214 0x00000003
215 }
216 },
217 {
218 /* Parse at most 6 x 64-bit input values */
219 "vphn: 12 x 32-bit values",
220 {
221 0x0000000100000002,
222 0x0000000300000004,
223 0x0000000500000006,
224 0x0000000700000008,
225 0x000000090000000a,
226 0x0000000b0000000c
227 },
228 {
229 0x0000000c,
230 0x00000001,
231 0x00000002,
232 0x00000003,
233 0x00000004,
234 0x00000005,
235 0x00000006,
236 0x00000007,
237 0x00000008,
238 0x00000009,
239 0x0000000a,
240 0x0000000b,
241 0x0000000c
242 }
243 },
244 {
245 "vphn: 16-bit value followed by 32-bit value",
246 {
247 0x800100000002ffff,
248 0xffffffffffffffff,
249 0xffffffffffffffff,
250 0xffffffffffffffff,
251 0xffffffffffffffff,
252 0xffffffffffffffff
253 },
254 {
255 0x00000002,
256 0x00000001,
257 0x00000002
258 }
259 },
260 {
261 "vphn: 32-bit value followed by 16-bit value",
262 {
263 0x000000018002ffff,
264 0xffffffffffffffff,
265 0xffffffffffffffff,
266 0xffffffffffffffff,
267 0xffffffffffffffff,
268 0xffffffffffffffff
269 },
270 {
271 0x00000002,
272 0x00000001,
273 0x00000002
274 }
275 },
276 {
277 /* Parse a 32-bit value split accross two consecutives 64-bit
278 * input values.
279 */
280 "vphn: 16-bit value followed by 2 x 32-bit values",
281 {
282 0x8001000000020000,
283 0x0003ffffffffffff,
284 0xffffffffffffffff,
285 0xffffffffffffffff,
286 0xffffffffffffffff,
287 0xffffffffffffffff
288 },
289 {
290 0x00000003,
291 0x00000001,
292 0x00000002,
293 0x00000003,
294 0x00000004,
295 0x00000005
296 }
297 },
298 {
299 /* The lower bits in 0x0001ffff don't get mixed up with the
300 * 0xffff terminator.
301 */
302 "vphn: 32-bit value has all ones in 16 lower bits",
303 {
304 0x0001ffff80028003,
305 0xffffffffffffffff,
306 0xffffffffffffffff,
307 0xffffffffffffffff,
308 0xffffffffffffffff,
309 0xffffffffffffffff
310 },
311 {
312 0x00000003,
313 0x0001ffff,
314 0x00000002,
315 0x00000003
316 }
317 },
318 {
319 /* The following input doesn't follow the specification.
320 */
321 "vphn: last 32-bit value is truncated",
322 {
323 0x0000000100000002,
324 0x0000000300000004,
325 0x0000000500000006,
326 0x0000000700000008,
327 0x000000090000000a,
328 0x0000000b800c2bad
329 },
330 {
331 0x0000000c,
332 0x00000001,
333 0x00000002,
334 0x00000003,
335 0x00000004,
336 0x00000005,
337 0x00000006,
338 0x00000007,
339 0x00000008,
340 0x00000009,
341 0x0000000a,
342 0x0000000b,
343 0x0000000c
344 }
345 },
346 {
347 "vphn: garbage after terminator",
348 {
349 0xffff2bad2bad2bad,
350 0x2bad2bad2bad2bad,
351 0x2bad2bad2bad2bad,
352 0x2bad2bad2bad2bad,
353 0x2bad2bad2bad2bad,
354 0x2bad2bad2bad2bad
355 },
356 {
357 0x00000000
358 }
359 },
360 {
361 NULL
362 }
363 };
364
test_one(struct test * test)365 static int test_one(struct test *test)
366 {
367 __be32 output[VPHN_ASSOC_BUFSIZE] = { 0 };
368 int i, len;
369
370 vphn_unpack_associativity(test->input, output);
371
372 len = be32_to_cpu(output[0]);
373 if (len != test->expected[0]) {
374 printf("expected %d elements, got %d\n", test->expected[0],
375 len);
376 return 1;
377 }
378
379 for (i = 1; i < len; i++) {
380 u32 val = be32_to_cpu(output[i]);
381 if (val != test->expected[i]) {
382 printf("element #%d is 0x%x, should be 0x%x\n", i, val,
383 test->expected[i]);
384 return 1;
385 }
386 }
387
388 return 0;
389 }
390
test_vphn(void)391 static int test_vphn(void)
392 {
393 static struct test *test;
394
395 for (test = all_tests; test->descr; test++) {
396 int ret;
397
398 ret = test_one(test);
399 test_finish(test->descr, ret);
400 if (ret)
401 return ret;
402 }
403
404 return 0;
405 }
406
main(int argc,char ** argv)407 int main(int argc, char **argv)
408 {
409 return test_harness(test_vphn, "test-vphn");
410 }
411